2017-09-26 63 views
0

我有一個ggplot2折線圖,該圖由三個數據框構成,我已經控制了該配色方案。我已使用linetype來區分行。這導致圖例不會自動生成的情況。我怎樣才能爲這個情節創造一個傳奇?將圖例添加到使用受控顏色的多個數據框製作的ggplot

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)') 

enter image description here

+0

我認爲,如果你正確的格式化數據「長「的格式,你可以將數據源映射到'linetype',你就會有你的圖例。 – Mako212

+0

您可以通過一次調用'geom_line'來完成此情節。爲此,(1)將各個數據幀轉換爲長格式,(2)將各個數據幀堆疊成單個數據幀,並添加指示器列以標記源數據幀的名稱。然後,您可以將源數據框映射到線型和「註冊」顏色,這將爲您提供圖例並大幅減少所需的代碼量。如果您提供三個數據框中的每一個的樣本,我們可以提供代碼來向您展示如何執行此操作。 – eipi10

+0

@GauravBansal你必須發佈你的數據 – PoGibas

回答

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

+0

謝謝。有沒有辦法將圖例合併爲一個,所以它說「tpActReg1」,並顯示爲紅色實線,「tpModL2Reg1」並顯示紅色虛線,等等? –

+0

你可以用'ggplot(aes(Date,value,color = interaction(source,key),linetype = interaction(source,key)))'做到這一點,但是圖例會有18個條目,你需要做使用'scale_colour_manual'和'scale_linetype_manual'進行一些額外的工作,以按照您的需要獲取線型和顏色。 – eipi10

1

當你發現自己想要手動添加一個傳奇與ggplot2,我發現它通常意味着你要製作你的情節在比ggplot2預期之外的方式。

要獲得ggplot以生成此圖的圖例,您需要先將數據重塑爲帶有組的長格式,然後將其提供給ggplot。你需要將所有三個數據集(tpAct(),tpOL(),tpModL2() - 我假設這些函數是返回數據幀的)組合到一個data.frame中 - 讓我們調用這個組合數據。然後這些列將是:數據集(表示觀察值來自哪個集合),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以使它們按正確的順序排列或者更改上面的顏色和線條類型的順序之前排列因子。

相關問題