3

在ggplot2/geom_tile中,如何更改超出限制的填充颜色?由于图像,Region_4/5不在limis(1,11),所以填充颜色默认为灰色,如何将'Region_4'更改为'darkblue','Region_5'更改为'黑色的' 。谢谢!

library(tidyverse)
library(RColorBrewer)
tile_data <- data.frame(category=letters[1:5],
                        region=paste0('region_',1:5),
                        sales=c(1,2,5,0.1,300))


tile_data %>% ggplot(aes(x=category,
                         y=region,
                         fill=sales))+
  geom_tile()+
  scale_fill_gradientn(limits=c(1,11),
                       colors=brewer.pal(12,'Spectral'))+
  theme_minimal()

在此处输入图像描述

4

2 回答 2

1

如果您想保持渐变比例并为上下限制设置两个额外的离散值,我认为最简单的方法是为“限制”和“限制”值设置单独的填充比例。这可以通过在数据子集上单独调用 geom_tile 以及使用 {ggnewscale} 等包来完成。

我认为将离散的“禁区”放在渐变色条的各个极端是有意义的。然后您需要三个geom_tile调用和三个scale_fill调用,并且您需要在每个scale_fill调用中指定引导顺序。然后,您将需要使用图例边距,但让它看起来不错并不是一个大问题。

library(tidyverse)
library(RColorBrewer)
tile_data <- data.frame(
  category = letters[1:5],
  region = paste0("region_", 1:5),
  sales = c(1, 2, 5, 0.1, 300)
)


ggplot(tile_data, aes(
  x = category,
  y = region,
  fill = sales
)) +
  geom_tile(data = filter(tile_data, sales <= 11 & sales >=1)) +
  scale_fill_gradientn(NULL,
    limits = c(1, 11),
    colors = brewer.pal(11, "Spectral"),
    guide = guide_colorbar(order = 2)
  ) +
  ggnewscale::new_scale_fill() +
  geom_tile(data = filter(tile_data, sales > 11), mapping = aes(fill = sales > 11)) +
  scale_fill_manual("Sales", values = "black", labels = "> 11", guide = guide_legend(order = 1)) +
  ggnewscale::new_scale_fill() +
  geom_tile(data = filter(tile_data, sales < 1), mapping = aes(fill = sales < 1)) +
  scale_fill_manual(NULL, values = "darkblue", labels = "< 1", guide = guide_legend(order = 3)) +
  theme_minimal() +
  theme(legend.spacing.y = unit(-6, "pt"), 
        legend.title = element_text(margin = margin(b = 10)))

reprex 包于 2021-11-22 创建(v2.0.1)

于 2021-11-22T12:59:14.793 回答
1

您可以尝试scales::squish,定义限制,并将超出范围 (oob) 的值放入 scalw:

p = tile_data %>% ggplot(aes(x=category,y=region,fill=sales))+ geom_tile()
p + scale_fill_gradientn(colors = brewer.pal(11,"Spectral"),
limit = c(1,11),oob=scales::squish)

在此处输入图像描述

于 2021-11-22T10:06:58.477 回答