以下是使用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')
答案 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值来查看有效的方法。