【问题标题】:Multiple y axis for bar plot and line graph using ggplot使用ggplot的条形图和折线图的多个y轴
【发布时间】:2017-12-24 22:29:18
【问题描述】:

我有一些来自实验的蒸腾数据,我想在使用 R 的折线图上显示为时间序列。我还有一些降水数据,我想在同一张图上显示为条形图。我已经能够使用 R 的基本程序来做到这一点,但我想在 ggplot 中做到这一点。我到处搜索,我知道设计师不太喜欢用这种方式制作图表,所以这很困难,但我已经看到它使用两个 y 轴使用多个折线图/散点图完成。可以用折线图和条形图来做吗?

这是我在基本 R 中的内容

这是我用来制作情节的数据

Time series data here

Rainfall data here

这是上图的代码。

 attach(summary)
library(Hmisc)
library(scales)
par(mar=c(6.5,4,4,5)+.1)
plot(summary$dates,summary$c_mean_am,type="n",ylim=c(100,350),
     main="Stomatal Conductance during experiment",las=1,cex.main=1,
     font.lab=2,font.axis=2,cex.axis=0.7,cex.lab=0.8,
     ylab=expression('Stomatal conductance'~(m~mol~ m^{2})),,xlab="Date")
lines(dates,c_mean_am,pch=21,cex=0.6,bg="blue",col="blue")
lines(dates,T1_mean_am,pch=21,cex=0.6,bg="yellow",col="yellow")
lines(dates,T2_mean_am,pch=21,cex=0.6,bg="hotpink1",col="hotpink1")
lines(dates,T3_mean_am,pch=21,cex=0.6,bg="orange",col="orange")
lines(dates,T4_mean_am,pch=21,cex=0.6,bg="red",col="red")
with (data = summary  , expr = errbar(dates, c_mean_am, 
                                      c_mean_am+c_se_am, 
                                      c_mean_am-c_se_am, 
                                      add=T, pch=21,col="blue",bg="blue",
                                      cex=0.6,cap=0.01,errbar.col="blue"))
with (data = summary  , expr = errbar(dates, T1_mean_am, 
                                      T1_mean_am+T1_se_am, 
                                      T1_mean_am-T1_se_am, add=T, 
                                      pch=21,col="yellow",bg="yellow",
                                      cex=0.6,cap=0.01,errbar.col="yellow"))
with (data = summary  , expr = errbar(dates, T2_mean_am, 
                                      T2_mean_am+T2_se_am, 
                                      T2_mean_am-T2_se_am, 
                                      add=T, pch=21,col="hotpink1",
                                      bg="hotpink1",cex=0.6,cap=0.01,
                                      errbar.col="hotpink1"))
with (data = summary  , expr = errbar(dates, T3_mean_am, 
                                      T3_mean_am+T3_se_am, 
                                      T3_mean_am-T3_se_am, 
                                      add=T, pch=21,col="orange",
                                      bg="orange",cex=0.6,cap=0.01,
                                      errbar.col="orange"))
with (data = summary  , expr = errbar(dates, T4_mean_am, 
                                      T4_mean_am+T4_se_am, 
                                      T4_mean_am-T4_se_am, add=T, 
                                      pch=21,col="red",bg="red",
                                      cex=0.6,cap=0.01,errbar.col="red"))
data2<-Rainfall
names(data2)
par(new=TRUE)
graph<-tapply(data2$`daily rainfall`,data2$DATE,I)
barplot(graph,col="light blue",border=NA,xaxt="n",yaxt="n",xlab="",ylab="",ylim=c(0,150))
axis(4,las="1",cex.axis=0.7,font.axis=2)
mtext("Rainfall (mm)",side=4,line=3,font=2,cex=0.8)

这是 ggplot 时间序列图和 the same data 的格式略有不同。

这是代码

