多行,每行基于ggplot2中的不同数据帧 - 自动着色和图例

Cur*_*arn 10 r ggplot2

假设我有以下数据框:

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)
Run Code Online (Sandbox Code Playgroud)

我想在相同的情节/面板中将这些绘制为线条.我可以做到这一点

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))
Run Code Online (Sandbox Code Playgroud)

所有这些都是黑色的.如果我想要它们的颜色不同,我可以明确指定颜色作为参数geom_line().我的问题是我可以指定几种颜色的列表,比如5种颜色,例如红色,蓝色,绿色,橙色,灰色,并使用该列表,这样我就不必明确指定颜色作为geom_line的参数()如果是每一行.如果绘图p包含2个geom_line()语句,则它们将分别为红色和蓝色着色.如果它包含3个geom_line语句,它将为红色,蓝色和绿色着色.最后,如何为这些图指定图例.即使我可以在最后给出颜色作为矢量p也很棒.如果问题不明确,请告诉我.

谢谢.

Cha*_*ase 13

如果您使用包含不同列的熔化data.frame来指定不同的美学,ggplot2效果最佳.常见的列名称更容易融化,所以我从那里开始.以下是我要采取的步骤:

  • 重命名列
  • 融化数据,增加了我们将映射到颜色美学的新变量
  • 定义你的颜色矢量
  • 使用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)
Run Code Online (Sandbox Code Playgroud)

编辑清晰

结构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" ...
Run Code Online (Sandbox Code Playgroud)

情节本身:

在此输入图像描述


Kat*_*ran 8

你不必融化、分组或聚集。它很简单。只需将颜色添加到 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
Run Code Online (Sandbox Code Playgroud)

结果图


jor*_*ran 5

如果您将思维调整为ggplot2接近图形的方式,这些类型的问题将变得更容易解决。ggplot2围绕这样的想法进行组织:图形中出现的所有内容(原则上)都应作为一列存在于数据框中。(当然也有例外,但这是一般的想法。)

因此,您一次又一次地构建此图的尝试非常困难,这种尝试是一次一次创建的,每行来自不同的数据帧,然后为其分配颜色ggplot2。如果要在图形中用不同的颜色标记事物,则首先应该想到的是:

如何将该颜色标签信息编码为变量

在这种情况下,解决方案非常简单。只需rbind将三个数据框放在一起(您需要确保首名匹配)并创建一个新列,说它grp具有与三个数据框相对应的三个级别:

dat <- rbind(df1,df2,df3)
dat$grp <- rep(factor(1:3),times = c(nrow(df1),nrow(df2),nrow(df3)))
Run Code Online (Sandbox Code Playgroud)

然后在ggplot调用中将变量映射美观的颜色: grp

ggplot(data = dat, aes(x=...,y=...,colour = grp) + 
    geom_line()
Run Code Online (Sandbox Code Playgroud)

最后,如果您不喜欢默认颜色,则可以使用scale_colour_manual以下命令指定自己的颜色:

+ scale_colour_manual(value = c('green','blue','grey'))
Run Code Online (Sandbox Code Playgroud)

或者您可以使用来自的一些不错的“预选”调色板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()
Run Code Online (Sandbox Code Playgroud)