【问题标题】:Combining Bar and Line chart (double axis) in ggplot2在ggplot2中组合条形图和折线图(双轴)
【发布时间】:2017-06-05 11:33:19
【问题描述】:

我有Excel 制作的double-y-axis 图表。在 Excel 中,它只需要基本技能。我想做的是使用R 中的ggplot2 库复制此图表。

我已经这样做了,但我需要在2nd-y-axis 上绘制响应。

附上我使用过的可重现代码:

#Data generation
Year <- c(2014, 2015, 2016)
Response <- c(1000, 1100, 1200)
Rate <- c(0.75, 0.42, 0.80)

df <- data.frame(Year, Response, Rate)

#Chart
library(ggplot2)

ggplot(df)  + 
  geom_bar(aes(x=Year, y=Response),stat="identity", fill="tan1", colour="sienna3")+
  geom_line(aes(x=Year, y=Rate),stat="identity")+
  geom_text(aes(label=Rate, x=Year, y=Rate), colour="black")+
  geom_text(aes(label=Response, x=Year, y=0.9*Response), colour="black")

【问题讨论】:

    标签: r ggplot2 bar-chart linechart yaxis


    【解决方案1】:

    首先,将Rate 缩放Rate*max(df$Response) 并修改响应文本的0.9 比例。

    其次,通过scale_y_continuous(sec.axis=...) 包含第二个轴:

    ggplot(df)  + 
        geom_bar(aes(x=Year, y=Response),stat="identity", fill="tan1", colour="sienna3")+
        geom_line(aes(x=Year, y=Rate*max(df$Response)),stat="identity")+
        geom_text(aes(label=Rate, x=Year, y=Rate*max(df$Response)), colour="black")+
        geom_text(aes(label=Response, x=Year, y=0.95*Response), colour="black")+
        scale_y_continuous(sec.axis = sec_axis(~./max(df$Response)))
    

    产量:

    【讨论】:

    • 您好,如何更改辅助 y 轴的限制?我正在尝试使用百分比(已经乘以 100)创建一个类似的图表,并且辅助图表上的比例不合适。谢谢!
    • 我遇到了和@user3047435一样的问题。我尝试过的很多事情都弄乱了缩放比例,例如速率是正确的,但响应被抛出。最终,我最终将原始百分比降低到除以 100,然后在缩放中再次乘以,如下所示:scale_y_continuous(sec.axis = sec_axis(~./max(df$Response)*100))
    【解决方案2】:

    使用语法 label=scales::percent 将辅助轴变为百分比: Click Here for Output

    library(ggplot2)
    ggplot(df)  + 
      geom_bar(aes(x=Year, y=Response),stat="identity", fill="tan1", 
      colour="sienna3")+
      geom_line(aes(x=Year, y=Rate*max(df$Response)),stat="identity")+
      geom_text(aes(label=Rate, x=Year, y=Rate*max(df$Response)), colour="black")+
      geom_text(aes(label=Response, x=Year, y=0.95*Response), colour="black")+
      scale_y_continuous(sec.axis = sec_axis(~./max(df$Response),label=scales::percent))
    

    【讨论】: