【问题标题】:Assign different transparency and point sizes in scatterplot在散点图中分配不同的透明度和点大小
【发布时间】:2019-11-12 08:54:57
【问题描述】:

以下代码使用 plot() 函数运行高度与体重的 2D 散点图,其中根据 Class 值是否为 1、2 将点分类为“Good”、“Fair”、“Poor”或 3,分别。 “好”的点是亮绿色,“一般”,橄榄绿色和差,红色。所有点的大小相同(pch=19)。是否可以为每个数据点设置不同的大小和透明度,具体取决于“组”列中每个点的分配情况:不透明和小尺寸点、半透明和中型点或 100% 透明和大尺寸点. 感谢您的想法!

  df
  #           Group        Class      Height      Weight
  #  1       Opaque small     1 0.831777874 0.859223152
  #  2 Semi-transprnt med     2 0.751019511 0.807521752
  #  3 Semi-transprnt med     1 0.751019511 0.807521752
  #  4    Transprnt large     3 0.527390539 0.599957241
  #  5    Transprnt large     3 0.527390539 0.599957241

    color <- c(rgb(0, 1, 0, 1), rgb(0.5, 0.5, 0), rgb(1, 0, 0))
    plot(x=c(0.0, 0.5, 0.5, 0.0, 0.0), y=c(0.0, 0.0, 0.5, 0.5, 0.0), 
    type='l', col='gray', lwd=2,xlab='Height', ylab='Weight', 
    xlim=c(1,0), ylim=c(1, 0))
    par(new=T)
    plot(x=c(0.0, 0.5, 0.5, 0.0, 0.0), y=c(0.5, 0.5, 1, 1, 0.5), 
    type='l', col='gray', lwd=2, xlab='', ylab='', 
    xlim=c(1, 0.0), ylim=c(1, 0.0), axes=F)
    par(new=T)
    plot(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.0, 0.0, 0.5, 0.5, 0.0), 
    type='l', col='gray', lwd=2,
    xlab='', ylab='', xlim=c(1, 0.0), ylim=c(1, 0.0), axes=F)
    par(new=T)
    plot(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.5, 0.5, 1, 1, 0.5), type='l', 
    col='gray', lwd=2, xlab='', ylab='', 
    xlim=c(1, 0.0), ylim=c(1, 0.0), axes=F)
    par(new=T)
    for (i in 1:3) {
    plot(Height[Class==i], Weight[Class==i], xlim=c(0, 1), ylim=c(0, 1), 
    col=color[i], pch=19, xlab='', ylab='', axes=F)
    par(new=T)
    }
    legend(0.8, 0.586,legend=c('Good', 'Fair', 'Poor'), pch=19, 
    col=color, title='Class')

【问题讨论】:

  • 嘿,你可以看看thisthis
  • 示例df 中的GroupClass 列不一致。哪一个是正确的?另外,plot 函数是否应该使用 Weight 而不是 Length
  • 重量在 x 轴上,长度在散点图上的 y 轴上。绘图函数有重量而不是长度是什么意思?示例 df 中的组和类列不一致?在上面的代码中,我在“类”列中绘制了值。如果这样更容易,我可以输入一个大小列和一个单独的透明度列吗?
  • 从您的问题来看,听起来每行的Class 应该唯一确定其Group1 -> Opaque small 等)。但是示例中的第 1 行和第 3 行具有相同的Class 但不同的Groups,第 2 和第 3 行具有相同的Group 但不同的Classes。此外,对plot 的最后一次调用将Length[class==i] 作为其第二个参数,但df 中没有Length 列。
  • 抱歉,我已经编辑了长度到重量。类和组不相关 类是一种生物条件。组基于特定站点的重复次数。如果我绘制所有 900 个点(其中一些是重复的),则数据点可能会重叠并掩盖下面的点。为了解决这个问题,我想绘制一个不透明的小点,它代表 1 个代表,半透明的中等大小的点代表 2-4 个代表,透明的大点代表 > 5。我已经对列下显示的那些重复分组进行了分类团体。任何想法如何解决这个问题?谢谢。

