在R中绘图时如何使颜色平滑变化

how to make colors change smoothly when plotting in R

ENV

R 3.3.1

小数据

rdn<-c(0.8,1.8,2.8)
tdn<-c(1,2,3,4,5,6,7,8,9)

idn<-matrix(c(0.3, 0.3, 0.3, 0.2, 0.2, 0.4, 0.1, 0.1, 0.5, 0, 0.2, 0.5, 0, 0.3, 0.6, 0, 0.4, 0.6, 0, 0.4, 0.6, 0, 0.5, 0.7, 0, 0.5, 0.7), nrow=9, ncol=3, byrow=T)

我现在拥有的:

代码

filled.contour(tdn, rdn, idn,
    color.palette=colorRampPalette(c("blue","yellow","red")), 
    plot.title=title(main="Detail", sub="detail", 
                    xlab="t", ylab="lambda"), 
    plot.axes = { axis(side = 1, at = tdn, labels = tdn)
                  axis(side = 2, at = rdn, labels = rdn) },
    key.title=title(main="ratio"),
    key.axes = axis(4, seq(0, 1, by = 0.1)))

当前结果

问题

颜色范围不是我想要的。颜色之间存在边界,因此颜色不会从深蓝色平滑地变为深红色。

预计

问题

在 R 中绘图时,如何使颜色像我的 Expeced 图那样平滑变化?如何消除上述问题? rainbow 也不适合我。谢谢。

编辑

遵循 Haboryme 的解决方案

前景没有消失。

不幸的是,filled.contour ...

  • 固定了图和键之间 levels/colours 的数量,因此用 nlevels 参数(和 col 而不是 color.palette)进行试验结果在一个奇怪的输出中(更平滑的图像,但不可读的键)。

  • 另外,轮廓线不能修改。因此,增加到 200 级(在您的示例中从最初的 14 级)仍然是 'readable',但是更高的值会产生不需要的 side-effects。

示例:

n <- 200
filled.contour(tdn, rdn, idn,
               col=colorRampPalette(c("blue","yellow","red"))(n),
               levels = seq(0,1,length.out = n),
               plot.title=title(main="Detail", sub="detail", 
                                xlab="t", ylab="lambda"), 
               plot.axes = { axis(side = 1, at = tdn, labels = tdn)
                   axis(side = 2, at = rdn, labels = rdn) },
               key.title=title(main="ratio"),
               key.axes = axis(4, seq(0, 1, by = 0.1)))

输出:

也许尝试 lattice::levelplot 可以解决问题。至少对于图例颜色键,更高的级别不会打扰。但是图片不是'smoothed'.

示例:

library(lattice)
levelplot(idn, row.values = tdn, column.values = rdn, cuts = n, col.regions = colorRampPalette(c("blue","yellow","red"))(n))

输出:

接近@setempler 的答案,但您可能会发现它更接近您的预期输出:

par(fg = NA,col="black")
filled.contour(x=tdn,
               y=rdn,
               z=idn,
               color.palette=colorRampPalette(c("blue","yellow","red")), 
               plot.title=title(main="Detail", sub="detail", 
                                xlab="t", ylab="lambda"), 
               nlevels=200,
               plot.axes = { axis(side = 1, at = tdn, labels = tdn)
                 axis(side = 2, at = rdn, labels = rdn) },
               key.title=title(main="ratio"),
               key.axes = axis(4, seq(0, 1, by = 0.1)))