繁体   English   中英

将图例添加到由具有受控颜色的多个数据帧组成的ggplot中

[英]Adding legend to ggplot made from multiple data frames with controlled colors

我有一个由三个数据帧组成的ggplot2折线图,我已经为其控制了配色方案。 我改用linetype来区分线。 这导致无法自动生成图例的情况。 如何为该图创建图例?

tpAct <- data.frame(
  Date=seq.Date(as.Date('2017-09-01'), as.Date('2018-01-01'),by='month'),
  Reg1=rnorm(5, 10, 5),
  Reg2=rnorm(5, 15, 5),
  Reg3=rnorm(5, 20, 5),
  Reg4=rnorm(5, 25, 5),
  Reg5=rnorm(5, 30, 5),
  Total=rnorm(5, 60, 5)
)

tpOL <- data.frame(  
  Date=seq.Date(as.Date('2017-09-01'), as.Date('2018-01-01'),by='month'),
  Reg1=rnorm(5, 10, 5),
  Reg2=rnorm(5, 25, 5),
  Reg3=rnorm(5, 20, 5),
  Reg4=rnorm(5, 25, 5),
  Reg5=rnorm(5, 30, 5),
  Total=rnorm(5, 60, 5)
)

tpModL2 <- data.frame(  
  Date=seq.Date(as.Date('2017-09-01'), as.Date('2018-01-01'),by='month'),
  Reg1=rnorm(5, 10, 5),
  Reg2=rnorm(5, 25, 5),
  Reg3=rnorm(5, 20, 5),
  Reg4=rnorm(5, 25, 5),
  Reg5=rnorm(5, 30, 5),
  Total=rnorm(5, 60, 5)
)

ggplot() + 
  geom_line(data=tpAct, aes(x=Date, y=Reg1), color='red', size=1.25) +
  geom_line(data=tpAct, aes(x=Date, y=Reg2), color='blue', size=1.25) + 
  geom_line(data=tpAct, aes(x=Date, y=Reg3), color='green', size=1.25) + 
  geom_line(data=tpAct, aes(x=Date, y=Reg4), color='pink', size=1.25) + 
  geom_line(data=tpAct, aes(x=Date, y=Reg5), color='yellow', size=1.25) + 
  geom_line(data=tpAct, aes(x=Date, y=Total), color='black', size=1.25) + 
  geom_line(data=tpOL, aes(x=Date, y=Reg1), linetype=5, color='red', size=1.25) +
  geom_line(data=tpOL, aes(x=Date, y=Reg2), linetype=5, color='blue', size=1.25) +
  geom_line(data=tpOL, aes(x=Date, y=Reg3), linetype=5, color='green', size=1.25) +
  geom_line(data=tpOL, aes(x=Date, y=Reg4), linetype=5, color='pink', size=1.25) +
  geom_line(data=tpOL, aes(x=Date, y=Reg5), linetype=5, color='yellow', size=1.25) +
  geom_line(data=tpOL, aes(x=Date, y=Total), linetype=5, color='black', size=1.25) + 
  geom_line(data=tpModL2, aes(x=Date, y=Reg1), linetype=4, color='red', size=1.25) +
  geom_line(data=tpModL2, aes(x=Date, y=Reg2), linetype=4, color='blue', size=1.25) +
  geom_line(data=tpModL2, aes(x=Date, y=Reg3), linetype=4, color='green', size=1.25) +
  geom_line(data=tpModL2, aes(x=Date, y=Reg4), linetype=4, color='pink', size=1.25) +
  geom_line(data=tpModL2, aes(x=Date, y=Reg5), linetype=4, color='yellow', size=1.25) +
  geom_line(data=tpModL2, aes(x=Date, y=Total), linetype=4, color='black', size=1.25) +
  labs(x='', y='Total Balances ($B)')

在此处输入图片说明

以下是使用您提供的示例数据框堆叠和绘制数据的方法:

library(tidyverse)

setNames(list(tpAct, tpOL, tpModL2), c("tpAct","tpOL","tpModL2")) %>% 
  map_df(~ .x %>% gather(key, value, -Date), .id="source") %>% 
  ggplot(aes(Date, value, colour=key, linetype=source)) +
    geom_line() +
    scale_colour_manual(values=c('red','blue','green','pink', 'yellow', 'black')) +
    theme_classic()

setNames(list(tpAct, tpOL, tpModL2), c("tpAct","tpOL","tpModL2"))将三个数据帧放入列表中,并将数据帧名称分配为列表元素的名称。

map_df(~ .x %>% gather(key, value, -Date), .id="source")将单个数据帧转换为长格式,并将其堆叠为单个长格式数据帧。

这是情节的样子:

在此处输入图片说明

多面图可能更易于阅读:

setNames(list(tpAct, tpOL, tpModL2), c("tpAct","tpOL","tpModL2")) %>% 
  map_df(~ .x %>% gather(key, value, -Date), .id="source") %>% 
  ggplot(aes(Date, value, colour=key)) +
    geom_line() +
    scale_colour_manual(values=c('red','blue','green','pink', 'yellow', 'black')) +
    theme_classic() +
    facet_grid(~ source)

在此处输入图片说明

当您发现想要使用ggplot2手动添加图例时,我发现它通常意味着您打算以不同于ggplot2的方式制作图。

为了使ggplot为该图生成图例,您需要在将数据提供给ggplot之前将其数据ggplot为具有组的长格式。

您需要将所有三个数据集(tpAct(),tpOL(),tpModL2()-我假设这些是返回数据帧的函数)合并到单个data.frame中-我们称此合并数据。 列将是:数据集(以表示观察值来自哪个集合),日期,RegType(Reg1,Reg2,.. Total)和值(您要绘制的实际y值)。

然后,您可以使用以下内容创建图:

ggplot(combineddata, aes(x=Date, y=Value, color=RegType, linetype=dataset) + 
    geom_line()

像上面一样,这将为回归和数据集的每种组合绘制一条直线,但是会自动绘制并创建图例。 如果您不喜欢ggplot为您选择的颜色和线型, ggplot可以进一步指定要用于刻度的特定颜色和线型:

ggplot(combineddata, aes(x=Date, y=Value, color=RegType, linetype=dataset) + 
    geom_line() +
    scale_color_manual(values = c("red", "blue", "green", "pink", "yellow", "black")) + 
    scale_linetype_manual(values = c(1, 5, 4)

在将数据发送到ggplot之前,您可能需要显式地设置RegTypedataset有序因子,以正确的顺序获取它们,或者更改上面颜色和线型的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM