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

Pls*_*svn 7 plot r colors 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))
Run Code Online (Sandbox Code Playgroud)

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

当我用最后一个代码行中的"50"绘制我的数据帧为3时,我得到红色,白色和蓝色的可预测的R再循环行为,重复五次,第16个颜色条段为白色.将3更改为7会导致更多的红色和蓝色阴影创建2个重复颜色范围段,并在颜色范围尝试回收时留下两个微红色.这表明使这个数字更大可以使颜色更精细.但如果我输入一个大于16的数字,那就是我得到的16个彩色片段,从红色到白色均匀变换为蓝色.但是我希望色标更精细,并且在完美的世界中,将Z的零强制为白色.

到目前为止我对R的经验是,当我不能做到这么简单的事情时,我错过了一个非常基本的概念.它是什么?

chl*_*chl 11

就晶格而言,您可以使用RColorBrewer(甚至颜色空间)设置颜色调色板.使用@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)
Run Code Online (Sandbox Code Playgroud)

请注意,此处还需要通过插值来增加可用颜色的范围.另外,levelplot()你可能想玩cut=pretty=.

在此输入图像描述


Cha*_*ase 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")
Run Code Online (Sandbox Code Playgroud)


小智 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())
Run Code Online (Sandbox Code Playgroud)