R 如何使用ggplot2在次轴上使用反向条形图绘制多个时间序列?

R 如何使用ggplot2在次轴上使用反向条形图绘制多个时间序列?,r,ggplot2,R,Ggplot2,我有一个数据框,有四列,如下所示(这里我只放了实际数据框的标题): 以下是我的预期输出: 编辑:此外,如何插入与每条线路(即Obs、Sim和Rain)相对应的图例?以下是使用geom\u rect的方法 计算主轴和副轴最大值之间的比率 存储次反转轴的最大值 使用ymin作为最大值减去值乘以比率绘制矩形 将次轴刻度设置为最大值减去值除以比率 我添加了一个BottomOffset参数,如果您想在次轴的底部留出一些额外的空间,可以对其进行调整。我还继续添加了代码来更改轴的颜色 编辑:现在使用

我有一个数据框,有四列,如下所示(这里我只放了实际数据框的标题):

以下是我的预期输出:


编辑:此外,如何插入与每条线路(即Obs、Sim和Rain)相对应的图例?

以下是使用
geom\u rect
的方法

  • 计算主轴和副轴最大值之间的比率

  • 存储次反转轴的最大值

  • 使用
    ymin
    作为最大值减去值乘以比率绘制矩形

  • 将次轴刻度设置为最大值减去值除以比率

  • 我添加了一个
    BottomOffset
    参数,如果您想在次轴的底部留出一些额外的空间,可以对其进行调整。我还继续添加了代码来更改轴的颜色

    编辑:现在使用图例

    Ratio <- max(c(df$Obs, df$Sim), na.rm = TRUE) / max(df$Rain)
    RainMax <- max(df$Rain,na.rm = TRUE)
    BottomOffset <- 0.05
    
    ggplot(df, aes(x=as.Date(Date))) + 
      geom_line(aes(y=Obs, color="1")) +
      geom_line(aes(y=Sim, color="2")) +
      geom_rect(aes(xmin=as.Date(Date) - 0.1,
                    xmax = as.Date(Date) + 0.1,
                    ymin = (BottomOffset + RainMax - Rain) * Ratio,
                    ymax = (BottomOffset + RainMax) * Ratio,
                    color = "3"),
                fill = "red", show.legend=FALSE) + 
      geom_hline(yintercept = (BottomOffset + RainMax) * Ratio, color = "red") +
      geom_hline(yintercept = 0, color = "black") +
      labs(x = "Date", color = "Variable") +
      scale_y_continuous(name = expression('Soil moisture, m'^"3"*' m'^"-3"), 
                         sec.axis = sec_axis(~ BottomOffset + RainMax  - . / Ratio, name = "Precipitation (inch)"),
                         expand = c(0,0)) +
      scale_color_manual(values = c("1" = "blue", "2" = "green", "3" = "red"),
                         labels = c("1" = "Obs", "2" = "Sim", "3"= "Rain")) +
      theme(axis.line.y.right = element_line(color = "red"), 
            axis.ticks.y.right = element_line(color = "red"),
            axis.text.y.right = element_text(color = "red"),
            axis.title.y.right = element_text(color = "red"),
            axis.line.y.left = element_line(color = "blue"), 
            axis.ticks.y.left = element_line(color = "blue"),
            axis.text.y.left = element_text(color = "blue"),
            axis.title.y.left = element_text(color = "blue"),
            legend.position = "bottom")
    

    Ratio您还可以制作两个单独的绘图,并将它们叠加在一起。这对那些不喜欢使用双轴图的人(包括我自己)是有用的

    库(tidyverse)
    图书馆(lubridate)
    图书馆(比例尺)
    df%
    枢轴_(日期),
    name_to='key',
    值(到='value')
    
    土壤水分图
    sm1%过滤器(键='Rain'),
    aes(x=日期,y=值,
    组=键,
    形状=键,
    线型=键,
    col=键)+
    xlab(“”)+
    ylab(表示法(‘土壤湿度,m’^“3”*‘m’^“-3”))+
    几何尺寸线(lwd=0.5)+
    几何点(尺寸=3,α=0.6)+
    比例\颜色\制浆机(“,调色板='Dark2')+
    比例\线型\手动(“,值=c(NA,'实心'))+
    比例\形状\手册(“,值=c(19,NA))+
    主题宽度(基本尺寸=16)+
    主题(legend.position=“底部”)+
    主题(panel.border=element_blank(),
    panel.grid.minor=元素_blank(),
    axis.line=元素_line())+
    主题(axis.title.x=element\u blank())+
    主题(legend.key.size=单位(3,‘线’)+
    辅助线(颜色=辅助线\图例(override.aes=列表)(线型=c(NA,1),
    α=1.0,
    形状=c(19,NA)),
    nrow=1,byrow=TRUE)
    
    降水图
    prec_long%
    过滤器(键=='Rain')%>%
    重命名(降水量=匹配(“雨”))
    
    maxPrec@Campbell-如何在上面的图中插入对应于每条线(即Obs、Sim和Rain)的图例?您可以查看
    facet\u网格
    ,或者将它们与
    ggpubr::ggarrange
    补丁
    包相结合。我认为这可能是一个新问题,因为它显著地扩展了范围。@Campbell-如果我想在一页上放置多个带有常见x和y标签以及常见图例的绘图(例如四个绘图),如何使用上述代码?另外,我们如何在每个绘图的左下角插入文本(例如“test1”、“test2”、“test3”、“test4”),特别是当x轴是datetime时?我建议使用按钮发布一个新问题。包括您的示例数据、您使用此答案开发的代码、指向此问题的链接,并清楚地指出您在使用模型时遇到的困难。今晚我没有时间看,但其他人可能会看。这给了我更多的自由来改变每个单独的情节面板。谢谢
    ggplot(df, aes(x=as.Date(Date))) + 
      geom_line(aes(y=Obs, color="red")) +
      geom_line(aes(y=Sim, color="green")) +
      geom_bar(mapping = aes(y = Rain), stat = "identity") +
      scale_y_continuous(name = expression('Soil moisture, m'^"3"*' m'^"-3"), 
                         sec.axis = sec_axis(~ 3 - .*0.5, name = "Precipitation (inch)")) 
    
    Ratio <- max(c(df$Obs, df$Sim), na.rm = TRUE) / max(df$Rain)
    RainMax <- max(df$Rain,na.rm = TRUE)
    BottomOffset <- 0.05
    
    ggplot(df, aes(x=as.Date(Date))) + 
      geom_line(aes(y=Obs, color="1")) +
      geom_line(aes(y=Sim, color="2")) +
      geom_rect(aes(xmin=as.Date(Date) - 0.1,
                    xmax = as.Date(Date) + 0.1,
                    ymin = (BottomOffset + RainMax - Rain) * Ratio,
                    ymax = (BottomOffset + RainMax) * Ratio,
                    color = "3"),
                fill = "red", show.legend=FALSE) + 
      geom_hline(yintercept = (BottomOffset + RainMax) * Ratio, color = "red") +
      geom_hline(yintercept = 0, color = "black") +
      labs(x = "Date", color = "Variable") +
      scale_y_continuous(name = expression('Soil moisture, m'^"3"*' m'^"-3"), 
                         sec.axis = sec_axis(~ BottomOffset + RainMax  - . / Ratio, name = "Precipitation (inch)"),
                         expand = c(0,0)) +
      scale_color_manual(values = c("1" = "blue", "2" = "green", "3" = "red"),
                         labels = c("1" = "Obs", "2" = "Sim", "3"= "Rain")) +
      theme(axis.line.y.right = element_line(color = "red"), 
            axis.ticks.y.right = element_line(color = "red"),
            axis.text.y.right = element_text(color = "red"),
            axis.title.y.right = element_text(color = "red"),
            axis.line.y.left = element_line(color = "blue"), 
            axis.ticks.y.left = element_line(color = "blue"),
            axis.text.y.left = element_text(color = "blue"),
            axis.title.y.left = element_text(color = "blue"),
            legend.position = "bottom")