首页 > 解决方案 > 如何在ggplot2 R中绘制异常

问题描述

给定monthly数据three SITESthree years我想创建一个类似于本网站所示的 anlay 图。数据仅适用于月份Nov, Dec, Jan, Feb and Mar

每个数据SITE应显示在单独的面板上,如以下代码所示:

  geom_bar(stat = "identity",fill = "darkmagenta")+
  facet_wrap(~Station.Name)+scale_y_continuous(limits=c(-1,9),breaks = seq(-1,9, by = 1))+ylab("Surface temperature anomaly (°C)") + xlab("Time (year)")

我想在情节上实施以下内容:

  1. 每个站点x 轴标签应为月年格式,例如 2014 年 11 月、2014 年 12 月等。
  2. 每个月都绘制为条形图
  3. 0行加粗
  4. 大于 0 的值被涂成红色,低于 0 的值被涂成蓝色

以下是样本数据:

Data=structure(list(Station.Name = c("SITE A", "SITE A", "SITE A", 
"SITE A", "SITE A", "SITE A", "SITE A", "SITE A", "SITE A", "SITE A", 
"SITE B", "SITE B", "SITE B", "SITE B", "SITE B", "SITE B", "SITE B", 
"SITE B", "SITE B", "SITE B", "SITE C", "SITE C", "SITE C", "SITE C", 
"SITE C", "SITE C", "SITE C", "SITE C", "SITE C", "SITE C"), 
    Month = c("Nov", "Dec", "Jan", "Feb", "Mar", "Nov", "Dec", 
    "Jan", "Feb", "Mar", "Nov", "Dec", "Jan", "Feb", "Mar", "Nov", 
    "Dec", "Jan", "Feb", "Mar", "Nov", "Dec", "Jan", "Feb", "Mar", 
    "Nov", "Dec", "Jan", "Feb", "Mar"), Year = c(2014L, 2014L, 
    2015L, 2015L, 2015L, 2015L, 2015L, 2016L, 2016L, 2016L, 2014L, 
    2014L, 2015L, 2015L, 2015L, 2015L, 2015L, 2016L, 2016L, 2016L, 
    2014L, 2014L, 2015L, 2015L, 2015L, 2015L, 2015L, 2016L, 2016L, 
    2016L), Tm_Normals_Diff = c(-2.3, 0.9, 1.4, -0.2, 2.3, 3.5, 
    1.8, 5.3, 3, 4.5, 0.6, 1.6, 1.8, 1.7, 2.9, 3.7, -0.1, 7.4, 
    3.2, 4.6, 4.2, 2.7, 3.5, 5.4, 5.1, 6.7, 0.7, 8.5, 4, 4.4)), class = "data.frame", row.names = c(NA, 
-30L))

标签: rggplot2

解决方案


这个怎么样:

Data <- Data %>% 
  mutate(date = lubridate::dmy(paste("01", Month, Year, sep="-")), 
         month = zoo::as.yearmon(date),
         month_fac = factor(1:n(), labels=as.character(month)), 
         col = factor(ifelse(Tm_Normals_Diff > 0, 2, 1)))

ggplot(Data, aes(x=month_fac, y=Tm_Normals_Diff, fill=col)) + 
  geom_bar(stat = "identity", show.legend=FALSE)+
  geom_hline(yintercept=0, size=1) + 
  facet_wrap(~Station.Name)+
  theme(axis.text.x=element_text(angle = 90)) + 
  scale_y_continuous(limits=c(-1,9),breaks = seq(-1,9, by = 1))+
  scale_fill_manual(values=c("blue", "red")) + 
  ylab("Surface temperature anomaly (°C)") + 
  xlab("Time (year)")

在此处输入图像描述


推荐阅读