【问题标题】:ggplot two colors geom_point with alphaggplot 两种颜色 geom_point 与 alpha
【发布时间】:2020-08-02 20:32:52
【问题描述】:

您好,我正在尝试使用 ggplot 覆盖在同一坐标处进行的不同测量值。测量具有不同条件下的 X 和 Y 坐标和强度值。我希望以不同的颜色绘制强度值,并且都可以通过使用 alpha 来显示。我尝试了 alpha/color 和 fill 参数的不同组合,但似乎找不到合适的组合。任何帮助将不胜感激

library(ggplot2)
library(reshape2)

#sample data
data <- data.frame(coordX = c(5, 10, 15, 20), coordY = c(5, 10, 20, 30), var1 = c(0.0, 0.02, 0.02, 0.02), var2 = c(0.34, 0.26, 0.31, 0.28))

library(reshape2)

#my best attempt so far
ggplot(data = melt(data, id.vars = c("coordX", "coordY"), value.name = "pixel.intensity"), aes(x = coordX, y = coordY)) + geom_point(aes(color= variable, fill = pixel.intensity, alpha =0.5))

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    如果我对您的理解正确,您想在同一位置绘制来自两个不同组的两个点,但是这两个组的颜色不同。每个点的 alpha 将由第四个连续变量控制,因此每个绘制位置的表观颜色将是两种颜色的混合,根据第四个变量加权。

    这有点有效,但没有你希望的那么好,原因有很多。

    首先,您提供的数据太不平衡,不利于第二组,所以点基本上都会显示为蓝色。因此,我们需要 pixel.intensity 变量的不同值来显示效果确实有效:

    library(ggplot2)
    
    df <- structure(list(coordX = c(5, 10, 15, 20, 5, 10, 15, 20), coordY = c(5, 
    10, 20, 30, 5, 10, 20, 30), variable = structure(c(1L, 1L, 1L, 
    1L, 2L, 2L, 2L, 2L), .Label = c("var1", "var2"), class = "factor"), 
        pixel.intensity = c(0, 0.42, 0.51, 0.02, 0.34, 0.1, 0.15, 
        0.28)), row.names = c(NA, -8L), class = "data.frame")
    
    
    ggplot(df, aes(x = coordX, y = coordY)) + 
      geom_point(aes(alpha = pixel.intensity, color = variable), size = 5) +
      scale_alpha_identity()
    

    您可以看到,除了灰色、褪色的色调之外,您需要在 alpha 上有很大的差异。此外,如果两个 alpha 值都较低,则这些点会非常微弱。


    编辑

    从 OP 的 cmets 可以看出,我们实际上是在讨论混合 RGB 颜色。在这种情况下,假设我们有以下数据框,红色、蓝色和绿色的强度在 0 和 1 之间缩放:

    red   <- rep(c(seq(0, 1, 0.1), rep(1, 10)), 21)
    green <- rep(c(rep(1, 10), seq(1, 0, -0.1)), 21)
    blue  <- rev(rep(c(seq(0, 1, 0.1), rep(1, 10)), each = 21))
    red   <- red * rev(blue)
    green <- green * rev(blue)
    
    x <- rep(0:20, 21)
    y <- rep(0:20, each = 21)
    
    df <- data.frame(x, y, red, blue, green)
    

    然后我们可以通过简单地绘制 rgb 值;

    df$rgb <- rgb(red, green, blue)
    
    ggplot(df, aes(x, y, color = rgb)) + geom_point(size = 5) + scale_color_identity()
    

    或者如果您想实际模拟像素:

    ggplot(df, aes(x, y, fill = rgb)) + geom_tile() + scale_fill_identity()
    

    由reprex package (v0.3.0) 于 2020 年 8 月 2 日创建

    【讨论】:

    • 嗨艾伦,谢谢你的建议。我明白你的意思了。也许更好的解释是我正在尝试重新创建 RGB 的功能。我在 R G 和 B 中有像素强度,它们一起会产生新的颜色来绘制。
    • @Eric 我也很怀疑。在那种情况下,这有点像 x/y 问题,因为这样做是行不通的。 Alpha 混合是减法,而不是加法(即红色 + 绿色 + 蓝色产生黑色而不是白色)。可以使用 ggplot 做你想做的事,但你需要预先计算颜色。如果它是 RGB 值,那么这很容易。如果您想要演示,请告诉我。
    【解决方案2】:

    这有帮助吗?

    #sample data
    data <- data.frame(coordX = c(5, 10, 15, 20), coordY = c(5, 10, 20, 30), var1 = c(0.0, 0.02, 0.02, 0.02), var2 = c(0.34, 0.26, 0.31, 0.28))
    
    library(reshape2)
    data2 = melt(data, id.vars = c("coordX", "coordY"), value.name = "pixel.intensity")
    
    ggplot(data2,
           aes(x = jitter(coordX), y = jitter(coordY), 
               alpha = pixel.intensity, color = variable, fill= variable)) + 
      geom_point() +
      theme_bw()
    

    我从代码中提取了熔体,以便更容易查看数据,并且我稍微搜索了一下变量,以便您可以看到两者。

    【讨论】:

    • 您的代码给出了以下错误:rep(x[[i]], n) 中的错误:尝试复制“闭包”类型的对象
    • @Eric 尝试重新启动您的 R 会话,看看它是否能解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多