ggplot2
找不到我生成的颜色,用于我想要生成的条形图的部分。
问题来自ggplot2
转换数字的方式和填充aes()中的参数以生成字符串,这些字符串用作在我生成的命名颜色向量中找到正确颜色的键。
似乎我的图中涉及的大数字变成科学记数法,从转换后的字符串中删除所有最右边的十进制零,而我生成的命名颜色矢量中的键始终保持2个第一个数字。
我在下面给出了一个简单的例子来说明我的问题
#!/usr/bin/Rscript
library(ggplot2)
frame = data.frame(
varA = c(5, 5, 5),
varB = c(1, 2, 3),
varC = as.factor(c(
4e+08,
1.05e+09,
1.75e+09
)),
varD = c(1, 1, 1)
)
colors = c("#BB0000", "#00BB00", "#0000BB")
names(colors) = c("4.00e+08.1", "1.05e+09.1", "1.75e+09.1")
plot = ggplot() +
guides(
fill = guide_legend(title = "varA")
) +
scale_fill_manual(
values = colors
) +
geom_bar(
data = frame,
aes(
varA,
varB,
group = interaction(varC, varD),
fill = interaction(varC, varD)
),
position = "dodge",
stat = "identity"
)
ggsave(file = "plot.svg", plot = plot, width = 4, height = 3)
导致这个数字:
这个简单示例的一个明显的解决方案是将红色键固定到" 4e + 08"而不是" 4.00e + 08",但这不适用于我的全面用例。首先是因为我没有对颜色进行硬编码,但是我从运行此脚本的上下文中生成它们。第二,因为我观察到有时ggplot2将我的一些数字保留为普通整数,有时它会将其他数字转换成科学记数法,我不知道这个决定的规则是什么。
我认为,有两种解决方案。
第一个是确保我生成的颜色矢量键与ggplot2查找颜色相同。这意味着我可以缓解上面确定的第二个问题,我找不到文档。
第二个(首选)解决方案是约束ggplot2格式化它使用的颜色键字符串的方式,以便它适合我提供的命名颜色矢量。我怀疑这第二个解决方案与限制ggplot2在图例中生成字符串的方式相同(更具体地说,它是如何处理数字格式的)但是我找不到任何关于它的信息。
我知道我可以给ggplot2一个简单的颜色矢量,它会按照命令每个条形的顺序获取颜色。我不能接受它,因为我想确保所有颜色从绘图到绘图都是一致的,即使我选择显示或隐藏其中一些条形。
因此我的问题是:
如果无法做到这一点,我在哪里可以找到ggplot2如何精确地将大数字转换(或不转换)成科学符号,以便生成正确的名称颜色向量?
<小时/> 版本信息:
R
v3.4.1
ggplot2
v2.2.1 答案 0 :(得分:0)
ggplot
在这里并没有真正的错。行为是由interaction
函数引起的,这会创建一个因子。更直接地说,它是由factor
(其为interaction
的基础)引起的,而as.character
只是调用> as.character(frame$varC)
[1] "4e+08" "1.05e+09" "1.75e+09"
。参见:
frame$group <- interaction(frame$varC, frame$varD)
colors <- setNames(c("#BB0000", "#00BB00", "#0000BB"), levels(frame$group))
ggplot(frame, aes(varA, varB, group = group, fill = group)) +
geom_col(position = 'dodge') +
scale_fill_manual(values = colors)
这可以解决你的问题:
Animal