如何在R中的多个ggplot2图表中匹配颜色调色板?

4

虽然这个问题已经有一段时间了,但我知道我很快就会提取新数据,并希望找到如何用这种技术绘制它的方法。评论和答案中的人似乎有一个做法,但我无法从给我的资料中弄清楚。有其他人想试试吗?

我正在尝试绘制具有许多级别的因子变量的多个条形图。

首先,我生成一个数据框并创建一个因子,按数值大小降序排序(这样图表将从最高到最低移动)。然后,我想生成一个ggplot2对象,在这种情况下可以是gg1。这将自动为每个级别分配颜色并构建柱状图。然后,我创建gg2,它本质上与gg1相同,但排序方式不同。但是,ggplot2根据val的值自动分配颜色。我需要将颜色映射到字符串name,以便在多个ggplot对象中可以重复使用。

简而言之,问题是,在下面的示例中,仅轴刻度线值发生更改,而颜色没有发生更改。我尝试使用这里的方法,但没有效果。有什么想法吗?

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

1
你说“ggplot2会根据val的值自动分配颜色”,但是在你的例子中,你手动设置了颜色,通过指定“fill = val”来基于val设置颜色。我理解你的问题,即确保在数据集中a映射到相同的颜色,但目前你的示例代码并没有很好地表达它。 - Marius
这非常正确,可能是我表述不清或者没有提供正确的代码。这里的代码只是我在更大数据集中采用的方法的简化示例。当我说“自动分配颜色”时,我想表达的是它会从默认的fill调色板中为我选择实际的颜色映射;我没有提供自己的调色板映射。但我不太确定如何重新表述我的问题... - zap2008
只需像设置坐标轴一样,在刻度上设置限制即可。 - hadley
设置限制有什么帮助呢?我认为这是与“值”而不是“限制”有关的问题... - zap2008
1个回答

4

试试这个

test2 <- data.frame(name = c('a', 'b', 'c'),
                    val = c(3, 1, 2,3,2,1,1,2,3))

将标签添加到填充值

test2$val <- factor(test2$val,
                    levels = c(1,2,3),
                    labels = c("One", "Two","Three")) 
ggplot(data = test2) + geom_bar(aes(x = name,fill=val)) +
  scale_fill_manual(values = c('One' = "red", 'Two' = "orange", 'Three' = "blue"))

要在不同的图中使用颜色,您可以将值定义为变量。 - Keniajin
嗯,我不确定这个解决方案是否适用于我的问题,但是按照你的方式将“values”定义为文本可能是朝着正确方向迈出的一步。 - zap2008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接