1、画图前的准备:自定义ggplot2格式刷 1)简单柱形图+文本(单一变量) 前言这篇文章其实是我之前那篇博文的一个延续。因为接了一个活要用R定制化数据报表,其中涉及大量的对图表精雕细琢的工作。在深入研究ggplot2时,深深感觉到用ggplot2画图与用excel画图的不一样。 如果要用ggplot2画图,还是需要了解很多技术细节的。这些细节要么散落在R可视化技术和ggplot2:数据分析与图表技术这两本书里,要么散落在网上。因此在这里以我学习和总结的过程,对ggplot2的精细化画图做一个阐述,介绍我整理后的作图理念。 如果有进一步学习需要的各位,请直接买书或者自己实践学习。很多技术细节需要自己摸索才知道的,祝大家好运。 1、画图前的准备:自定义ggplot2格式刷在画图前,我们首先定义一下ggplot2格式刷。 首先,ggplot2本身自带了很漂亮的主题格式,如theme_gray和theme_bw。但是在工作用图上,很多公司对图表格式配色字体等均有明文的规定。像我们公司,对主色、辅色、字体等都有严格的规定。如刘万祥老师早期的一篇配色博文里,大家更是可以看到,很多商业杂志的图表,配色风格都是非常相近的。因此,修改主题,使其更加适合我们的商业需求,保持图表风格统一,是非常必要的。 虽然ggplot2可以通过代码的追加,细细修改表距、背景色以及字体等框架。但是如果每做一个图,都要如此细调,代码将会非常繁琐,而且万一老板突然兴起要换风格时,代码修改将会非常痛苦。 幸运的是,ggplot2允许我们事先定制好图表样式,我们可以生成如mytheme或者myline这样的有明确配色主题的对象,到时候就像excel的定制保存图表模板或者格式刷,直接在生成的图表里引用格式刷型的主题配色,就可以快捷方便的更改图表内容,保持风格的统一了。 在运行之前,首先加载相关包 library(ggplot2) library(dplyr) library(ColorBrewer) library(tidyr) library(grid) #载入格式刷 ###### #定义好字体 windowsFonts(CA=windowsFont("Calibri"))
接下来是一个示范。我首先共享了我常用的一个主题刷,配色参考以下: 主体色:蓝色 085A9C ,红色 EF0808,灰色 526373 定制了mytheme, myline_blue, mycolour等多个对象: 1
把以上代码在R里面运行以后,就可以直接使用了。譬如以下: 1)先生成一个简单的图表: #未使用格式刷 p<-ggplot(iris,aes(x=species,y=sepal_length)) +geom_bar(stat="identity")+ ggtitle("sepal_length by species") p 简单地指定x轴为离散型变量species,y为求和,会得到下面的柱形图 这时候,套用一下之前设置好的主题(mytheme),背景、坐标轴还有字体颜色就相应改变了。 p+mytheme 然后,因为之前格式刷部分我设定了一个蓝色的柱形图样式(mybar),这里直接引用的话,就可以直接生成蓝色的柱形图了。 ggplot(iris,aes(x=species,y=sepal_length)) +ggtitle("sepal_length by species")+mybar+mytheme 2、画图前的准备:数据塑形利器dplyr / tidyr有了事先设定的一些格式刷以后,我们就可以快速有效地作图了。 但是在作图之前,就像excel作图总要先把数据用处理成想要的形式 。在excel里面,我们常用的是数据透视表或者一些公式辅助,而在R里,则是用一些常用的包,如dplyr及tidyr,对数据进行重塑再造 在我之前看的那两本ggplot2的书里,基本用的都是reshape2+plyr的组合。但实际上hadley后续出的dplyr与tidyr更加有用。具体的使用方法,在JHU Getting and cleaning data有介绍,老师还编了一个swirl课程供人使用,安装方法如下。 install.packages("swirl") library(swirl) #安装getting and cleaning data相关的课程教学包 install_from_swirl("Getting and Cleaning Data") swirl() 其他的也可以参考我这篇博文 总之,用好dplyr的话,你可以快速的把一些数据,如下面的股票逐笔成交记录 data #刚刚演示的那些数据,在预测者网可以下载 data %>% group_by(Price,BuySell) %>% summarize(Money=sum(Money,na.rm=TRUE)) %>% spread(BuySell,Money) 要想做好ggplot2的图,对数据快速进行塑形的方法是我们必须要掌握的。上面的s wirl课程非常有用,而且值得是最新的一个技术方法,值得大家学习。 3、常用的商业用图接下来分享一下我在这次作图过程中,最常用的几个图形的代码。首先声明,这些图形的进一步做法以及变形,基本都可以在这两本参考书籍里(R可视化技术 | ggplot2:数据分析与图表技术 )找到。我这里更多的摘取一些我比较常用的图表进行讲解 1、简单柱形图+文本(单一变量) 在作图之前,首先讲一下ggplot2的局限。 ggplot2最大的局限是,它基本不支持双坐标图和饼图。即使能做这些图形,也要很多设置,做起来非常繁琐。
大神有技术就能任性。即使一堆人在他那回复下面各种求双坐标。。不知道Hadley现在有没有改变主意,把双坐标列为ggplot2的下一个更新点。但是如果你想画双坐标图或者饼图,至少经个人的实践,这些都是比较困难的,设置繁琐而且不美观。要么选择用excel完成,要么听大神的话,用分面图(facet)或者柱形图代替,会更加省事一些。 所以,在了解以下常用图形前,我们需要记住,ggplot2不是万能的,它虽然能做出非常美观的图表,但是总有一些图不能做,因此多个工具结合使用是非常必要的。 在知道以上前提下,我们以ggplot2自带的diamonds数据集为基础,结合dplyr/tidyr的应用,介绍一下常用图形的画法。 然后来讲一下除了双坐标图和饼图以外,ggplot2可以支持的常用图形的画法。数据的话,我们使用ggplot2自带的数据包diamonds 首先定义一下 mytitle="演示:以diamond为例" 1)简单柱形图 data1<-diamonds %>% group_by(cut) %>% summarize(avg_price=mean(price)) 柱形图<-ggplot(data1,aes(x=cut,y=avg_price,fill=as.factor(cut)))+ mytitle+mybar+mytheme+ geom_text(aes(label=round(avg_price)),vjust=1,colour="white") 2)带分类的柱形图 举个例子来说,在有时候,我们想要快速绘图。使用facet_wrap或者facet_grid可以快速绘制相应图形。这也是ggplot2不太支持双坐标的原因:可以快速绘图,就不需要做那么多无用功了。 #dplyr处理数据 data2<-diamonds %>% group_by(cut,color) %>% summarize(avg_price=mean(price)) #画图,套用设定好的绘图元素 ggplot(data2,aes(x=color,y=avg_price))+facet_wrap(~cut,ncol = 2)+ mytitle+mybar+mytheme #在facet_wrap里面,如果加上scales="free"的话,坐标就不一样了。
3)簇型图 代码如下: data3<-diamonds %>% filter(cut %in% c("Fair","Very Good","Ideal")) %>% group_by(cut,color) %>% summarize(avg_price=mean(price)) #簇状图 簇状柱形图<-ggplot(data3,aes(x=color,y=avg_price,fill=cut))+ geom_bar(stat="identity",position="dodge")+ mytheme+mytitle+mycolour_3 簇状柱形图 这里如果想要定义颜色的相应顺序的话,可以使用factor 譬如以下,只是用这行代码对颜色重新定义一下,用levels改变factor顺序,再画图的时候,颜色以及柱子顺序就会跟着改变了。非常方便。 data3$cut<-factor(data3$cut,levels=c("Very Good","Ideal","Fair")) 4)百分比堆积图 data4<-diamonds %>% filter(cut %in% c("Fair","Very Good","Ideal")) %>% count(color,cut) %>% mutate(percent=n/sum(n)) 堆积图<-ggplot(data4,aes(x=color,y=percent,fill=cut))+mytitle+ geom_bar(stat="identity")+mytheme+mytitle+mycolour_3 堆积图 当然,也可以做面积图。不过如果数据有缺失,面积图出错几率蛮大的 5)饼图以及极坐标图 参考一下这篇文章《【R】初吻R–ggplot绘制Pie Chart饼图》以及这篇文章使用ggplot2画图 有两种作图方法: data5<-diamonds %>% count(cut) %>% mutate(percent=n/sum(n)) ggplot(data5,aes(x=factor(1),y=percent,fill=cut))+geom_bar(stat="identity",width=3)+mycolour_7+ coord_polar("y")+pie_theme+mytitle 2)指定x轴,x轴同时也是颜色(fill),先画柱形图,再转化为圆形。坏处是公式相对比较繁琐一些。 ggplot(data5,aes(x=cut,y=percent,fill=cut))+ geom_bar(stat="identity",width=3)+ mycolour_7+coord_polar("x")+pie_theme+mytitle
但是我尝试了多次,在饼图里加标签方法非常难以理解。。如果要饼图加标签的话,或许还不如柱形图 附上分面柱形图画法: data5_1<-data5 %>% filter(color %in% c("D","E","F","G")) ggplot(data5_1,aes(x=factor(1),y=percent,fill=cut))+geom_bar(stat="identity",width=3)+mycolour_7+ coord_polar("y")+pie_theme+facet_wrap(~color,ncol = 4)+ theme(legend.position="bottom")+mytitle
6、折线图 除了以上柱形图以外,折线图我们做的也比较多。 data6<-diamonds %>% count(color,cut) %>% filter(color %in% c("D","E","F"))%>% mutate(percent=n/sum(n)) ggplot(data6,aes(x=cut,y=n,group=color,colour=color))+geom_line(size=1.5)+mypoint+ mycolour_line_7+mytheme+mytitle
还有一些其他有用的图形 另外补充说明的是,ggplot2绘图,个人更看好其多种映射,以及在探索性数据分析里快捷绘图的能力,还有跟地图啊等结合的能力。还有动态交互等等。 譬如现在比较流行的R/Python与动态网页(大部分是D3)的结合 示例1,示例2 但愿各位不要将绘图局限于上述所选的一些最常用的图形与格式化调整里。请容我吐槽一句,这样子调风格学习真的很苦(づ ̄ ~~ ̄|||)づ 参考资料:1、刘万祥老师的商业图表系列 |
|