在r,ggplot2,lattice或latticeExtra中创建更连续的调色板

时间:2011-05-30 23:44:16

标签: r colors plot ggplot2 lattice

警告......非常新手问题如下:

我试图绘制几个(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 个答案:

答案 0 :(得分:11)

就格子而言,您可以使用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=

enter image description here

答案 1 :(得分: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")

答案 2 :(得分:6)

您缺少的“概念”是at的{​​{1}}参数,它定义了颜色级别和/或轮廓线之间的断点。默认值为levelplot(),只会产生几个级别。您可以将pretty(z)设置为涵盖所需值范围的序列。

at