[英]multiple lines each based on a different dataframe in ggplot2 - automatic coloring and legend
假設我有以下數據框:
df1 = data.frame(c11 = c(1:5), c12 = c(1:5))
df2 = data.frame(c21 = c(1:5), c22 = (c(1:5))^0.5)
df3 = data.frame(c31 = c(1:5), c32 = (c(1:5))^2)
我想將 plot 這些作為同一繪圖/面板中的線條。 我可以這樣做
p <- ggplot() + geom_line(data=df1, aes(x=c11, y = c12)) +
geom_line(data=df2, aes(x=c21,y=c22)) +
geom_line(data=df3, aes(x=c31, c32))
所有這些都將是黑色的。 如果我希望它們具有不同的顏色,我可以將顏色明確指定為geom_line()
的參數。 我的問題是我可以指定幾個 colors 的列表,比如 5 個 colors,例如紅色、藍色、綠色、橙色、灰色,然后使用該列表,這樣我就不必將 Z62848E3CE58204AA982Z513A 顯式指定為 geom_line87A 的參數() 在每一行的情況下。 如果 plot p
包含 2 個 geom_line() 語句,那么它將分別將它們着色為紅色和藍色。 如果它包含 3 個 geom_line 語句,它會將它們着色為紅色、藍色和綠色。 最后,如何為這些圖指定圖例。 即使我可以將 colors 作為p
末尾的向量,那也很棒。 如果問題不清楚,請告訴我。
謝謝。
ggplot2 如果您使用包含不同列以指定不同美學的熔化 data.frame,則效果最佳。 使用常見的列名更容易融化,所以我會從那里開始。 以下是我將采取的步驟:
'
names(df1) <- c("x", "y")
names(df2) <- c("x", "y")
names(df3) <- c("x", "y")
newData <- melt(list(df1 = df1, df2 = df2, df3 = df3), id.vars = "x")
#Specify your colour vector
cols <- c("red", "blue", "green", "orange", "gray")
#Plot data and specify the manual scale
ggplot(newData, aes(x, value, colour = L1)) +
geom_line() +
scale_colour_manual(values = cols)
為清晰起見進行了編輯
newData
的結構:
'data.frame': 15 obs. of 4 variables:
$ x : int 1 2 3 4 5 1 2 3 4 5 ...
$ variable: Factor w/ 1 level "y": 1 1 1 1 1 1 1 1 1 1 ...
$ value : num 1 2 3 4 5 ...
$ L1 : chr "df1" "df1" "df1" "df1" ...
plot 本身:
如果您將思維調整為ggplot2
處理圖形的方式,這些問題就會變得更容易解決。 ggplot2
的組織理念是,圖表中出現的所有內容都應該(原則上)作為數據框中的一列存在。 (當然也有例外,但這是一般的想法。)
因此,您嘗試逐條構建此圖,一次一條,每個來自不同的數據幀,然后將 colors 分配給它們,這非常不ggplot2
ish。 如果你想用不同的 colors 在你的圖中 label 東西,你首先想到的應該是:
如何將此顏色標簽信息編碼為變量?
在這種情況下,解決方案相當簡單。 只需將您的三個數據框rbind
在一起(您需要首先確保 colnames 匹配)並創建一個新列,例如grp
,它具有與您的三個數據框相對應的三個級別:
dat <- rbind(df1,df2,df3)
dat$grp <- rep(factor(1:3),times = c(nrow(df1),nrow(df2),nrow(df3)))
然后map變量grp
到 ggplot 調用中的美學顏色:
ggplot(data = dat, aes(x=...,y=...,colour = grp) +
geom_line()
最后,如果您不喜歡默認的 colors,您可以使用scale_colour_manual
指定您自己的:
+ scale_colour_manual(value = c('green','blue','grey'))
或者您可以使用scale_colour_brewer
中的一些不錯的“預選”調色板。
編輯:我修正了上面的錯字以確保grp
是一個因素。 這是我的最終版本:
df1 = data.frame(c1 = c(1:5), c2 = c(1:5))
df2 = data.frame(c1 = c(1:5), c2 = (c(1:5))^0.5)
df3 = data.frame(c1 = c(1:5), c2 = (c(1:5))^2)
dat <- rbind(df1,df2,df3)
dat$grp <- rep(factor(1:3),times=c(nrow(df1),nrow(df2),nrow(df3)))
ggplot(data = dat, aes(x = c1, y = c2, colour = grp)) +
geom_line()
您不必融化、分組或聚集。 它很簡單。 只需將顏色添加到 geom_line
library(tidyverse)
df1 = data.frame(c11 = c(1:5), c12 = c(1:5))
df2 = data.frame(c21 = c(1:5), c22 = (c(1:5))^0.5)
df3 = data.frame(c31 = c(1:5), c32 = (c(1:5))^2)
p <- ggplot() + geom_line(data=df1, aes(x=c11, y = c12), color= "red") +
geom_line(data=df2, aes(x=c21,y=c22), color = "blue") +
geom_line(data=df3, aes(x=c31, c32), color = "green")
p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.