dt<-am_means
attach(dt)
dt$dates <- as.Date(dt$dates,format = "%d/%m/%y")
sp<-ggplot(dt,aes(x=dates,y=cond,colour=Treatment,group=Treatment))+geom_errorbar
(aes(ymin=cond-err,ymax=cond+err),width=0.5,size=0.5)+geom_line()+geom_point()+scale_x_date
(date_breaks = "2 weeks",date_minor_breaks = "1 week",date_labels = "%b %d")

sp2<-sp + scale_color_manual(breaks = c("Control", "T1","T2","T3","T4"),
values=c("blue", "yellow","hotpink1","orange","red"))

print(sp2 +ylim(100, 350)+labs(title= "Stomatal Conductance - Tamata Maples", 
y=expression(Conductance (m~mol~m^{-2})), x = "Date"))

我可以在同一个 ggplot 折线图上绘制降雨条图吗????

【问题讨论】:

    标签: r ggplot2 bar-chart yaxis


    【解决方案1】:

    herehere 中的很好的示例所述,从ggplot2 的2.2.0 版开始,可以添加secondary axis

    可以试试这个:

    ggplot准备提供的数据:

    # Read data from OP's DropBox links
    am_means <- read.csv("https://www.dropbox.com/s/z4dl0jfslhqccb8/am_means.csv?dl=1")
    rainfall <- read.csv("https://www.dropbox.com/s/vkv9vm5o93ttk1i/Rainfall.csv?dl=1")
    
    am_means$dates <- as.Date(am_means$dates, format = "%d/%m/%Y")
    rainfall$DATE <- as.Date(rainfall$DATE,format = "%d/%m/%Y")
    
    # join the two tables
    my_data_all <- merge(x = am_means,
                         y = rainfall,
                         by.x = "dates",
                         by.y = "DATE",
                         all = TRUE)
    
    # use data between desired date interval (rainfall had some extra dates)
    require(data.table)
    setDT(my_data_all)
    my_data <- my_data_all[dates %between% c("2017-01-31", "2017-04-06")]
    

    使用次要 OY 轴绘图:

    转换出现在 2nd OY(右侧)上的数据很重要。由于最大值比第一个 OY 轴(左侧)的数据小约 2 倍,因此可以乘以 2。

    my_factor <- 2
    my_plot <- ggplot(my_data, 
                      aes(x = dates,
                          group = Treatment)) +
        geom_errorbar(aes(ymin = cond - err,
                          ymax = cond + err,
                          colour = Treatment),
                      width = 0.5,
                      size  = 0.5) +
        geom_line(aes(y = cond, colour = Treatment)) + 
        geom_point(aes(y = cond, colour = Treatment)) +
        # here the factor is applied 
        geom_bar(aes(y = daily.rainfall * my_factor), 
                 fill = "light blue",
                 stat = "identity")
    my_plot
    

    scale_y_continuous 添加第二个OY 轴。 注意转换回来。如果上面我们乘以 2,现在我们将数据除以 2:

    my_plot <- my_plot + scale_y_continuous(sec.axis = sec_axis(trans = ~ . / my_factor, 
                                                                name = "Rainfall (mm)"))
    

    继续 OP 的代码

    my_plot <- my_plot + scale_x_date(date_breaks = "2 weeks",
                                      date_minor_breaks = "1 week",
                                      date_labels = "%b %d") + 
        scale_color_manual(breaks = c("Control", "T1", "T2", "T3", "T4"),
                           values = c("blue", "yellow", "hotpink1", "orange", "red")) +
        labs(title = "Stomatal Conductance - Tamata Maples", 
             y = expression(Conductance (m~mol~m^{-2})), 
             x = "Date") +
        theme_bw()
    my_plot
    

    其他一些相关回答问题:adding a cumulative curvecombining Bar and Line chart

    【讨论】:

      【解决方案2】:

      ggplot 中不提供多轴,它是包的创建者 Hadley Wickham 的选择。你就是做不到。

      来源:https://stackoverflow.com/a/3101876/8031980

      【讨论】:

      • 这不是答案。这是一个评论。总有一种解决方法。
      猜你喜欢
      • 2019-05-24
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多