【发布时间】:2013-12-17 02:50:42
【问题描述】:
这个问题已经有一段时间了,但我知道我很快就会提取新数据,我想弄清楚如何用这种技术绘制它。看起来 cmets and answers 中的人知道如何穿上它,但我无法完全弄清楚给我的东西。还有人想试试吗?
我正在尝试使用具有多个级别的因子变量绘制多个条形图。
首先,我生成一个 data.frame 并创建一个按数值降序排列的因子(以便绘图从最高移动到最低)。然后,我想生成一个 ggplot2 对象,在这种情况下可以是 gg1。这将自动为每个级别分配颜色并构建条形图。然后我创建 gg2,它本质上是相同的,但顺序不同。但是,ggplot2 根据val 的值自动分配颜色。我需要将颜色映射到字符串 name,以便在多个 ggplot 对象中重复使用。
简而言之,问题在于,在下面的示例中,只有轴刻度值发生了变化,而颜色也发生了变化。我尝试使用 here 方法无济于事。有什么想法吗?
library(ggplot2)
test1 <- data.frame(name = c('a', 'b', 'c'),
val = 1:3)
test1$name <- factor(test1$name,
levels = as.character(test1$name[order(-test1$val)]))
gg1 <- ggplot(data = test1) + geom_bar(aes(x = name, y = val, fill = val))
gg1
test2 <- data.frame(name = c('a', 'b', 'c'),
val = c(3, 1, 2))
test2$name <- factor(test2$name,
levels = as.character(test2$name[order(-test2$val)]))
gg2 <- ggplot(data = test2) + geom_bar(aes(x = name, y = val, fill = val))
gg2
这就是我尝试合并链接解决方案中建议的方法的方式:
g <- ggplot_build(gg1)
myPalette <- unique(g$data[[1]]["fill"])[, 1]
gg3 <- ggplot(data = test2) + geom_bar(aes(x = name, y = val, fill = val)) +
scale_fill_manual(values = myPalette)
gg3
【问题讨论】:
-
您说“ggplot2 根据 val 的值自动分配颜色”,但在您的示例中,您通过指定
fill = val手动将颜色设置为基于val。我确实理解您的问题,即确保a在数据集中映射到相同的颜色,但目前您的示例代码并没有达到应有的效果。 -
这是非常正确的,要么是措辞不佳,要么是我没有提供正确的代码。我在这里的代码只是我在更大数据集中采用的方法的一个简化示例。当我说“自动分配颜色”时,我想说它从默认的
fill调色板中为我挑选了实际的颜色映射;我没有提供我自己的调色板映射。我不太确定如何重新表述我的问题...... -
只需设置刻度的限制,就像设置轴一样。
-
设置限制有什么帮助?我认为这是
values的问题,而不是limit...