如何将 geom_text 颜色映射到变量

How to map geom_text color to a variable

对于条形图,我想按自定义顺序垂直堆叠条形组件。在下面的示例中,应该控制堆叠顺序的变量是“mechanism”。预期的堆叠顺序既不是字母顺序也不是数据框行的排序顺序。并非所有的酒吧都有所有的机制。我手动设置序列并将序列用作因子的水平。完全缺失的因子水平没有得到正确处理,欢迎提出解决方案,但我可以解决这个问题。

为了添加指示每个分量大小的文本标签,我计算了标签的 y 高度值并添加了 geom_text。我希望文本的颜色与条形组件的颜色形成一致的对比:蓝色条形组件上的白色文本等。所以我将 geom_text 的颜色分配给与 [=26= 相同的变量]的填补。但是背景和文本的预期颜色配对不会保持匹配。请出出主意?? (感谢小编插入乱图图)

期望的结果是机制为“热”的每个条形组件都将用黑色文本注释为红色填充。机制为“城市”的每个组件都将用 tan4 填充并用 grey50 文本进行注释。

我也试过在不将映射变量变成一个因子的情况下分配颜色(示例选项 1),如

library(ggplot2)
m.data <- data.frame(m.model = factor(c(1, 1, 2, 2, 4)),
   mechanism = c("urban", "hot", "hot", "urban", "urban"),
   bar.height = 1:5,
   y.for.text = c(.5, 2, 1.5, 5, 2.5))
mechanism.order <- c("hot", "dry", "urban")
mechanism.colors <- c("red", "blue", "tan4")
text.colors <- c("black", "white", "grey50")

m.map <- ggplot() +
   geom_bar(data = m.data, aes(x = m.model, y = bar.height, 
      fill = factor(mechanism, levels = mechanism.order)), 
      stat = "identity") +
   scale_fill_manual(values = mechanism.colors) +
   scale_color_manual(values = text.colors) 

# option 1:
m.map +    
   geom_text(data = m.data, aes(x = m.model, y = y.for.text,
      color = mechanism, label = bar.height)) 
   
# option 2:
m.map +    
   geom_text(data = m.data, aes(x = m.model, y = y.for.text,
      color = factor(mechanism, levels = mechanism.order), 
      label = bar.height))

我不确定我是否理解您想要的输出,但也许这会有所帮助:

我稍微更新了您的 ggplot 调用:如果您在初始 ggplot 调用中提供了 aes(),则之后无需重复。此外,无需将 factor() 添加到 fill = 语句。在 geom_text 中,将 color = mechanism 放入 aes() 中,这样您可以在之后使用 scale_color_manual 访问它以添加您的自定义颜色。最后,您可以添加 position = position_stack 以获得中间的文本。

ggplot(m.data, aes(m.model, bar.height, fill = mechanism)) +
  geom_bar(stat = "identity") +
  scale_fill_manual(values = mechanism.colors) +
  geom_text(aes(label = bar.height, color = mechanism), position = position_stack(.5)) +
  scale_color_manual(values = c("black", "grey50 "))

输出:

但是,如您所见,灰色 40 可能不是蓝色背景上的最佳颜色,因为对比度不是很好。您可能想选择其他颜色。

为了明确颜色,将它们作为命名向量传递。

这里还有几点:

  1. A geom_bar with stat = "identity" 只是一个很长的写法 geom_col
  2. 您无需为文本的 y 位置手动编码。只需在 geom_text 内使用 position_stack(vjust = 0.5) 即可获得中央栏标签
  3. 如果您的图层都使用相同的数据和 x、y 变量,请通过初始 ggplot 调用传递它们并让图层继承它们
mechanism.colors <- c(hot = "red", dry = "blue", urban = "tan4")
text.colors <- c(hot = "black", dry = "white", urban = "gray50")

ggplot(data = m.data, aes(x = m.model, y = bar.height)) +
   geom_col(aes( fill = factor(mechanism, levels = mechanism.order))) +
   geom_text(aes(label = bar.height, color = mechanism),
             position = position_stack(vjust = 0.5), size = 8) +
   scale_fill_manual(values = mechanism.colors) +
   scale_color_manual(values = text.colors) +
   labs(fill = "mechanism") +
   guides(color = guide_none())

建议修改数据。亲爱的@Alan Cameron 已经介绍了大部分程序。新的是在ggplot之前转换为因子:

m.data <- data.frame(m.model = factor(c(1, 1, 2, 2, 4)),
                     mechanism = c("urban", "hot", "dry", "urban", "urban"),
                     bar.height = 1:5,
                     y.for.text = c(.5, 2, 1.5, 5, 2.5))
mechanism.order <- c("hot", "dry", "urban")
mechanism.colors <- c("red", "blue", "tan4")
text.colors <- c("black", "white", "grey50")
library(tidyverse)

m.data %>% 
  mutate(mechanism = factor(mechanism, levels = mechanism.order)) %>% 
  ggplot(aes(x=m.model, y=bar.height, fill=mechanism))+
  geom_col()+
  geom_text(aes(label = bar.height, color = mechanism),
            position = position_stack(vjust = 0.5)) +
  scale_fill_manual(values = mechanism.colors) +
  scale_color_manual(values = text.colors)