我有一个扩展的时间序列,并希望突出一些趋势在图表中感兴趣。沿着这样的东西:
问题是,高亮可能是高(红色)或低(绿色),所以我需要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')
1条答案
按热度按时间qoefvg9y1#
将
group = 1
添加到顶级美学(或者只是在geom_line()
中,我认为也应该工作):这里的想法是,
group
是一个单独的(容易忽略)美学,你可以设置。当你将某个东西Map到color
时,group
会从中推断出来,所以如果你想为连续绘制的线进行不同的“分组”,你必须重置group
的美感。设置group = 1
是告诉ggplot()
将所有内容视为一个组的方法。与
group = 1
问题不同的是,您使用重复的geom_line()
调用多次绘制内容。当您将group = 1
添加到您的技巧包中时,过度绘制是不必要的,并且消除了一些抗锯齿工件,这些工件是在您将事物绘制在其自身之上时引入的: