如何在ggplot2的右侧放置转换后的比例?

Bom*_*hof 19 r ggplot2

我正在创建一个图表,显示湖水位随时间的变化.我在下面附上了一个简单的例子.我想在图的右侧添加一个刻度(刻度线和注释),以英尺为单位显示高程.我知道ggplot2不会允许两个不同的比例(参见2 y轴的绘图,左边的一个y轴,右边的另一个y轴),但因为这是相同比例的转换,有没有办法做这个?我更喜欢继续使用ggplot2而不必恢复到plot()函数.

library(ggplot2)
LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
p <- ggplot(data=LakeLevels) + geom_line(aes(x=Day,y=Elevation)) + 
  scale_y_continuous(name="Elevation (m)",limits=c(75,125)) 
p
Run Code Online (Sandbox Code Playgroud)

Wal*_*ter 16

你应该看一下这个链接http://rpubs.com/kohske/dual_axis_in_ggplot2.

我已经根据你的例子调整了那里提供的代码.这个修复看起来非常"hacky",但它会让你成为那里的一部分.剩下的唯一部分是弄清楚如何将文本添加到图表的右轴.

    library(ggplot2)
    library(gtable)
    library(grid)
    LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
    p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Day,y=Elevation)) + 
          scale_y_continuous(name="Elevation (m)",limits=c(75,125))

    p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Day, y=Elevation))+
        scale_y_continuous(name="Elevation (ft)", limits=c(75,125),           
        breaks=c(80,90,100,110,120),
                 labels=c("262", "295", "328", "361", "394"))

    #extract gtable
    g1<-ggplot_gtable(ggplot_build(p1))
    g2<-ggplot_gtable(ggplot_build(p2))

    #overlap the panel of the 2nd plot on that of the 1st plot

    pp<-c(subset(g1$layout, name=="panel", se=t:r))
    g<-gtable_add_grob(g1, g2$grobs[[which(g2$layout$name=="panel")]], pp$t, pp$l, pp$b, 
                       pp$l)

   ia <- which(g2$layout$name == "axis-l")
   ga <- g2$grobs[[ia]]
   ax <- ga$children[[2]]
   ax$widths <- rev(ax$widths)
   ax$grobs <- rev(ax$grobs)
   ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
   g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
   g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)

   # draw it
   grid.draw(g)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


tim*_*tim 5

我可能已经找到了一个放置轴标题的解决方案,其中有一些来自Nate Pope答案的想法可以在这里找到:
ggplot2:绘图上添加二次转换的x轴
和关于在gtable中访问grobs的讨论: https:/ /groups.google.com/forum/m/#!topic/ggplot2-dev/AVHHcYqc5uU

最后,我刚刚添加了该行

g <- gtable_add_grob(g, g2$grob[[7]], pp$t, length(g$widths), pp$b)
Run Code Online (Sandbox Code Playgroud)

在打电话之前grid.draw(g),这似乎可以解决问题.
据我所知,它采用y轴标题g2$grob[[7]]并将其置于最右侧.它可能不是美妙的解决方案,但它对我有用.

最后一件事.找到一种旋转轴标题的方法会很不错.

问候,

蒂姆


归档时间:

查看次数:

15623 次

最近记录:

11 年,1 月 前