How to use sec_axis() for discrete data in ggplot2 R?

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

I have discreet data that looks like this:

height <- c(1,2,3,4,5,6,7,8) weight <- c(100,200,300,400,500,600,700,800) person <- c("Jack","Jim","Jill","Tess","Jack","Jim","Jill","Tess") set <- c(1,1,1,1,2,2,2,2) dat <- data.frame(set,person,height,weight) 

I'm trying to plot a graph with same x-axis(person), and 2 different y-axis (weight and height). All the examples, I find is trying to plot the secondary axis (sec_axis), or discreet data using base plots. Is there an easy way to use sec_axis for discreet data on ggplot2? Edit: Someone in the comments suggested I try the suggested reply. However, I run into this error now

Here is my current code:

p1 <- ggplot(data = dat, aes(x = person, y = weight)) +    geom_point(color = "red") + facet_wrap(~set, scales="free")  p2 <- p1 + scale_y_continuous("height",sec_axis(~.*1.2, name="height")) p2  I get the error: Error in x < range[1] :    comparison (3) is possible only for atomic and list types 

Alternately, now I have modified the example to match this example posted.

p <- ggplot(dat, aes(x = person)) p <- p + geom_line(aes(y = height, colour = "Height"))  # adding the relative weight data, transformed to match roughly the range of the height p <- p + geom_line(aes(y = weight/100, colour = "Weight"))  # now adding the secondary axis, following the example in the help file ?scale_y_continuous # and, very important, reverting the above transformation p <- p + scale_y_continuous(sec.axis = sec_axis(~.*100, name = "Relative weight [%]"))  # modifying colours and theme options p <- p + scale_colour_manual(values = c("blue", "red")) p <- p + labs(y = "Height [inches]",               x = "Person",               colour = "Parameter") p <- p + theme(legend.position = c(0.8, 0.9))+ facet_wrap(~set, scales="free")  p 

I get an error that says

"geom_path: Each group consists of only one observation. Do you need to   adjust the group aesthetic?" 

I get the template, but no points get plotted

回答1:

R function arguments are fed in by position if argument names are not specified explicitly. As mentioned by @Z.Lin in the comments, you need sec.axis= before your sec_axis function to indicate that you are feeding this function into the sec.axis argument of scale_y_continuous. If you don't do that, it will be fed into the second argument of scale_y_continuous, which by default, is breaks=. The error message is thus related to you not feeding in an acceptable data type for the breaks argument:

p1 <- ggplot(data = dat, aes(x = person, y = weight)) +    geom_point(color = "red") + facet_wrap(~set, scales="free")  p2 <- p1 + scale_y_continuous("weight", sec.axis = sec_axis(~.*1.2, name="height")) p2 

The first argument (name=) of scale_y_continuous is for the first y scale, where as the sec.axis= argument is for the second y scale. I changed your first y scale name to correct that.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!