【问题标题】:creating a more continuous color palette in r, ggplot2, lattice, or latticeExtra在 r、ggplot2、lattice 或 latticeExtra 中创建更连续的调色板
【发布时间】:2011-09-05 02:47:18
【问题描述】:

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

我正在尝试绘制数千个 (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 的体验是,当我不能做这么简单的事情时,我错过了一个非常基本的概念。这是什么?

【问题讨论】:

    标签: r colors plot ggplot2 lattice


    【解决方案1】:

    就 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=

    【讨论】:

      【解决方案2】:

      你看过 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")
      

      【讨论】:

      • 感谢大通的推动是这个方向。
      【解决方案3】:

      您缺少的“概念”是 levelplot()at 参数,它定义了颜色级别和/或轮廓线之间的断点。默认值为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())
      

      【讨论】:

        猜你喜欢
        • 2021-02-22
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 2015-08-24
        • 2018-07-29
        • 2012-08-08
        • 1970-01-01
        • 2017-06-15
        相关资源
        最近更新 更多