微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在时间与变量图上绘制均值和 +/- sigma

如何解决在时间与变量图上绘制均值和 +/- sigma

我正在尝试创建数据的历史可视化,以逐月显示平均值和 +/- 1 西格玛线。目前,我已经根据数据创建了一个汇总表,然后使用 geom_segment 手动添加了每个均值和 + sigma(仅用于示例)。这不是很瘦。我尝试了 geom_smooth 或类似的函数,但我不知道如何对数据进行分组并相应地显示参考线。

非常感谢!

library(ggplot2)
library(lubridate)
library(tibble)
library(stringr)
library(dplyr)

dates <- as.Date(c("2021-01-01","2021-01-02","2021-01-04","2021-01-08","2021-01-12","2021-01-17","2021-01-21","2021-01-26","2021-01-29","2021-02-01","2021-02-02","2021-02-04","2021-02-08","2021-02-12","2021-02-17","2021-02-21","2021-02-26","2021-02-28","2021-03-01","2021-03-02","2021-03-04","2021-03-08","2021-03-12","2021-03-17","2021-03-21","2021-03-26","2021-03-29"))
all_values <- c(sample(15:25,9,replace=FALSE),sample(18:27,sample(10:25,replace=FALSE))


full_table <- tibble(dates,all_values)

summary_values <- full_table %>% 
  mutate(Month_Category = format(dates,"%Y-%m" )) %>% 
  group_by(Month_Category) %>% 
  summarise(mean_values = mean(all_values),sd_top = mean(all_values) + sd(all_values),sd_bot = mean(all_values)- sd (all_values)) %>% 
  ungroup()
  

History_graph <- full_table %>%
  ggplot(aes(x = dates,y = all_values)) +
  geom_point() +
  labs(title = "History",x = "Date",y = "values") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x = element_text(angle=45,hjust=1,size = 12),axis.title = element_text(size=12)) +
  theme(axis.text.y = element_text(size=12),axis.title = element_text(size=12)) +
  scale_y_continuous(breaks = seq(5,30,by=5),limits=c(5,30)) +
  scale_x_date(breaks = '3 days',labels=date_format('%d-%b'),expand = c(0,0)) +
  geom_segment(aes(x = as.Date("2021-01-01"),xend=as.Date("2021-01-31"),y=summary_values$mean_values[1],yend = summary_values$mean_values[1])) +
  geom_segment(aes(x = as.Date("2021-02-01"),xend=as.Date("2021-02-28"),y=summary_values$mean_values[2],yend = summary_values$mean_values[2])) +
  geom_segment(aes(x = as.Date("2021-03-01"),xend=as.Date("2021-03-31"),y=summary_values$mean_values[3],yend = summary_values$mean_values[3])) +
  geom_segment(aes(x = as.Date("2021-01-01"),y=summary_values$sd_top[1],yend = summary_values$sd_top[1])) +
  geom_segment(aes(x = as.Date("2021-02-01"),y=summary_values$sd_top[2],yend = summary_values$sd_top[2])) +
  geom_segment(aes(x = as.Date("2021-03-01"),y=summary_values$sd_top[3],yend = summary_values$sd_top[3])) 

History_graph 

解决方法

我找到了这个问题的答案。 一种替代方法是使用 mutate 创建均值和 +/- 1 sd 值,然后简单地为不同的值添加 geom_line 并按类别分组。比以前的方法简单得多。

亲切的问候

full_table <- tibble(dates,all_values) %>% 
  mutate(Month_Category = format(dates,"%Y-%m" )) %>% 
  group_by(Month_Category) %>% 
  mutate(mean_values = mean(all_values)) %>% 
  mutate(sd_top = mean(all_values) + sd(all_values)) %>% 
  mutate(sd_bot = mean(all_values)- sd (all_values)) %>% 
  ungroup()

History_graph <- full_table %>%
  ggplot(aes(x = dates,y = all_values)) +
  geom_point() +
  labs(title = "History",x = "Date",y = "values") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x = element_text(angle=45,hjust=1,size = 12),axis.title = element_text(size=12)) +
  theme(axis.text.y = element_text(size=12),axis.title = element_text(size=12)) +
  scale_y_continuous(breaks = seq(5,30,by=5),limits=c(5,30)) +
  scale_x_date(breaks = '3 days',labels=date_format('%d-%b'),expand = c(0,0)) +
  geom_line(aes(y = mean_values,group = Month_Category),color = "black") +
  geom_line(aes(y = sd_top,color = "gray") +
  geom_line(aes(y = sd_bot,color = "gray") 

History_graph 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。