如何绘制与年度平均值的每月偏差的条形图?

时间:2018-11-13 10:06:24

标签: r ggplot2 plot mean periodicity

所以!

我正在尝试使用条形图来绘制温度数据的年度平均值的月偏差图。我拥有多年的数据,我想显示几个月之间温度的季节性变化。条形图应表示与每年平均值的偏差,每年对平均值进行重新计算。这是一个与我想要的示例类似的示例,仅适用于一年:

Alaska Temperatures

我的数据很敏感,所以我现在还不能共享它,但是我使用txhousing数据集(它是ggplot2附带的)制作了一个可复制的示例。 salesdiff列是每月销售量(所有城市的平均销售量)与每年年平均量之间的偏差。现在问题是在绘制它。

library(ggplot2)
df <- aggregate(sales~month+year,txhousing,mean)

df2 <- aggregate(sales~year,txhousing,mean)

df2$sales2 <- df2$sales #RENAME sales
df2 <- df2[,-2] #REMOVE sales

df3<-merge(df,df2) #MERGE dataframes

df3$salesdiff <- df3$sales - df3$sales2 #FIND deviation between monthly and annual means

#plot deviations
ggplot(df3,aes(x=month,y=salesdiff)) +
         geom_col()

我的ggplot目前状况不佳-

enter image description here

以某种方式,它将每个月的列与多年来的所有数据堆叠在一起。理想情况下,日期应沿跨多年的x轴(我认为数据集来自2000-2015年...),并且根据salesdiff的高低来设置不同的颜色。你们都很棒,我欢迎任何建议!!!!

2 个答案:

答案 0 :(得分:1)

类似的东西应该起作用?

基本上,您需要创建一个二进制变量,如果fill为正或负,则可以更改颜色(salesdiff

此外,您需要为factordiffdate组合使用一个month变量。

year

enter image description here

当然,这会导致难以阅读的情节,因为您有很多日期,您可以将其子集化并仅显示有限的时间:

library(ggplot2)
library(dplyr)

df3$factordiff <- ifelse(df3$salesdiff>0, 1, 0) # factor variable for colors

df3 <- df3 %>% 
  mutate(date = paste0(year,"-", month), # this builds date like "2001-1"
         date = format(date, format="%Y-%m")) # here we create the correct date format

#plot deviations
ggplot(df3,aes(x=date,y=salesdiff, fill = as.factor(factordiff))) +
  geom_col()

enter image description here

答案 1 :(得分:1)

这里的主要问题可能是,geom_col()不会具有不同的美学特性,除非您明确告知。一种获得所需内容的方法是使用两次对geom_col()的调用来创建两个不同的条形图,这些条形图将在两个不同的层中组合在一起。另外,您将需要创建可以轻松传递给ggplot()的日期信息;我将lubridate()包用于此任务。

请注意,我们在此处合并“月”和“年”列,然后使用ymd()获得日期值。我选择不使用txhousing之类的方法来转换date_decimal()中的双值“ date”列,因为有时它会混淆2月和1月(例如2月1日被“舍入”到1月31日)。

我决定绘制txhousing数据集的子集,出于教学目的,它更易于显示。

代码:

library("tidyverse")
library("ggplot2")

# subset txhousing to just years >= 2011, and calculate nested means and dates
housing_df <- filter(txhousing, year >= 2011) %>%
  group_by(year, month) %>%
  summarise(monthly_mean = mean(sales, na.rm = TRUE),
            date = first(date)) %>%
  mutate(yearmon = paste(year, month, sep = "-"),
         date = ymd(yearmon, truncated = 1), # create date column
         salesdiff = monthly_mean - mean(monthly_mean), # monthly deviation
         higherlower = case_when(salesdiff >= 0 ~ "higher", # for fill aes later
                                 salesdiff < 0 ~ "lower"))

ggplot(data = housing_df, aes(x = date, y = salesdiff, fill = as.factor(higherlower))) +
  geom_col() +
  scale_x_date(date_breaks = "6 months",
               date_labels = "%b-%Y") +
  scale_fill_manual(values = c("higher" = "blue", "lower" = "red")) +
  theme_bw()+
  theme(legend.position = "none") # remove legend

情节:

enter image description here

您可以在这里很好地看到周期性行为;似乎每个春季销售量都会增加,而秋季和冬季月份销售量会减少。请记住,如果要将此代码用于温度数据,可能要反转我分配的颜色!这是一个有趣的-祝你好运,快乐的情节!