在 ggplot 上使用分组(闪避)条显示多条线

Displaying multiple lines on ggplot with grouped (dodged) bars

我有数据需要在同一个图表上以条形和折线形式显示。我一直在遵循 https://r-charts.com/evolution/line-graph-multiple-lines-ggplot2/ and https://aledemogr.com/2017/05/29/plots-based-on-un-data-in-r/ 的指导,它们都表明数据应该是“长”格式,其中所有值都在同一列中,变量类型在另一列中,而不是每个变量都有它的自己的专栏。

它几乎可以工作,但不完全是。结果是:

如果我从下面的 ggplot 命令中注释掉 geom_line(),则 V1 和 V2 条(橙色和绿色)会在图表和图例中正确显示。如果我注释掉 geom_col(),则 V3 和 V4 线会在图形和图例中正确显示。但是,当我同时包含这两个命令时,ggplot 会在条形图周围放置边框,并将所有变量与图例中的线条组合在一起。这两条线本身在组合图上是可以的,除了我稍后会玩颜色。

关于如何移除条形图周围的彩色边框并将线条限制为仅 V3 和 V4 有什么想法吗?如果您删除“geom_line()”命令(无边框),我对条形图的期望结果是它们的外观,按原样显示的线条,以及总共有四个条目的图例:两个带有标记为“V1”和“V2”的条形图以及标记为“V3”和“V4”的简单线条的条目。

代码如下:

mydata <- data.frame(month=c(2,2,2,2,2,2,2,2,6,6,6,6,6,6,6,6,
                             10,10,10,10,10,10,10,10),
                   year=c(2016,2016,2016,2016,2017,2017,2017,2017,
                          2016,2016,2016,2016,2017,2017,2017,2017,
                          2016,2016,2016,2016,2017,2017,2017,2017),
                   var_type=c("V1","V2","V3","V4","V1","V2","V3","V4",
                              "V1","V2","V3","V4","V1","V2","V3","V4",
                              "V1","V2","V3","V4","V1","V2","V3","V4"),
                   var_value=c(1,4,4,3,1,5,4,3,3,22,12,16,
                               3,23,12,16,12,8,7,8,3,8,7,8))

bar_data <- mydata %>%
  filter(water_type == "V1" | water_type == "V2")
line_data <- mydata %>%
  filter(water_type == "V3" | water_type == "V4")

ggplot(line_data,aes(x=month, y=water_val, color=water_type)) +
  geom_col(data=bar_data, aes(fill = water_type), position="dodge") +
  geom_line() +
  ggtitle("V1 and V2") +
  scale_y_continuous(breaks = seq(0,25,10)) +
  xlab("Month") +
  ylab("(cm)") +
  facet_wrap(~year,nrow=2)

我正在使用 R 版本 3.6.1。

提前致谢!

试试这个

ggplot(line_data,aes(x=month, y=water_val)) +  
   geom_col(data=bar_data, aes(fill = water_type), position="dodge") +
   geom_line(aes(color=water_type)) +
   ggtitle("V1 and V2") +
   scale_y_continuous(breaks = seq(0,25,10)) +
   xlab("Month") +
   ylab("(cm)") +
   facet_wrap(~year,nrow=2)