如何绘制月度偏离年均值的条形图?
How to plot bar chart of monthly deviations from annual mean?
太棒了!
我正在尝试使用条形图为温度数据的年均值创建月度偏差图。我有多年的数据,我想显示几个月之间温度的季节性行为。条形图应表示与每年重新计算的年度平均值的偏差。这是一个类似于我想要的例子,只是一年:
我的数据很敏感,所以我还不能分享它,但我使用 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 目前看起来不太好-
它以某种方式将每个月的列与多年来的所有数据堆叠在一起。理想情况下,日期将沿 x 轴跨越多年(我认为数据集是从 2000 年到 2015 年......),并且根据 salesdiff 是更高还是更低而使用不同的颜色。你们都很棒,我欢迎任何建议!!!!
这样的东西应该有用吗?
基本上,如果 salesdiff
是正数或负数,您需要创建一个二进制变量来更改颜色 (fill
),如下所示 factordiff
.
此外,您还需要一个 date
变量用于 month
和 year
组合。
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()
当然,这会导致情节难以阅读,因为您有很多日期,您可以对其进行子集化并仅显示受限时间:
df3 %>%
filter(date >= "2014-1") %>% # we filter our data from 2014
ggplot(aes(x=date,y=salesdiff, fill = as.factor(factordiff))) +
geom_col() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # adds label rotation
这里的主要问题可能是 geom_col()
不会呈现不同的美学属性,除非您明确告诉它。获得所需内容的一种方法是使用两次调用 geom_col()
来创建两个不同的条形图,这些条形图将在两个不同的层中组合在一起。此外,您将需要创建可以轻松传递给 ggplot()
的日期信息;我使用 lubridate()
包来完成这项任务。
注意,我们在这里合并了"month"和"year"列,然后使用ymd()
获取日期值。我选择不使用 date_decimal()
之类的东西转换 txhousing
中的双值 "date" 列,因为有时它会混淆二月和一月(例如,二月 1 日得到 "rounded down" 到一月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
剧情:
你可以很好地看到这里的周期性行为;销售额似乎每隔 spring 就会增加一次,而在秋季和冬季月份销售额会下降。请记住,如果您想将此代码用于温度数据,您可能需要反转我指定的颜色!这是一个有趣的 - 祝你好运,策划愉快!
太棒了!
我正在尝试使用条形图为温度数据的年均值创建月度偏差图。我有多年的数据,我想显示几个月之间温度的季节性行为。条形图应表示与每年重新计算的年度平均值的偏差。这是一个类似于我想要的例子,只是一年:
我的数据很敏感,所以我还不能分享它,但我使用 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 目前看起来不太好-
它以某种方式将每个月的列与多年来的所有数据堆叠在一起。理想情况下,日期将沿 x 轴跨越多年(我认为数据集是从 2000 年到 2015 年......),并且根据 salesdiff 是更高还是更低而使用不同的颜色。你们都很棒,我欢迎任何建议!!!!
这样的东西应该有用吗?
基本上,如果 salesdiff
是正数或负数,您需要创建一个二进制变量来更改颜色 (fill
),如下所示 factordiff
.
此外,您还需要一个 date
变量用于 month
和 year
组合。
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()
当然,这会导致情节难以阅读,因为您有很多日期,您可以对其进行子集化并仅显示受限时间:
df3 %>%
filter(date >= "2014-1") %>% # we filter our data from 2014
ggplot(aes(x=date,y=salesdiff, fill = as.factor(factordiff))) +
geom_col() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # adds label rotation
这里的主要问题可能是 geom_col()
不会呈现不同的美学属性,除非您明确告诉它。获得所需内容的一种方法是使用两次调用 geom_col()
来创建两个不同的条形图,这些条形图将在两个不同的层中组合在一起。此外,您将需要创建可以轻松传递给 ggplot()
的日期信息;我使用 lubridate()
包来完成这项任务。
注意,我们在这里合并了"month"和"year"列,然后使用ymd()
获取日期值。我选择不使用 date_decimal()
之类的东西转换 txhousing
中的双值 "date" 列,因为有时它会混淆二月和一月(例如,二月 1 日得到 "rounded down" 到一月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
剧情:
你可以很好地看到这里的周期性行为;销售额似乎每隔 spring 就会增加一次,而在秋季和冬季月份销售额会下降。请记住,如果您想将此代码用于温度数据,您可能需要反转我指定的颜色!这是一个有趣的 - 祝你好运,策划愉快!