R如何使用数值列表作为颜色比例尺

5
我想在R中将变量的值表示为散点图上点的颜色。
x <- rnorm(100) + 5
y <- rnorm(100) + 5
plot(x, y)

在这里,我想使用变量作为颜色的输入。但是如果我尝试这样做:

plot(x, y, col = x)

我遇到了一些奇怪的问题,可能很明显。现在我可以像这样获得我想要的内容:
x_norm = (x - min(x)) / (max(x) - min(x))
col_fun <- colorRamp(c("blue", "red"))
rgb_cols <- col_fun(x_norm)
cols <- rgb(rgb_cols, maxColorValue = 256)
plot(x, y, col = cols)

enter image description here

但这似乎有点复杂,要使其适用于NA或NaN值,例如将它们设为黑色,不是很容易。对我而言,有没有一种简单的方法可以做到这一点,而我却忽略了?


1
关于为什么会出现“奇怪的东西”的问题:颜色在内部调色板中被排序和编号。当您执行 plot(x, y, col = x) 时,col 参数会被舍入为整数,并使用来自此调色板的适当颜色,这就是为什么您会得到相同颜色的条纹,每个条纹的宽度恰好为1。请查看 ?palette。我已经将绘图添加到了您的问题中。 - Stephan Kolassa
2个回答

8

您应该使用cut来将x分成间隔,并使用colorRampPalette来创建固定大小的调色板:

x <- rnorm(100) + 5
y <- rnorm(100) + 5
maxColorValue <- 100
palette <- colorRampPalette(c("blue","red"))(maxColorValue)
plot(x, y, col = palette[cut(x, maxColorValue)])

但是如何添加颜色条呢?有了颜色条,有颜色的点才有意义... - wordsforthewise

1

您可以像这样使用预定义的灰度颜色gray0, ..., gray99:

x <- rnorm(100) + 5
y <- rnorm(100) + 5
x.renormed <- floor(100*((x-min(x))/(diff(range(x))+1e-2)))
colors.grayscale <- paste("gray",x.renormed,sep="")
plot(x, y, col=colors.grayscale, bg=colors.grayscale,pch=21)

结果:

grayscale scatterplot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接