如何用两组绘制条形图

时间:2021-07-04 06:55:12

标签: r dataframe ggplot2 geom-bar

我的问题似乎并不复杂,但我还没有找到任何答案。

我有来自 3 个气候实验的 3 个数据框。对于每个实验,我都有一个事件列表(月 + 集),说明事件是在 Nino、Nina 还是 ras 情况下发生的。

我能够使用每个数据框的类别绘制直方图。但是,为了使其更具合成性,我想将所有 3 个图合并为一个(它们都共享相同的 x 轴:一年中的几个月)。我认为必须有办法解决这个问题,但是 ggplot/geom_bar 中的“填充”选项只能工作一次...

任何帮助将不胜感激。这是我可以建议的代码示例:

month = c("Jan","Jan","Feb","Apr","Jul","Jul")
Episode = c("Nino","ras","Nino","Nina","Nina","Nina")
df1 = data.frame(month,Episode)
df1$Exp = "2000"
df1$month <-factor(df1$month,levels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))

month = c("Feb","Sep","Sep","Nov","Jan","Mar")
Episode = c("ras","Nino","Nina","ras","ras","Nino")
df2 = data.frame(month,Episode)
df2$Exp = "RCP45"
df2$month <-factor(df2$month,levels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))

month = c("Apr","May","May","Jun","Jul","Nov")
Episode = c("Nina","ras","ras","Nino","Nino","Nino")
df3 = data.frame(month,Episode)
df3$Exp = "RCP85"
df3$month <-factor(df3$month,levels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))

# I can plot the histogram for one experiment
colours = c("Nina"="blue","Nino"="red","ras"="black","NA"="grey")
colScale = scale_fill_manual(name="Episode",values=colours)

gghist = ggplot(df1, aes(x=month,fill=Episode)) +
  geom_bar(stat = "count") +
  scale_x_discrete(drop=FALSE) + 
  scale_fill_manual(name="Episode",values=colours,drop=FALSE) +
  labs(title=("Distribution of extreme events"), x = "Month")  +
  theme(text = element_text(size=15))
print(gghist)

# Quid: how to merge all three histograms working on df_4test
df_4test = rbind(df1,df2,df3)

编辑 - 添加到用户的数据中:

month = c("Jan","Jan","Feb","Mar","Apr","May","Jun","Jul","Jul","Jul","Aug","Aug","Sep","Oct","Nov","Dec","Dec") Episode = c("Nino","ras","Nino","Nina","Nina","Nina","Nino","Nina","Nino","Nina","Nina","Nino","ras","Nino","ras","Nino","Nina")

month = c("Jan","Feb","Feb","Feb","Mar","Apr","May","Jun","Jun","Jun","Jun","Jul","Aug","Sep","Sep","Oct","Oct","Oct","Nov","Nov","Nov","Dec") Episode = c("ras","Nino","Nino","Nina","Nina","Nina","ras","ras","Nino","Nino","ras","ras","ras","Nino","Nina","Nina","Nino","Nino","Nina","Nino","ras","ras")

month = c("Jan","Jan","Jan","Jan","Feb","Mar","Apr","Apr","May","May","Jun","Jul","Aug","Sep","Oct","Nov","Nov","Dec","Dec") Episode = c("Nina","ras","Nino","Nino","ras","Nino","Nino","Nino","Nina","ras","ras","Nina","ras","ras","Nino","Nino","Nino","Nina","Nina")

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码在同一图中绘制所有数据。

library(ggplot2)
df_4test = dplyr::bind_rows(df1,df2,df3, .id = 'id')

ggplot(df_4test, aes(x=month,fill=Episode)) +
  geom_bar(stat = "count") +
  scale_x_discrete(drop=FALSE) + 
  scale_fill_manual(name="Episode",values=colours,drop=FALSE) +
  labs(title=("Distribution of extreme events"), x = "Month")  +
  theme(text = element_text(size=15))

enter image description here

或者您可以使用分面。

ggplot(df_4test, aes(x=month,fill=Episode)) +
  geom_bar(stat = "count") +
  scale_x_discrete(drop=FALSE) + 
  scale_fill_manual(name="Episode",values=colours,drop=FALSE) +
  labs(title=("Distribution of extreme events"), x = "Month")  +
  theme(text = element_text(size=15)) + 
  facet_grid(vars(id))

enter image description here