首页 文章

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

提问于
浏览
9

假设我有以下数据框:

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)) + 
     geom_line(data=df2, aes(x=c21,y=c22)) + 
     geom_line(data=df3, aes(x=c31, c32))

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

谢谢 .

3 回答

  • 4

    如果您使用包含不同列的熔化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)
    

    Edited for clarity

    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" ...
    

    情节本身:

    enter image description here

  • 12

    如果你按照 ggplot2 接近图形的方式调整思路,这些问题就会变得更容易解决 . ggplot2 围绕着这样的想法进行组织:图中出现的所有内容(原则上)应该作为数据框中的列存在 . (当然也有例外,但这是一般的想法 . )

    因此,您尝试逐个构建此图形,一次一行,每个来自不同的数据帧,然后为它们分配颜色非常不合适 . 如果你想用不同的颜色标记图表中的东西,你首先要考虑的是:

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

    在这种情况下,解决方案非常简单 . 只需 rbind 您的三个数据框(您需要确保首先匹配组合名称)并创建一个新列,例如 grp ,其中有三个级别对应于您的三个数据框:

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

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

    ggplot(data = dat, aes(x=...,y=...,colour = grp) + 
        geom_line()
    

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

    + scale_colour_manual(value = c('green','blue','grey'))
    

    或者你可以使用 scale_colour_brewer 中的一些漂亮的'pre-chosen'调色板 .

    编辑:我修正了上面的拼写错误,以确保 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()
    
  • 1

    你不必融化,聚集或聚集 . 它非常简单 . 只需将颜色添加到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
    

    The result plot

相关问题