我在 ggplot 中创建了一个热图,其中包含连续温度数据和scale_fill_viridis_c:
为了更容易阅读,我正在使用scale_fill_viridis_c和n.breaks测试分箱版本:
我的问题是,分箱热图图例显示所有级别标签,在本例中为每个级别。我更喜欢在图例中仅显示 5 或 6 个标签。我想要的是保持绘图中的分辨率为图例颜色,但只标记其中的一些(例如 0、3、6、9、12)。
我尝试使用 labels=c(0, 3, 6, 9, 12) 手动设置标签,但 R 抱怨中断和标签的长度不同。我想要这个,但不能拥有它......我也考虑过改变整个数据集,但不愿意,因为它很大,并且还包含温度以外的其他数据。
我知道我应该包含代码和数据的工作示例,但我希望我的问题足够简单,足以回答。我将不胜感激有关如何格式化分箱热图图例的任何帮助,以显示比中断数量更少的标签。
这是一个直接的问题,但一些示例代码肯定会让它变得更容易。这似乎是
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), "")
)