ggplot2条形图使用分散的颜色调色板

5
我目前在R中有这个条形图(使用ggplot2创建) enter image description here 我需要它变成这样: enter image description here 我尝试使用RColorBrewer包,但它无法工作,因为相应调色板中的最大颜色数量为11。有什么想法吗?
pal <- brewer.pal(11,"RdYlGn")
ggplot(data = bm_mod, aes(x = bm_mod$country, y = bm_mod$V)) + 
  geom_bar(stat = "identity", colour = pal, fill = pal) + coord_flip() + 
  labs(y="Under/over valuation in %", x="")

这里是数据:链接 更新: 我用了这段代码再次尝试:
ggplot(data = bm_mod, aes(x = country, y = V)) + 
  geom_bar(stat = "identity", fill = country, show_guide = FALSE) + 
  coord_flip() + scale_fill_manual(values = colorRampPalette(brewer.pal(11,"RdYlGn"))(nrow(bm_mod))) +
  labs(y="Under/over valuation in %", x="")

然而输出结果看起来非常奇怪。这是酿造器的问题还是其他错误?

3
除非您提供一个我们自己可以运行的可重现示例,否则帮助将会非常困难。 - joran
只是一个小提示 - 在您的美学中不需要放置 bd_mod$。您可以直接这样写,例如 ggplot(data = bm_mod, aes(x = country, y = V)) - Nick
@joran 我添加了数据集。 - SWR
@Henrik 抱歉,我已经更改了,但结果仍然相同。 - SWR
@Henrik 这会稍微改变颜色顺序,但仍然是我上面最后一张图片中的相同颜色。此外,我收到了以下警告消息:警告信息: 1:当ymin!= 0时,堆叠未定义 2:在col2rgb(colour,TRUE)中:col2rgb(0)已弃用 - SWR
显示剩余2条评论
3个回答

6

一些要点:

正如Nick指出的那样,您不应该使用bd_mod$来引用aes()内部的变量。指定data = bm_mod的整个目的是使您无需反复输入bm_mod$

其次,您尝试设置fill = pal有些混淆。在aes()之外指定美学意味着将其设置为特定值,因此只能使用单个值进行操作,例如fill = "blue"

您真正想要的是每个x值的不同填充,因此您应该将fill映射到country,然后在scale_fill_manual中设置颜色方案。

当您提出此类问题时,应始终提供可重现的示例。在这种情况下,非常容易,可以像这样:

df <- data.frame(x = letters,y = runif(26))

ggplot(df,aes(x = x,y = y)) + 
    geom_bar(aes(fill = x),stat = "identity",show_guide = FALSE) + 
    scale_fill_manual(values = colorRampPalette(brewer.pal(11,"RdYlGn"))(26))

我已经使用了colorRampPalette来插值你想要使用的调色板中的颜色。

谢谢。我尝试了一下,部分地起作用了。实际上颜色看起来并不像我需要的那样。我已经更新了我的帖子。 - SWR
2
@SWR 这并没有发挥作用是因为您仍然不理解“映射”和“设置”美学之间的区别。您仍在“设置”填充。您需要将其“映射”到aes()内部。请注意,我的代码中写着aes(fill = x)。您的fill = country是否在aes()内部呢? - joran

5

这里是一个使用假数据的例子。需要在美学中指定fill=V,就像Henrik指出的那样。然后你需要用scale_fill_XXXX来指定你想使用的颜色比例尺。

require(ggplot2)

set.seed(100)
fake.data = data.frame(country = LETTERS, V = runif(26, -40, 40))
fake.data$country = factor(LETTERS, LETTERS[order(fake.data$V)]) # reorder factors

ggplot(data = fake.data, aes(x = country, y = V, fill = V)) +
  geom_bar(stat = "identity") +
  scale_fill_gradient2(low="red", mid="yellow", high="green") +
  coord_flip() +
  labs(y="Under/over valuation in %", x="")

这将生成以下图表:

彩色条形图


0

定义11个区间并为它们分配颜色就足够了吗?试试这个:

intervals <- cut(bm_mod$V, 11)
ggplot(data=bm_mod, aes(x=country, y=V)) + 
    geom_bar(stat="identity", colour=pal[intervals], fill=pal[intervals]) +
        coord_flip() + labs(y="Under/over valuation in %", x="")

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