如何将 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 可能不是蓝色背景上的最佳颜色,因为对比度不是很好。您可能想选择其他颜色。
为了明确颜色,将它们作为命名向量传递。
这里还有几点:
- A
geom_bar
with stat = "identity"
只是一个很长的写法 geom_col
- 您无需为文本的 y 位置手动编码。只需在
geom_text
内使用 position_stack(vjust = 0.5)
即可获得中央栏标签
- 如果您的图层都使用相同的数据和 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)
对于条形图,我想按自定义顺序垂直堆叠条形组件。在下面的示例中,应该控制堆叠顺序的变量是“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 可能不是蓝色背景上的最佳颜色,因为对比度不是很好。您可能想选择其他颜色。
为了明确颜色,将它们作为命名向量传递。
这里还有几点:
- A
geom_bar
withstat = "identity"
只是一个很长的写法geom_col
- 您无需为文本的 y 位置手动编码。只需在
geom_text
内使用position_stack(vjust = 0.5)
即可获得中央栏标签 - 如果您的图层都使用相同的数据和 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)