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

时间:2017-09-26 18:49:08

标签: r 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)') 来区分线条。这导致不自动生成图例的情况。如何为此剧情创建传奇?

.archive .entry-footer {
    display: none;
}

enter image description here

2 个答案:

答案 0 :(得分:3)

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

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")将各个数据帧转换为长格式,并将它们堆叠成一个长格式数据帧。

这是情节的样子:

enter image description here

分面图可能更容易阅读:

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)

enter image description here

答案 1 :(得分:1)

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

要让ggplot为此地图生成图例,您需要先将数据重新整形为长格式,然后再将其转发给ggplot

您希望将所有三个数据集(tpAct(),tpOL(),tpModL2() - 我假设这些是返回数据帧的函数组合成一个数据集。 - 让我们称之为合并数据。然后列将是:dataset(表示观察来自哪个集合),Date,RegType(Reg1,Reg2,.. Total)和Value(您正在绘制的实际y值)。

然后你可以使用以下内容创建一个情节:

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

这将为上面的回归和数据集的每个组合绘制一行,但会自动执行此操作并创建图例。如果您不喜欢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)

您可能需要明确制作RegTypedataset有序因素,然后才能将数据发送到ggplot以使其按正确顺序排列,或者更改颜色和线型的顺序上方。