今天这篇主要讲解R语言颜色综合运用,主要跟大家介绍如何提取那些专业色彩包中的颜色搭配用于在基础绘图系统和高级绘图系统中共享。
其实无论是R语言的预设配色系统、自定义颜色表还是哪些专属配色包,我们所使用(或者R语言识别的)的仅仅就是一组字符向量所代表的色值而已,并不神秘。
通过scales中的色彩获取函数,我们可以将专属配色主题(RColorBrewer、ggthemes)中的配色主题提取出来,以函数的形式传递给基础绘图系统(plot)以及ggplot绘图系统。
本文按照三部分进行讲解:
RColorBrewer部分:
ggthemes部分:
scales::brewer.pal运用:
RColorBrewer部分
关于RColorBrewer包之前在写ggplot函数系统的时候已经有所涉猎,其中专门讲解过它的官方配色网站:http://colorbrewer2.org/#
这是一个非常神奇的网站,RColorBrewer包中的配色方案全部来源于此,而且网站上允许自定义色彩序列和类型,衍生出来的颜色要比该包中的配色资源多出很多倍。
library(RColorBrewer)
display.brewer.pal(n, name)
display.brewer.all(type="all")
ColorBrewer设计团队将配色方案分为三种:
seq:连续渐变色
div:双向渐变色
qual:分类色
通过display函数可以查看不同类型的色板:
颜色查看:
display.brewer.all(type = "all") #查看所有色板
display.brewer.all(type = "seq") #查看单色渐变色板
display.brewer.all(type = "div") #查看双色渐变色板
display.brewer.all(type = "qual") #查看离散(分类)色板
以上通过display四个函数成功显示了全部色板、单色渐变色板、双色渐变色板、离散(分类)色板
当然你也可以通过display.brewer.pal(n, name)函数显示指定名称的颜色主题:
display.brewer.pal(9, "BuGn")
par(mfrow=c(1,5),mar=c(1,1,2,1),xaxs="i", yaxs="i")
mycolors<-brewer.pal(9, "BuGn")
barplot(rep(1,times=9),col=mycolors,border=mycolors,axes=FALSE, horiz=T,main="MyColors of BuGn ")
mycolors<-brewer.pal(9, "OrRd")
barplot(rep(1,times=9),col=mycolors,border=mycolors,axes=FALSE, horiz=T,main="MyColors of OrRd")
mycolors<-brewer.pal(9, "YlGn")
barplot(rep(1,times=9),col=mycolors,border=mycolors,axes=FALSE, horiz=T,main="MyColors of YlGn")
mycolors<-brewer.pal(9, "Oranges")
barplot(rep(1,times=9),col=mycolors,border=mycolors,axes=FALSE, horiz=T,main="MyColors of Oranges")
mycolors<-brewer.pal(9, "Blues")
barplot(rep(1,times=9),col=mycolors,border=mycolors,axes=FALSE, horiz=T,main="MyColors of Blues")
dev.off()
大家已经看到了,通过brewer.pal(n, "name")函数,可以很轻松的提取出你想要的配色主题。
如果你想要某个配色主题的其中几个色值,可使用如下方式提取:
display.brewer.pal(6, "BuGn")#按顺序提取前六个
如果想要提取某一组色彩主题不连续的颜色,可以使用文本函数:
library(scales)
a<-brewer.pal(9, "BuGn")
show_col(a[c(1,3,5,7,9)],labels=F)
通过向量合并,你还可以自己从色彩包中自定义色彩方案。
b1<-brewer.pal(9, "BuGn");b2<-brewer.pal(9,"Blues")
c<-c(b1[c(1,3,5,7,9)],b2[c(2,4,6,8)])
show_col(c,labels=F)
其实都是些很简单的文本函数组合,毕竟色彩方案在软件中也就是一组字符向量而已。
以上这些色彩方案可以很容易的应用到基础绘图系统和ggplot绘图系统中。
c<-c(50,30,50,70,90,40)
names(c)<-LETTERS[1:6]
mycolor<-brewer.pal(9,"Greens")
pie(sort(c,decreasing=T),labels=names(c),col=mycolor[c(3,5,5,6,7,9)],clockwise=T,radius=1,border=F)
library(ggplot2)
library(plyr)
mydata<-data.frame(c)
ggplot(data=mydata,aes(x=factor(1),y=c,fill=factor(c),order=desc(c)))+
geom_bar(stat="identity",width=1,col="white")+
coord_polar(theta = "y",start=0)+
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())+
scale_fill_brewer(palette="Greens",labels=c("E", "D", "A","C","F","B"))+
guides(fill=guide_legend(reverse=TRUE,title=NULL))
ggthemes部分:
接下来讲解ggthemes部分,其实ggthemes包原本是转为ggplot2包开发的辅助包(前面加的前缀——gg就可以看出来,这种包还有很多),里面提供了大量高质量的主题、颜色方案。其中就有我们所熟知的economist主题方案以及wsj方案,还有诸如stata、excel、tableau、solarized、tufte等主题方案。
ggthemes包中的色彩方案都是打包好,命名过的,所以我们引用的时候,只需赋值即可。
这里以economist和WSJ为例:
library(ggthemes)
m1<-economist_pal()(6)
show_col(m1)
mycolor<-m1<-economist_pal()(5)
pie(sort(c,decreasing=T),labels=names(6),col=mycolor,border=F,clockwise=T,init.angle=90,radius=1)
ggplot(data=mydata,aes(x=factor(1),y=c,fill=factor(c),order=desc(c)))+
geom_bar(stat="identity",width=1,col="white")+
coord_polar(theta = "y",start=0)+
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())+
scale_fill_economist(labels=c("E", "D", "A","C","F","B"))+
guides(fill=guide_legend(reverse=TRUE,title=NULL))
m2<-wsj_pal()(6)
show_col(m2)
mycolor<-m1<-wsj_pal()(6)
pie(sort(c,decreasing=T),labels=names(c),col=mycolor,border=F,clockwise=T,init.angle=90,radius=1)
ggplot(data=mydata,aes(x=factor(1),y=c,fill=factor(c),order=desc(c)))+
geom_bar(stat="identity",width=1,col="white")+
coord_polar(theta = "y",start=0)+
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())+
scale_fill_wsj(labels=names(c))+
guides(fill=guide_legend(reverse=TRUE,title=NULL))
其实关于economist和wsj的配色主题远不止这些元素,里面规定了详细的序列用色标准、线条用色标准、形状标准和背景色参考方案,这些信息,你可以通过使用ggthemes_data函数进行查看:
#WSJ背景色
ggthemes_data$wsj$bg
gray green blue brown
"#efefef" "#e9f3ea" "#d4dee7" "#f8f2e4"
#WSJ主题色
ggthemes_data$wsj$palettes #主题色
$rgby
yellow red blue green
"#d3ba68" "#d5695d" "#5d8ca8" "#65a479"
$red_green
green red
"#088158" "#ba2f2a"
$black_green
black gray ltgreen green
"#000000" "#595959" "#59a77f" "#008856"
$dem_rep
blue red gray
"#006a8e" "#b1283a" "#a8a6a7"
$colors6
red blue gold green orange black
"#c72e29" "#016392" "#be9c2e" "#098154" "#fb832d" "#000000"
#economist背景色:
ggthemes_data$economist$bg
#economist主题色:
ggthemes_data$economist$fg
也可以使用scales包中的show_col函数进行颜色的图形化输出:
显示主题颜色:
《华尔街日报》
show_col(ggthemes_data$wsj$bg) #背景色
show_col(ggthemes_data$wsj$palettes$rgby) #rgby
show_col(ggthemes_data$wsj$palettes$red_green) #red_green
show_col(ggthemes_data$wsj$palettes$black_green) #black_green
show_col(ggthemes_data$wsj$palettes$dem_rep) #dem_rep
show_col(ggthemes_data$wsj$palettes$colors6) #colors6
《经济学人》
show_col(ggthemes_data$economist$bg) #背景色
show_col(ggthemes_data$economist$fg) #主题色
show_col(ggthemes_data$economist$stata) #基于stata的配色方案
以上ggthemes包中的所有颜色,你都可以通过names_pal()(n)的格式进行提取,然后使用文本函数进行抽取、转化、合并,自由搭配出属于自己的专属配色方案
scales包的brewer_pal函数:
接下来的时间我会将全部精力放在brewer_pal函数上,告诉你为什么,因为这个函数是scales专门为图形标度所设置的颜色设置函数,而以上我们所述的RColorBrewer里面的brewer.pal以及ggthemes包中的names_pal函数,是用于提取自己的配色方案,适用范围较小。
library("scales")
brewer_pal(type = "seq", palette = 1, direction = 1)
该函数直接对接RColorBrewer包中的配色主题,但是增加了一些输出参数,可以对输出的主题进行更加灵活的自定义操作。
type设置颜色种类,palette设置色板(可以是字符名称,也可以是编号),direction设置颜色输出顺序(默认为原始顺序,-1代表倒序,对于连续渐变类型的色板比较重要)。
show_col(brewer_pal()(10))
show_col(brewer_pal("div")(5))
show_col(brewer_pal(palette = "Greens")(5))
可以看出来,brewer_pal()函数允许通过色板类型、色彩数据、主题类型进行筛选输出。
我们可以通过brewer_pal函数将色彩信息传递给指定向量,或者直接将brewer_pal指定给col或者fill等图表中的标度参数。
par(mfrow=c(1,2),mar=c(1,1,2,1),xaxs="i", yaxs="i")
pie(rep(1,times=6),labels="",col=brewer_pal(palette="Greens")(6),border=F,radius=1,clockwise=T)
pie(rep(1,times=6),labels="",col=brewer_pal(palette="Greens",direction =-1)(6),border=F,radius=1,clockwise=T)
因为ggplot中有专用于RColorBrewer的色彩主题函数scale_fill(colour)_brewer(),用于对接RColorBrewer中的色彩库,所以我们想要在ggplot图表系统中使用RColorBrewer中的配色主题,不必使用brewer_pal进行提取。
并且,brewer_pal函数内的参数,在scale_fill(colour)_brewer()函数内也可以使用,对色彩方案进行筛选、抽取。
library(Rmisc)
library(lattice)
p1<- ggplot(data=mydata,aes(x=factor(1),y=c,fill=factor(c),order=desc(c)))+
geom_bar(stat="identity",width=1,col="white")+
coord_polar(theta = "y",start=0)+
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
legend.position="top")+
scale_fill_brewer(palette="Greens",labels=names(c))+
guides(fill=guide_legend(reverse=TRUE,title=NULL))
p2<- ggplot(data=mydata,aes(x=factor(1),y=c,fill=factor(c),order=desc(c)))+
geom_bar(stat="identity",width=1,col="white")+
coord_polar(theta = "y",start=0)+
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
legend.position="top")+
scale_fill_brewer(palette="Greens",direction =-1,labels=names(c))+
guides(fill=guide_legend(reverse=TRUE,title=NULL))
multiplot(p1,p2,cols=2)
除此之外,还有一个叫ggtech的包,专门为ggplot2包提供科技公司风格配色方案。仔细看了包,没有取色函数,但是提供了全部的色值信息。
library(ggtech)
tech_key = list(airbnb = c("#FF5A5F","#FFB400", "#007A87", "#FFAA91", "#7B0051"),
facebook = c("#3b5998","#6d84b4", "#afbdd4", "#d8dfea"),
google = c("#5380E4", "#E12A3C", "#FFBF03","#00B723"),
etsy = c("#F14000", "#67B6C3", "#F0DA47", "#EBEBE6", "#D0D0CB"),
twitter = c("#55ACEE", "#292f33", "#8899a6", "#e1e8ed"))
show_col(tech_key$airbnb)
show_col(tech_key$facebook)
show_col(tech_key$google)
show_col(tech_key$etsy)
show_col(tech_key$twitter)
以上是今天所要讲的主要内容,因为关于这块儿的内容,非常丰富,我也只能涉略一点儿,想要了解更多的R语言配色知识,可以参考详细的官方文档。
其实这一系列内容还有一个姊妹篇(上篇《R预设配色系统及自定义色板》),推送在小魔方的个人公众号——“数据小魔方”上,主要内容是关于R语言预设的配色系统和目前可以调用的自定义颜色的调取与组合、转换等信息。如果你想要了解详情的话,可以去那里查看,阅读原文可以直达。
点击原文阅读该篇内容的姊妹篇:《R预设配色系统及自定义色板》
我是分割线~
欢迎关注魔方学院QQ群:
QQ群:
微信群:
本文分享自微信公众号 - 数据小魔方(datamofang)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。