在散点图中分配不同的透明度和点大小

时间:2019-07-01 17:40:01

标签: r size 2d transparency scatter-plot

以下是使用plot()函数运行高度与重量的二维散点图的代码,其中根据Class值是否为1、2将点分为“好”,“一般”,“差”或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')

1 个答案:

答案 0 :(得分:0)

这是一种使用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值来查看有效的方法。