7

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

我正在尝试绘制数千个(X,Y)点的相当规则的分布,每个点都与一个值相关联,我们称之为 Z,它在 -20 到 +20 之间非常不规则地变化。我对平滑不感兴趣;我希望根据平滑变化的调色板绘制点 Z 值,就像 Gnuplot 可以使用适当的平滑调色板一样。我已经尝试过 base 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 的经验是,当我不能做这么简单的事情时,我错过了一个非常基本的概念。它是什么?

4

3 回答 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=

在此处输入图像描述

于 2011-05-31T06:55:48.520 回答
7

你看过scale_gradientggplot吗?或者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")
于 2011-05-31T00:04:41.593 回答
6

您缺少的“概念”是定义颜色级别和/或轮廓线之间断点的at参数。levelplot()默认情况下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())
于 2011-05-31T11:52:05.470 回答