标签: r size 2d transparency scatter-plot


【解决方案1】:

这是一种使用this answer 中描述的方法(如@mischva11 所建议)来增加透明度的方法。首先,添加包含所需绘图属性的列:

library(dplyr)
library(tidyr)
library(scales)
df = df %>%
  separate(Group, into = c("Transparency", "Size"), sep = " ") %>%
  mutate(Color = case_when(Class == 1 ~ "Chartreuse",
                           Class == 2 ~ "Olive Drab",
                           Class == 3 ~ "Red"),
         Alpha = case_when(Transparency == "Opaque" ~ 0.9,
                           Transparency == "Semi-transprnt" ~ 0.9,
                           Transparency == "Transprnt" ~ 0.3),
         Size = case_when(Size == "small" ~ 0.8,
                          Size == "med" ~ 1,
                          Size == "large" ~ 1.2))

将原代码中的for循环替换为:

plot(df$Height, df$Weight, xlim = c(0, 1), ylim = c(0, 1),
     col = df$Color, pch = 21, xlab = "", ylab = "", axes = F,
     cex = df$Size, bg = alpha(df$Color, df$Alpha))

编辑:使用pch = 21 可以让我们分别控制点的填充和边框(col 为边框,bg 为填充)。此示例将透明度应用于填充而不是边框​​。

在我的机器上,半透明点实际上看起来根本不是很透明,所以这可能无法完全满足您的要求。您可以使用 alpha 值,也可以尝试使用ggplot。方法如下:

library(dplyr)
library(tidyr)
library(ggplot2)
df = df %>%
  separate(Group, into = c("Transparency", "Size"), sep = " ") %>%
  mutate(Color = case_when(Class == 1 ~ rgb(0, 1, 0),
                           Class == 2 ~ rgb(0.5, 0.5, 0),
                           Class == 3 ~ rgb(1, 0, 0)),
         Alpha = case_when(Transparency == "Opaque" ~ 1,
                           Transparency == "Semi-transprnt" ~ 0.4,
                           Transparency == "Transprnt" ~ 0.2),
         Size = case_when(Size == "small" ~ 1,
                          Size == "med" ~ 2,
                          Size == "large" ~ 4))
ggplot(df, aes(x = Height, y = Weight, col = Color, alpha = Alpha, size = Size)) +
  geom_point() +
  scale_color_identity() +
  scale_alpha_identity()

这可能会好一点,尽管对我来说,作为一个天真的观众,很难区分普通点(具有预期颜色)和重叠点(具有其他颜色总和的颜色)。但使用完整数据集可能更容易看到这一点。同样,您可以尝试使用特定的大小和 alpha 值,看看有什么效果。

【讨论】:

  • 这很棒。我非常感谢您抽出时间来解决这个问题!我玩过 alpha 值和大小,它更好。我看到 Color = rgb(Red, Green, Blue - 这与我使用的 rgb 颜色不同。代码不允许我输入原始代码中的 rgb 值。所以,我正在尝试将 rgb 颜色代码更改为 Chartreuse(第 1 类)、Olive Drab(第 2 类)和 Red(第 3 类),这是我拥有的颜色(如此处所示:tayloredmktg.com/rgb/#OR)。新代码不会运行这些颜色名称。如何将颜色更改回原来的颜色?
  • 好点;我试图缩短颜色分配部分,但我想我最终只是让它变得混乱。我会以更透明的方式编辑帖子!
  • 这很好用!非常感谢你这样做!真的很感激。
  • 你知道是否可以在数据点周围设置边框吗?
  • 嗯 - 什么样的边框?一个围绕每个点,还是一个包围所有点的矩形?
猜你喜欢
  • 2021-02-26
  • 1970-01-01
  • 2022-08-03
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多