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

R 如何绘制与年平均值的月偏差条形图?,r,ggplot2,plot,mean,periodicity,R,Ggplot2,Plot,Mean,Periodicity,所以 我试图用条形图绘制温度数据的月平均值与年平均值的偏差图。我有多年的数据,我想展示几个月之间气温的季节变化。条形图应表示与每年重新计算的年平均值的偏差。以下是一个与我想要的类似的示例,仅适用于一年: 我的数据是敏感的,所以我还不能共享它,但我使用txhousing数据集(它附带ggplot2)制作了一个可复制的示例。salesdiff列是每月销售额(所有城市的平均值)与每年的年平均值之间的偏差。现在的问题是绘制它 library(ggplot2) df <- aggregate(sa

所以

我试图用条形图绘制温度数据的月平均值与年平均值的偏差图。我有多年的数据,我想展示几个月之间气温的季节变化。条形图应表示与每年重新计算的年平均值的偏差。以下是一个与我想要的类似的示例,仅适用于一年:

我的数据是敏感的,所以我还不能共享它,但我使用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()
库(ggplot2)

df像这样的东西应该有用吗

基本上,您需要创建一个二进制变量,如果
salesdiff
为正或负,则允许您更改颜色(
fill
),该变量在
factordiff
下面调用

另外,您需要一个
日期
变量,用于
月份
年份
的组合

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()

这里的主要问题可能是
geom\u col()
不会具有不同的美学特性,除非您明确告诉它。获取所需内容的一种方法是使用对
geom\u col()
的两个调用来创建两个不同的条形图,它们将在两个不同的层中组合在一起。此外,您还需要创建日期信息,这些信息可以轻松地传递到
ggplot()
;我使用
lubridate()
包来完成此任务

请注意,我们在这里组合了“月”和“年”列,然后使用
ymd()
获取日期值。我选择不使用类似于
date\u decimal()
的东西来转换
txhousing
中的双值“date”列,因为有时它会混淆二月和一月(例如,二月一日“四舍五入”到一月三十一日)

我决定绘制
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
库(“tidyverse”)
图书馆(“ggplot2”)
#将txhousing子集设置为刚好>=2011年,并计算嵌套的平均值和日期
住房_df=2011)%>%
分组单位(年、月)%>%
总结(月平均值=平均值(销售额,na.rm=真实值),
日期=第一次(日期))%>%
突变(yearmon=粘贴(年、月、九月“-”),
date=ymd(yearmon,截断=1),#创建日期列
salesdiff=月平均值-平均值(月平均值),#月偏差
higherlower=情况(salesdiff>=0 ~“更高”#用于以后的填充
salesdiff<0~“更低”))
ggplot(数据=住房面积,aes(x=日期,y=销售差异,填充=作为系数(高-低)))+
geom_col()+
缩放日期(日期=6个月),
日期标签=“%b-%Y”)+
刻度填充手动(数值=c(“较高的”=“蓝色”,“较低的”=“红色”))+
主题_bw()+
主题(legend.position=“none”)#删除图例
绘图:

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


你可以很好地看到这里的周期性行为;销售增长似乎每年春天都会出现,而秋季和冬季的销售则会下降。请记住,如果您想将此代码用于温度数据,可能需要反转我指定的颜色!这是一个有趣的一个-祝你好运,和快乐的阴谋

创建一个
Date
变量:
df3$Date 0
。谢谢!!这太完美了!