在R、ggplot2、lattice或latticeExtra中创建更连续的颜色调色板

7

警告...以下是非常初学者的问题:

我正在尝试绘制几千个(X,Y)点的相当规则的分布,每个点都与一个值相关联,称为Z,在-20至+20之间非常不规则地变化。我不想进行平滑处理;我希望点的Z值能够根据平滑变化的颜色调色板进行绘制,就像Gnuplot可以使用适当的平滑颜色调色板一样。我已经尝试了基本的R、ggplot2和latticeExtra,尽可能地做到了以下几点,它几乎可以实现我的要求:

library(lattice)
library(latticeExtra)
library(colorRamps)
df = read.table(file"whatever", header=T)
levelplot(Z~X*Y, df, panel=panel.levelplot.points, cex=0.2,
   col.regions=colorRampPalette(c("red","white","blue"))(50))

一个数据点如下:1302525 225167 -3.5

当我以代码中最后一行的"50"作为3来绘制我的数据框时,我会得到可预测的 R 循环行为,红、白和蓝色重复五次,第16个颜色条段是白色。将3改为7会产生更多的红色和蓝色阴影,创建2个重复的颜色范围段,并留下两个带红色的颜色作为颜色范围尝试循环。这表明使此数字变大会导致颜色更加细致。但如果我输入一个大于16的数字,那就是全部,16个彩色段,均匀从红色到白色再到蓝色。但我想让颜色刻度更细,并在完美的世界中强制将 Z 值为零的颜色设置为白色。

迄今为止,我使用 R 的经验是,当我无法做到像这样简单的事情时,我缺少非常基本的概念。它是什么?

3个回答

11

就lattice而言,你可以使用RColorBrewer(或者colorspace)设置颜色调色板。使用@Chase提供的示例,但是将z的值设为正数:

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = sample(0:40, 1000, TRUE))
library(RColorBrewer)
# see, e.g.
# display.brewer.all(9, type="seq")
# display.brewer.pal(11, "RdBu")
my.col <- colorRampPalette(brewer.pal(11, "RdBu"))(diff(range(dat$z)))
xyplot(y ~ x, data=dat, col=my.col[dat$z], pch=19, alpha=.5)

需要注意的是,在这里通过插值法增加可用颜色的范围也是必要的。此外,使用 levelplot() 时,您可能希望使用 cut=pretty= 进行调整。

输入图像描述


7

你是否看过 ggplot 中的 scale_gradient?或者是针对离散颜色的 scale_brewer?以下是 scale_gradient 的一个例子:

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = sample(-20:20, 1000, TRUE))

p <- ggplot(dat, aes(x, y, colour = z)) + geom_point() 
p + scale_colour_gradient()
p + scale_colour_gradient(low = "red", high = "blue")
p + scale_colour_gradient2(low = "red", mid = "white", high = "blue")

感谢Chase推动我朝这个方向前进。 - Plsvn

6
您所缺失的“概念”是传递给levelplot()at参数,该参数定义了颜色级别和/或等高线之间的断点。默认值为pretty(z),只会生成几个级别。您可以将at设置为覆盖所需值范围的序列。
library(latticeExtra)

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = rnorm(1000, mean = 1))
## for centering the colour key around zero
maxz <- max(abs(dat$z))

levelplot(z ~ x * y, dat, at = seq(-maxz, maxz, length = 100), 
    panel = panel.levelplot.points, par.settings = custom.theme.2())

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