在R中重新调整颜色调色板

3

R语言中,我有一组围绕着0的数据云和一些围绕着1的数据,我想要“重新调整”我的颜色以区分更低的数字。这必须以彩虹形式进行,我不想要“离散颜色”。我尝试了在image.plot中使用breaks,但它不起作用。

  image.plot(X,Y,as.matrix(mymatrix),col=heat.colors(800),asp=1,scale="none")

我试过:

lowerbreak=seq(min(values),quantile2,len=80)
  highbreak=seq(quantile2+0.0000000001,max(values),len=20)
  break=c(lowerbreak,highbreak)
  ii <- cut(values, breaks = break, 
            include.lowest = TRUE)

  colors <- colorRampPalette(c("lightblue", "blue"))(99)[ii]

可能使用?colorRamp来插值颜色。 - Rui Barradas
我尝试了,但我还不知道该如何区分低价值。 - lgndrzzz
2个回答

2
使用colorRampPalette函数时,您可以设置bias参数来强调低(或高)值。例如:colorRampPalette(heat.colors(100),bias=3)将会使“ramp”侧重于较低的值,从而更容易区分它们。请注意保留HTML标签。

我必须设置一个太高的偏置,使得色带全部变成黄色而没有阴影。 - lgndrzzz

2
这里介绍一种使用“squash”库的方法。通过makecmap(),您可以指定颜色值和断点,并且还可以使用base参数指定对数拉伸。这有点复杂,但可以让您精确控制。我用它来给扭曲的数据上色,需要在“低端”获得更多定义。
为了实现彩虹调色板,我使用了内置的“jet”颜色函数,但您可以使用任何颜色集——我提供了一个使用“colorRampPalette”创建灰度斜坡的示例。
无论使用哪种渐变,都需要调整base值以进行数据优化。
install.packages("squash")
library("squash")

#choose your colour thresholds - outliers will be RED
minval=0   #lowest value to get a colour
maxval=2.0 #highest value to get a colour
n.cols=100 #how many colours do you want in your palette?
col.int=1/n.cols

#create your palette
colramp=makecmap(x=seq(minval,maxval,col.int),
                 n=n.cols,
                 breaks=prettyLog,
                 symm=F,
                 base=10,#to give ramp a log(base) stretch
                 colFn=jet,
                 col.na="red",
                 right=F,
                 include.lowest=T)

# If you don't like the colFn options in "makecmap", define your own!
#   Here's an example in greyscale; pass this to "colFn" above
user.colfn=colorRampPalette(c("black","white"))

假设您已经在程序中创建了上述的colramp, 下面是使用colramp绘制图表的示例:
varx=1:100
vary=1:100
plot(x,y,col=colramp$colors) #colors is the 2nd vector in the colramp list

要选择特定的颜色,可以通过从列表中进行子集选择,例如,colors[1:20](如果您尝试使用上面的示例,则第一个颜色将重复5次-不是真正有用的,但您可以理解逻辑并进行调整)。
在我的情况下,我有一个值网格,我想将其转换为彩色光栅图像(即对某些连续数据进行颜色映射)。以下是示例代码,使用一个虚构的矩阵:
#create a "dummy matrix"
matx=matrix(data=c(rep(2,50),rep(0,500),rep(0.5,500),rep(1,500),rep(1.5,500)),nrow=50,ncol=41,byrow=F)

#transpose the matrix
#  the output of "savemat" is rotated 90 degrees to the left
#  so savemat(maty) will be a colorized version of (matx)
maty=t(matx)

#savemat creates an image using colramp
savemat(x=maty,
    filename="/Users/KeeganSmith/Desktop/matx.png",
    map=colramp,
    outlier="red",
    dev="png",
    do.dev.off=T)

The resulting image of matx


1
你怎么在绘图函数中使用colramp? - Herman Toothrot
1
我已经编辑了我的回答,包括一个简单绘图和简单矩阵转光栅图像创建的示例代码。 - Keegan Smith

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