使用连续但分箱数据的热图自定义带有离散标签的图例

问题描述 投票:0回答:1

我在 ggplot 中创建了一个热图,其中包含连续温度数据和scale_fill_viridis_c:

为了更容易阅读,我正在使用scale_fill_viridis_b和n.breaks测试分箱版本:

我的问题是,分箱热图图例显示所有级别标签,在本例中为每个级别。我更喜欢在图例中仅显示 5 或 6 个标签。我想要的是保持绘图中的分辨率为图例颜色,但只标记其中的一些(例如 0、3、6、9、12)。

我尝试使用 labels=c(0, 3, 6, 9, 12) 手动设置标签,但 R 抱怨中断和标签的长度不同。我想要这个,但不能拥有它......我也考虑过改变整个数据集,但不愿意,因为它很大,并且还包含温度以外的其他数据。

我知道我应该包含代码和数据的工作示例,但我希望我的问题足够简单,足以回答。我将不胜感激有关如何格式化分箱热图图例的任何帮助,以显示比中断数量更少的标签。

r heatmap continuous legend-properties discrete
1个回答
0
投票

这是一个直接的问题,但一些示例代码肯定会让它变得更容易。这似乎是

scale_fill_manual()
的工作。在下面的情况下,我随机制作一个 10x10 栅格并仅标记第 5 个和第 9 个容器:

library(ggplot2)
rows <- 10
cols <- 10

data <- expand.grid(
  x = 1:cols,
  y = 1:rows
)

data$value <- sample(0:13, nrow(data), replace = TRUE)

# Only show 5 and 9 as labels in the legend
legend_labels <- c(5, 9)

# make a heatmap/raster in ggplot
heatmap <- ggplot(data, aes(x = x, y = y, fill = as.factor(value))) +
  geom_raster() +
  scale_fill_manual(
    values = rainbow(14, start = 0, end = 1),
    breaks = as.character(0:13),
    labels = ifelse(as.integer(as.character(0:13)) %in% legend_labels, as.character(0:13), "")
  )

我使用

rainbow()
来近似你的调色板,但你也可以这样做:

#clearly this sample will not run due to the ellipsis in manual_colors
manual_colors <- c("0" = "darkblue", "1" = "blue"... same for 2 thru 12..., "13" = "darkred") 

heatmap <- ggplot(data, aes(x = x, y = y, fill = as.factor(value))) +
  geom_raster() +
  scale_fill_manual(
    values = manual_colors,
    breaks = as.character(0:13),
    labels = ifelse(as.integer(as.character(0:13)) %in% legend_labels, as.character(0:13), "")
  )
© www.soinside.com 2019 - 2024. All rights reserved.