使用ggplot绘制一个带有两个y轴的图表

5

我正在尝试将几个数据框编译成一个图形。对于我的x值,我有天数,对于y值,我有某些事件发生的频率。

我的问题是,其中一个数据框(df3)的范围从0到3,而其他数据框的范围从0到50。

虚拟数据框:

day<-c(1,2,3)
b<-c(23,44,22)
c<-c(12,35,49)
d<-c(1,1,3)

df1<-data.frame(day,b)
df2<-data.frame(day,c)
df3<-data.frame(day,d)


ggplot()+ 
  geom_line(data=df1, aes(x=day, y=df1$`b`), color="red") +
  geom_line(data=df2, aes(x=day, y=df2$`c` ), color="green")+
  geom_line(data=df3, aes(x=day, y=df3$`d` ), color="blue")+
  labs(x="Days", y="Number of occurrences")

这很好用,但我想为df1和df2创建一个不同的刻度,另外为df3创建一个刻度。
更新:
我正在尝试这样做,但它会覆盖之前的刻度:
d<-ggplot()+ 
  geom_line(data=df1, aes(x=day, y=df1$`a`), color="red") +
  geom_line(data=df2, aes(x=day, y=df2$`b` ), color="green")+
  scale_y_continuous(limits=c(0, 50))+
  labs(x="Days", y="Number of occurrences")

d+geom_line(data=df3, aes(x=day, y=df3$`c` ), color="blue")+
  scale_y_continuous(limits=c(0, 3))

你可以使用gridExtra包通过facetting将三个图形放在一个图中。 - LAP
1个回答

4
我认为您可以使用ggplot2sec.axis参数来实现这一点:
    d<-ggplot()+ 
      geom_line(data=df1, aes(x=day, y=df1$`1`), color="red") +
      geom_line(data=df2, aes(x=day, y=df2$`1` ), color="green")+
      scale_y_continuous(limits=c(0, 50))+
      labs(x="Days", y="Number of occurrences")
    
    d+geom_line(data=df3, aes(x=day, y=df3$`1` ), color="blue")+
      scale_y_continuous(limits=c(0, 3),
           sec.axis = sec_axis(~ . *scale_of_the_new_axis, name = "name of the new axis")
      )

请注意,我在您的代码中添加了这一行:
    sec.axis = sec_axis(~ . *scale_of_the_new_axis, name = "name of the new axis")

编辑:

我对df3的数据进行了转换,然后应用了转换的逆过程,以便将df3的实际值反映在新轴上。

ggplot()+ 
        geom_line(data=df1, aes(x=day, y=b), color="red") +
        geom_line(data=df2, aes(x=day, y=c ), color="green")+
        geom_line(data=df3, aes(x=day, y=d*50/3), color="blue")+
        scale_y_continuous(limits=c(0, 50), 
                           sec.axis = sec_axis(~ . *3/50, name = "name of the new axis"))+
        labs(x="Days", y="Number of occurrences")

这是翻译的结果:

结果如下:

输入图像描述

如果这是您需要的,请告诉我。


我看到了,但是文档中说它需要一个转换参数,但它并不是一个转换,只是不同的值... - L8call
你能提供一下你的数据样本吗?这样我可以给你提供更好的解决方案。请使用 dput(df3)dput(df1) 或者 dput(df2) - Random Cotija
我已经添加了一些虚拟数据集,因为我无法提供真实的数据集 @Riverarodrigoa - L8call
我更新了我的回答,请告诉我这是否是您想要的。 - Random Cotija
请问,我们该如何为这个图添加图例? - ah bon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接