簡體   English   中英

多行,每行基於 ggplot2 中的不同 dataframe - 自動着色和圖例

[英]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,則效果最佳。 使用常見的列名更容易融化,所以我會從那里開始。 以下是我將采取的步驟:

  • 重命名列
  • 融化添加了新變量的數據,我們將 map 加入到顏色美學中
  • 定義你的顏色向量
  • 使用 scale_colour_manual 指定適當的比例

'

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM