R语言 基于连续行创建组,以便在ggplot折线图中显示

9lowa7mx  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(76)

我有一个扩展的时间序列,并希望突出一些趋势在图表中感兴趣。沿着这样的东西:

问题是,高亮可能是高(红色)或低(绿色),所以我需要Map一个颜色美学的图表以及。当我这样做时,ggplot假设我希望所有突出显示的点都是一个连续的组(这是有道理的!)并在差距上画一条线:

显而易见的解决方案是绘制“群体”美学,以使每个小趋势保持在自己的群体中,但我不知道每个趋势将在哪里开始和结束,所以我正在努力找到一种方法来快速做到这一点。
有没有一种方法可以在运行中识别这些组(可能使用lag()函数或其他方法)?)并创建一个列来Map组,或者告诉ggplot“嘿,如果我在这两个点之间有一个NA,请断开这条线,我们稍后再谈”?
下面是我用来生成上面第二个图表的代码(第一个是相同的代码,但颜色是手动设置的,而不是Map的):

library(dplyr)
library(broom)
library(ggplot2)

df <- sunspot.year %>%
  tidy() %>%
  rename(year = index, sunspots = value) 

hl_df <- df %>%
  filter(year >= 1750 & year <= 1800 |
         year >= 1875 & year <= 1900) %>%
  mutate(highlight = sunspots) %>%
  mutate(highlight_colour = 'high')

df %>%
  left_join(hl_df) %>%
  mutate(year = paste0(year,'-01-01')) %>%
  mutate(year = as.Date(year)) %>%
  ggplot(aes(x = year, y = sunspots)) +
  geom_line() +
  geom_line(aes(y = highlight, col = highlight_colour)) +
  scale_colour_manual(values = c('high' = 'darkred', 'low' = 'darkolivegreen')) +
  theme_bw() +
  theme(legend.position = 'none')
qoefvg9y

qoefvg9y1#

group = 1添加到顶级美学(或者只是在geom_line()中,我认为也应该工作):

df %>%
  left_join(hl_df) %>%
  mutate(year = paste0(year,'-01-01')) %>%
  mutate(year = as.Date(year)) %>%
  ggplot(aes(x = year, y = sunspots,group = 1)) +
  geom_line() +
  geom_line(aes(y = highlight, col = highlight_colour)) +
  scale_colour_manual(values = c('high' = 'darkred', 'low' = 'darkolivegreen')) +
  theme_bw() +
  theme(legend.position = 'none')

这里的想法是,group是一个单独的(容易忽略)美学,你可以设置。当你将某个东西Map到color时,group会从中推断出来,所以如果你想为连续绘制的线进行不同的“分组”,你必须重置group的美感。设置group = 1是告诉ggplot()将所有内容视为一个组的方法。
group = 1问题不同的是,您使用重复的geom_line()调用多次绘制内容。当您将group = 1添加到您的技巧包中时,过度绘制是不必要的,并且消除了一些抗锯齿工件,这些工件是在您将事物绘制在其自身之上时引入的:

df %>%
  left_join(hl_df) %>%
  mutate(year = paste0(year,'-01-01')) %>%
  mutate(year = as.Date(year)) %>%
  ggplot(aes(x = year, y = sunspots,group = 1,color = highlight_colour)) +
  geom_line() +
  scale_colour_manual(values = c('high' = 'red', 'low' = 'green')) +
  theme_bw() +
  theme(legend.position = 'none')

相关问题