ggplot2:使用一组相似颜色绘制离散因子

ggplot2: Plot discrete factors with a set of similar colours

提问人:Marius 提问时间:7/24/2012 更新时间:7/24/2012 访问量:8555

问:

在绘制数据集时,我试图想出一种一致的方式来表示数据集中的每个因素。因此,例如,每次绘制涉及词性的内容时,我都可以用不同深浅的蓝色表示“词性”的级别:

eg.dat <- data.frame(rt=c(530, 540, 555), 
                     part.of.speech=c("Verb", "Noun", "Both")
                     )

ggplot(eg.dat, aes(part.of.speech, rt, fill=part.of.speech)) +
  geom_bar(stat="identity", colour="black") +
  scale_fill_manual(values=c("cyan", "blue", "darkblue")) 

Specifying colours manually

然而,为每个因素想出这样花哨的颜色名称是很困难的,所以我一直在寻找更自动化的解决方案。一个相当黑客的解决方法是使用:alpha

ggplot(eg.dat, aes(part.of.speech, rt, alpha=part.of.speech)) +
  geom_bar(stat="identity", colour="black", fill="blue") +
  scale_alpha_discrete(range=c(0.4, 1))

Using alpha

但我一直在想,有没有更简单的方法来选择像这样短范围的相似颜色。中的类型函数不能处理这样的离散因子,并且从 或 中获取自定义颜色似乎不是特别容易。理想的函数是这样的:,返回颜色值。对实现这一目标的最佳方法有什么建议吗?scale_colour_gradientggplot2rainbowheat.colorsshades(n, central_colour="blue")n

R ggplot2

评论

1赞 mnel 7/24/2012
?scale_fill_brewer使用实现网站 http://colorbrewer2.org/ 上显示的想法的包。RRColorBrewer
0赞 mnel 7/24/2012
甚至更好?scale_fill_hue
0赞 sebastian-c 7/24/2012
顺便说一句(我知道,我是“那个人”),通常不建议使用这样的颜色(词性已经由不同的列分隔),因为它会分散对价值观的注意力。看看这个pdf第2页和第3页的条形图:perceptualedge.com/articles/visual_business_intelligence/...
0赞 Marius 7/24/2012
@sebastian-c 这里完全是多余的,但是当我到达我绘制的地步时,例如,为每个词性绘制单独的回归线,我觉得它对我和读者都有帮助为该因素建立一个表示方案。

答:

10赞 mnel 7/24/2012 #1

scale_fill_discrete或者会这样做。您可以定义 和 (色调、色度和亮度)。有关详细信息,请参阅scale_fill_huehcl?hcl

例如。

ggplot(eg.dat, aes(part.of.speech, rt, fill=part.of.speech)) +
     geom_bar(stat="identity", colour="black") +
     scale_fill_discrete( h =c(220,260))

enter image description here

scale_fill_hue将给出相同的结果(在本例中)。

您还可以使用该包并访问 colorbrewer 调色板scale_fill_brewerRColorBrewer

ggplot(eg.dat, aes(part.of.speech, rt, fill=part.of.speech)) +
     geom_bar(stat="identity", colour="black") +
     scale_fill_brewer(palette = 'Blues')

enter image description here

评论

0赞 Marius 7/24/2012
我们在这里可能走得太远了,但对我来说,你得到的色调似乎不如——要么它们太相似,要么它们变得不那么明显,它们是相同颜色的色调。其中一个副作用可能是色度和亮度正在发生变化,可惜你不能做同样的事情。scale_fill_huescale_fill_alphaalphascale_fill_hue
0赞 mnel 7/24/2012
您必须使用 h、c 和 l 才能获得“良好”范围。这种方法更简单,因为调色板是预定义的,并且是科学研究的结果,以获得最佳颜色。brewer
2赞 bdemarest 7/24/2012
@Marius,Color Brewer 调色板经过优化,可连续且分离良好。您可以通过更改调色板编号轻松尝试所有 19 种可能性:sequentialscale_fill_brewer(type="seq", palette=1)