【问题标题】:Assign different continuous color gradients based on two different variables in ggplot2 in x and y direction根据ggplot2中x和y方向的两个不同变量分配不同的连续颜色渐变
【发布时间】:2018-06-28 18:49:23
【问题描述】:

我是 R 新手(和堆栈溢出),希望有任何帮助!我无法从other 问题中找到解决方案。我正在尝试:

  1. 根据不同的变量在 x 和 y 方向分配 2 个不同的连续颜色渐变。 (下面代码中的plot1)
  2. 为同一数据框的不同变量的不同绘图保留这些颜色分配。 (下面代码中的plot2)

我只能根据一个变量来管理分配颜色,如下所示。

例子:

####set up data####
#using ggplot2 package
library(ggplot2)

df <- data.frame(c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), 
                 c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
                 c(256, 4, 196, 16, 144, 36, 100, 64, 81, 49, 121, 25, 169, 9, 225, 1),
                 c(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610))
colnames(df) <- c("X", "Y", "V1", "V2")

####plot1: Simple plot of V1 vs V2#####
 #I would like the color to go towards blue as V1 increases on x axis (as it is now)
 #I would also like the color to go towards red as V2 increases on y axis
 #Ideally, when both x and y are large, it would be some purple color

plot1 <- ggplot(df, aes(x=V1, y = V2, color= V1)) + geom_point()+ 
  scale_color_continuous(low="black", high="light blue")+ 
  labs(y= "V2: I want this to go from black --> red", x = "V1: black--> blue")
plot1

####plot2: plot of x vs y but with color assignment same as plot1####
#The position based on X and Y is correct but,
#   I'd like to have the color assigned based on V1 and V2 (same as plot1)
plot2 <- ggplot(df, aes(x=X, y=Y, color=V1)) + geom_point()+
  scale_color_continuous(low="black", high="light blue")
plot2

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我尝试了修改 scoa 的 answer here,也许这可以解决问题。不过,您可能必须手动构建图例,因为这种方法会使默认图例没有吸引力。

    上面有你的数据:

    df <- data.frame(X = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), 
                     Y = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
                     V1 = c(256, 4, 196, 16, 144, 36, 100, 64, 81, 49, 121, 25, 169, 9, 225, 1),
                     V2 = c(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610))
    

    首先,将您的 V1V2 值缩放为 RGB 颜色的最大 R 和 B 值:

    xcol <- df$V1 / max(df$V1) 
    ycol <- df$V2 / max(df$V2) 
    

    现在,使用rgb() 和缩放值创建一个命名颜色向量:

    col <- rgb(ycol, 0, xcol)
    names(col) <- as.character(df$V1)
    

    现在您可以进行绘图,将 V1 作为因子传递给 color 参数:

    ggplot(df, aes(x = V1, y = V2, color = as.factor(V1))) +
      geom_point(size = 5) +
      scale_color_manual(values = col) +
      theme_classic() +
      theme(legend.position = "none") 
    

    对于第二个情节,保持颜色参数相同:

    ggplot(df, aes(x=X, y=Y, color=as.factor(V1))) +
      geom_point(size = 5) +
      scale_color_manual(values = col) +
      theme_classic() +
      theme(legend.position = "none") 
    

    【讨论】:

    • 谢谢你这完美的作品。对于将来引用此内容的任何人,我都能够将其应用于我更大的数据集。出于某种原因,我不得不将分配颜色的列切换为相当于 V2 的列……可能是因为它的比例比我数据集中的 V1 大得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2020-07-04
    • 2021-08-22
    • 2017-10-01
    相关资源
    最近更新 更多