R语言 在ggplot中创建一个折线图,根据百分比的变化,线条采用不同的颜色

zzlelutf  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(95)

我有一个时间序列数据,我想使用geom_line使用geom_line进行视觉检查。我想根据显示的颜色(例如,红色表示减少,绿色表示增加),查看线段相对于上一个时间段是增加还是减少,类似于询问here的问题。
作为第二步,我想只在趋势发生变化时才在数字上加点。
例如,使用内部R数据集economics,我可以这样准备数据:

library(tidyverse)

t <- economics %>%
  filter(date >= "2013-09-01") %>%
  mutate(pct_change = (uempmed/lag(uempmed) - 1) * 100 ,
         line_color =  pct_change < 0)

字符串
百分比变化给出:

[1]          NA  -1.2121212   4.9079755   1.1695906 -10.9826590   3.2467532  -0.6289308  -0.6329114
 [9]  -7.0063694  -5.4794521  -5.0724638  -1.5267176   3.8759690   1.4925373  -4.4117647  -0.7692308
[17]   2.3255814  -2.2727273  -6.9767442  -4.1666667


我试过使用这个:

ggplot(data = na.omit(t) , aes(x = date, y = uempmed)) +
  geom_line(aes(group = 1 ,color = line_color )) + 
  geom_point(shape = 1 )


但它并没有给我给予我想要的:


的数据
颜色不对,到处都是点。
我的问题有两部分:
1.我如何编写代码,使表示uempmed的线在它增加时显示绿色,在它减少时显示红色,
1.仅当uempmed从增加切换到减少时才添加geom_point,反之亦然
我很感激任何帮助。
为清晰起见编辑

axzmvihb

axzmvihb1#

为了获得正确的线条颜色,请根据lead计算百分比变化,即,线基于“起始”被着色值。要仅在符号发生变化时添加点,请通过比较pct_change的符号及其lag值,向数据集添加一个指示变量。之后,您可以基于此指示变量过滤数据集,geom_point。另外,我使用replace_naline_colorsign_change赋值,而不是删除带有NA的行。

library(tidyverse)

t <- economics %>%
  filter(date >= "2013-09-01") %>%
  mutate(
    pct_change = (uempmed / lead(uempmed) - 1) * 100,
    line_color = pct_change < 0,
    sign_change = sign(pct_change) * sign(lag(pct_change))
  ) %>%
  replace_na(list(line_color = FALSE, sign_change = 0))

ggplot(data = t, aes(x = date, y = uempmed)) +
  geom_line(aes(group = 1, color = line_color)) +
  geom_point(data = ~filter(.x, sign_change < 0), shape = 1)

字符串


的数据

i34xakig

i34xakig2#

我们可以这样做:
1.我去掉了NA
1.为点创建逻辑向量sign_switch
1.将色彩美学包裹在ifelse
1.稍微调整了一下,看起来很漂亮

library(tidyverse)

t <- economics %>%
  filter(date >= "2013-09-01") %>%
  mutate(pct_change = (uempmed/lag(uempmed) - 1) * 100 ,
         line_color =  pct_change < 0) %>% 
  drop_na(pct_change) %>% 
  mutate(sign_switch = sign(pct_change) != sign(lag(pct_change))) 
  
ggplot(t, aes(x = date, y = pct_change, group = 1))+
  geom_line(aes(color = ifelse(pct_change < 0, "green", "red"))) +
  labs(color = "")+
  geom_point(data = filter(t, sign_switch & !is.na(sign_switch)), size = 3, color = "red") +
  scale_color_manual(values = c( "green", "red"))+
  scale_x_date(date_breaks = "1 month")+
  theme_minimal()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

字符串


的数据

相关问题