【问题标题】:Add customised colour ramp as legend添加自定义色带作为图例
【发布时间】:2018-07-27 21:38:48
【问题描述】:

我使用image() 函数创建了六个带有 R 基础图形的热图。它们在 y 轴上显示深度,在 x 轴上显示时间。 z 值是温度。此外,您还可以看到一些带有标签的等高线,以°C 为单位指示温度。 由于每个图都来自具有略微不同温度范围的不同数据框,因此我必须确保使用相同的颜色以一致的方式显示温度。因此,我定制了一个色标cols,显示蓝色端的低温和红色端的高温。对于六个数据帧中的每一个,我将它们的最低和最高温度对齐在预定义的最大值和最小值cols。请参阅下面左上角数据帧 RW1-iBA 的代码示例。

# Customise colour scale    
RColorBrewer::display.brewer.all()
cols = rev(colorRampPalette(RColorBrewer::brewer.pal(11,"RdYlBu"))(2000))

# Define temperature range for cols
min.cols.temp <- -23
max.cols.temp <- 23

# Define min and max temperatures for RW1-iBA
max_temp <- max(RW1_iBA$temp)
min_temp <- min(RW1_iBA$temp)

# Align RW1-iBA along cols
lowerend.RW1_iBA <- round(min_temp/min.cols.temp*1000)
upperend.RW1_iBA <- round(max_temp/max.cols.temp*1000)
trunc.low.RW1_iBA <- 1000-lowerend.RW1_iBA
trunc.upp.RW1_iBA <- 1001+upperend.RW1_iBA
col.RW1_iBA <- cols[-c(1:trunc.low.RW1_iBA, trunc.upp.RW1_iBA:2000)]

我在这里所做的基本上是将cols 的上限和下限分别设置为 23 和 -23,确保这些值代表所有数据帧的完整温度范围。然后,我将每个数据帧的温度值沿色标分别对齐,方法是分别剪掉超过数据帧最大值和低于其最低温度值的cols 部分。这为我提供了六种不同的色标(上图:col.RW1_iBA),用于分别绘制每个数据帧。

我现在缺少的是 cols 作为图例添加到情节中。秤本身是这样的:

plot(rep(1, 2000), col = cols, pch = 16)

我用布局矩阵设置了上面的六个图,如下所示:

layoutMatrix
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    7
[3,]    3    6    7

点 1 到 6 被您在上面看到的六个地块占据。第 3 列(包含“绘图”7)的边距已经设置得更小,我想在其中垂直添加 cols 作为图例。充其量它具有温度值 20、10、0、-10、-20 的刻度线和标签以及温度 (°C) 之类的标题。知道我该怎么做吗?

【问题讨论】:

    标签: r plot layout colors legend


    【解决方案1】:

    好的,在this post 的帮助下解决了这个问题,this post 使用自定义函数绘制比例尺。我只需要删除dev.new() 调用以避免在新设备中绘制色标。该功能很灵活,但您仍然需要使用par(mar = c()) 参数来调整垂直条的宽度和高度。

    【讨论】:

      【解决方案2】:

      这里有一段代码可能会有所帮助:

      mat = cbind(1:3, 4:6, 7)
      layout(mat, width = c(1,1,.25))
      pal =  colorRampPalette(c("white", "black"))(100)
      # empty plots
      for (i in 1:6) image(matrix(runif(100), 10), col = pal)
      # color scale
      par(las=1, mar = c(4, 1, 4, 5))
      image(t(1:100), col = pal, axes = F, ann = F)
      axis(4)
      par(las=0)
      mtext(4, text = "new_ylab", line = 3)
      

      您可能需要调整边距!

      【讨论】:

        猜你喜欢
        • 2013-06-10
        • 2019-02-17
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        相关资源
        最近更新 更多