具有共享图例和不同 x 轴变量的并排 ggplot 条形图

时间:2021-07-02 18:51:14

标签: r ggplot2

佛蒙特州 2012 年至 2020 年各县农业灾害报告数量。我想将 by countyby year 的这两个图与一个共同的图例一起绘制。请注意,x 轴不同,并且两个图例的共享变量的颜色不匹配。

虽然 'by Year' 和 'by County' 在其原始数据集中共享相同数量的变量,因为我想对任何给定年份或县至少出现 3 次或更多次的变量进行子集化,只有 3 个变量保留为“按县”,而“按年”具有相同的三个加上额外的 3。

我在堆栈中搜索了一个答案,但没有唯一的解决方案,任何关于如何实现所需输出的想法都表示赞赏。

这是数据:

df1<-structure(list(County = c("Addison", "Addison", "Addison", "Bennington", 
"Bennington", "Bennington", "Caledonia", "Caledonia", "Caledonia", 
"Chittenden", "Chittenden", "Chittenden", "Essex", "Essex", "Essex", 
"Franklin", "Franklin", "Franklin", "Grand Isle", "Grand Isle", 
"Grand Isle", "Lamoille", "Lamoille", "Lamoille", "Orange", "Orange", 
"Orange", "Orleans", "Orleans", "Orleans", "Rutland", "Rutland", 
"Rutland", "Washington", "Washington", "Washington", "Windham", 
"Windham", "Windham", "Windsor", "Windsor", "Windsor"), Type = c("Drought", 
"Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain", 
"Drought", "Frost & Cold Below\nNormal Temperatures", "Flooding &\nExcessive Rain"
), Count = c(4L, 3L, 7L, 7L, 4L, 7L, 5L, 6L, 4L, 2L, 1L, 7L, 
5L, 6L, 4L, 1L, 1L, 3L, 2L, 1L, 7L, 1L, 1L, 3L, 5L, 6L, 4L, 1L, 
1L, 3L, 3L, 3L, 6L, 1L, 1L, 3L, 5L, 6L, 5L, 6L, 6L, 5L), layer = c("By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County", "By County", "By County", "By County", "By County", 
"By County"), Year = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
)), row.names = c(NA, -42L), class = c("tbl_df", "tbl", "data.frame"
))

df2<-structure(list(Year = c("2012", "2012", "2012", "2012", "2012", 
"2012", "2013", "2013", "2013", "2013", "2013", "2013", "2014", 
"2014", "2014", "2014", "2014", "2014", "2015", "2015", "2015", 
"2015", "2015", "2015", "2016", "2016", "2016", "2016", "2016", 
"2016", "2017", "2017", "2017", "2017", "2017", "2017", "2018", 
"2018", "2018", "2018", "2018", "2018", "2019", "2019", "2019", 
"2019", "2019", "2019", "2020", "2020", "2020", "2020", "2020", 
"2020"), Type = c("Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain", "Heat, Excessive Heat,\nHigh Temp, Low Humidty", 
"Wind, High Winds", "Hail", "Drought", "Frost & Cold Below\nNormal Temperatures", 
"Flooding &\nExcessive Rain"), Count = c(1L, 0L, 0L, 3L, 3L, 
0L, 0L, 5L, 5L, 0L, 0L, 38L, 0L, 0L, 0L, 0L, 10L, 0L, 0L, 3L, 
3L, 8L, 0L, 3L, 8L, 3L, 0L, 9L, 10L, 0L, 0L, 0L, 0L, 0L, 4L, 
4L, 0L, 0L, 0L, 4L, 0L, 4L, 0L, 0L, 0L, 0L, 19L, 19L, 0L, 0L, 
0L, 24L, 0L, 0L), layer = c("By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year", "By Year", "By Year", "By Year", 
"By Year", "By Year", "By Year"), County = c(NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA)), row.names = c(NA, -54L), class = c("tbl_df", "tbl", 
"data.frame"))

代码如下:

# library(ggplot2)
# library(RColorBrewer)
# library(sjPlot)
# library(tidyr)
# library(viridis)

set_theme(
  geom.outline.color = "antiquewhite4", 
  geom.outline.size = .5, 
  geom.label.size = 1.5,
  geom.label.color = "black",
  title.color = "black", 
  title.size = 1.5, 
  title.align = 'center',
  # axis.angle.x = 90, 
  axis.textcolor = "black", 
  axis.textsize = 1.15,
  base = theme_bw(),
)

p1<-ggplot(df1)+
  geom_bar(aes(x=County, y=Count, fill=Type), stat="identity") +
  # scale_fill_brewer(palette="PuRd") +
  scale_fill_viridis(discrete = TRUE) +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), legend.key.height=unit(.75, "cm"))

p1

p2<-ggplot(df2)+
  geom_bar(aes(x=Year, y=Count, fill=Type), stat="identity") +
  # scale_fill_brewer(palette="PuRd") +
  scale_fill_viridis(discrete = TRUE) +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), legend.key.height=unit(.75, "cm"))

p2

1 个答案:

答案 0 :(得分:0)

我用你的代码尝试了 gridExtra,它似乎成功了

library(gridExtra)
p3 <- grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                           p2 + theme(legend.position="right"),
                           nrow=1),nrow=2,heights=c(10, 1))

我看到的问题是更改图例标题,也许删除/隐藏 y 轴标签之一(编辑:现在我可以看到轴不相同)