警告......非常新手问题如下:
我试图绘制几个(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的经验是,当我无法做到这么简单的事情时,我错过了一个非常基本的概念。它是什么?
答案 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=
。
答案 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