案例R语言ggplot2精细化绘图

摘要:本文旨在介绍R语言中ggplot2包的一些精细化操作,主要适用于对R画图有一定了解,需要更精细化作图的人,尤其是那些刚从excel转ggplot2的各位,有比较频繁的作图需求的人。不讨论那些样式非常酷炫的图表,以实用的商业化图表为主。包括以下结构:

1、画图前的准备:自定义ggplot2格式刷2、画图前的准备:数据塑形利器dplyr/tidyr介绍3、常用的商业用图:

1)简单柱形图+文本(单一变量)2)分面柱形图(facet_wrap/facet_grid)3)簇型柱形图(position=”dodge”)4)堆积柱形图(需要先添加百分比,再对百分比的变量做柱形图)5)饼图、极坐标图6)多重线性图

前言

这篇文章其实是我之前那篇博文的一个延续。因为接了一个活要用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))

接下来是一个示范。我首先共享了我常用的一个主题刷,配色参考以下:

主体色:蓝色A9C,红色EF,灰色辅助色:浅黄色FFFFE7,橙色FF,绿色,明黄色FF,紫色9C52AD

定制了mytheme,myline_blue,mycolour等多个对象:

1#定义好字体2windowsFonts(CA=windowsFont(Calibri))3#事先定制好要加图形的形状、颜色、主题等4#定制主题,要求背景全白,没有边框。然后所有的字体都是某某颜色5#定制主题,要求背景全白,没有边框。然后所有的字体都是某某颜色6mytheme-theme_bw()+theme(legend.position=top,7panel.border=element_blank(),8panel.grid.major=element_line(linetype=dashed),9panel.grid.minor=element_blank(),10plot.title=element_text(size=15,11colour=#,12family=CA),13legend.text=element_text(size=9,colour=#,14family=CA),15legend.key=element_blank(),16axis.text=element_text(size=10,colour=#,17family=CA),18strip.text=element_text(size=12,colour=#EF,19family=CA),20strip.background=element_blank())23pie_theme=mytheme+theme(axis.text=element_blank(),24axis.ticks=element_blank(),25axis.title=element_blank(),26panel.grid.major=element_blank())27#定制线的大小28myline_blue-geom_line(colour=#A9C,size=2)29myline_red-geom_line(colour=#EF,size=2)30myarea=geom_area(colour=NA,fill=#,alpha=.2)31mypoint=geom_point(size=3,shape=21,colour=#,fill=white)32mybar=geom_bar(fill=#0C8DC4,stat=identity)33#然后是配色,考虑到样本的多样性,可以事先设定颜色,如3种颜色或7种颜色的组合34mycolour_3-scale_fill_manual(values=c(#A9C,#EF,#))35mycolour_7-scale_fill_manual(values=c(#A9C,#EF,#,36#FFFFE7,#FF,#,#9C52AD))37mycolour_line_7-scale_color_manual(values=c(#A9C,#EF,#,38#0C8DC4,#FF,#,#9C52AD))

把以上代码在R里面运行以后,就可以直接使用了。譬如以下:

1)先生成一个简单的图表:

#未使用格式刷p-ggplot(iris,aes(x=species,y=sepal_length))+geom_bar(stat=identity)+ggtitle(sepal_lengthbyspecies)p

简单地指定x轴为离散型变量species,y为求和,会得到下面的柱形图

这时候,套用一下之前设置好的主题(mytheme),背景、坐标轴还有字体颜色就相应改变了。

p+mytheme

然后,因为之前格式刷部分我设定了一个蓝色的柱形图样式(mybar),这里直接引用的话,就可以直接生成蓝色的柱形图了。

ggplot(iris,aes(x=species,y=sepal_length))+ggtitle(sepal_lengthbyspecies)+mybar+mytheme

2、画图前的准备:数据塑形利器dplyr/tidyr

有了事先设定的一些格式刷以后,我们就可以快速有效地作图了。

但是在作图之前,就像excel作图总要先把数据用处理成想要的形式。在excel里面,我们常用的是数据透视表或者一些公式辅助,而在R里,则是用一些常用的包,如dplyr及tidyr,对数据进行重塑再造

在我之前看的那两本ggplot2的书里,基本用的都是reshape2+plyr的组合。但实际上hadley后续出的dplyr与tidyr更加有用。具体的使用方法,在JHUGettingandcleaningdata有介绍,老师还编了一个swirl课程供人使用,安装方法如下。

install.packages(swirl)library(swirl)#安装gettingandcleaningdata相关的课程教学包install_from_swirl(GettingandCleaningData)swirl()

总之,用好dplyr的话,你可以快速的把一些数据,如下面的股票逐笔成交记录随你所欲地汇总(group_bysummarize)甚至再拆分(spread),譬如示例里面就是把成交记录按照成交价格和BuySell拆分

data#刚刚演示的那些数据,在预测者网可以下载data%%group_by(Price,BuySell)%%summarize(Money=sum(Money,na.rm=TRUE))%%spread(BuySell,Money)

要想做好ggplot2的图,对数据快速进行塑形的方法是我们必须要掌握的。上面的swirl课程非常有用,而且值得是最新的一个技术方法,值得大家学习。

3、常用的商业用图

接下来分享一下我在这次作图过程中,最常用的几个图形的代码。首先声明,这些图形的进一步做法以及变形,基本都可以在这两本参考书籍里(R可视化技术

ggplot2:数据分析与图表技术)找到。我这里更多的摘取一些我比较常用的图表进行讲解

1、简单柱形图+文本(单一变量)2、分面柱形图(facet_wrap/facet_grid)3、簇型柱形图(position=”dodge”)4、堆积柱形图(需要先添加百分比,再对百分比的变量做柱形图)5、饼图、极坐标图6、多重线性图

在作图之前,首先讲一下ggplot2的局限。

ggplot2最大的局限是,它基本不支持双坐标图和饼图。即使能做这些图形,也要很多设置,做起来非常繁琐。按我个人理解,这个局限的根源与ggplot2开发者Hadley本身的审美习惯以及分析习惯脱不了关系。具体请看他在stackoverflow的这一段问答:

It’snotpossibleinggplot2becauseIbelieveplotswithseparateyscales(noty-scalesthataretransformationsofeachother)arefundamentallyflawed.

大神有技术就能任性。即使一堆人在他那回复下面各种求双坐标。。不知道Hadley现在有没有改变主意,把双坐标列为ggplot2的下一个更新点。但是如果你想画双坐标图或者饼图,至少经个人的实践,这些都是比较困难的,设置繁琐而且不美观。要么选择用excel完成,要么听大神的话,用分面图(facet)或者柱形图代替,会更加省事一些。

所以,在了解以下常用图形前,我们需要记住,ggplot2不是万能的,它虽然能做出非常美观的图表,但是总有一些图不能做,因此多个工具结合使用是非常必要的。

在知道以上前提下,我们以ggplot2自带的diamonds数据集为基础,结合dplyr/tidyr的应用,介绍一下常用图形的画法。

然后来讲一下除了双坐标图和饼图以外,ggplot2可以支持的常用图形的画法。数据的话,我们使用ggplot2自带的数据包diamonds

首先定义一下

mytitle=演示:以diamond为例

1)简单柱形图

代码组成如下,这里使用格式刷mybar和mytheme,然后用geom_text添加柱形图标签(vjust=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)簇型图制图要点是,对数据作图后,添加geom_bar时,position=”dodge”(分开的)如果去掉这部分,默认是生成堆积图.

代码如下:

data3-diamonds%%filter(cut%in%c(Fair,VeryGood,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(VeryGood,Ideal,Fair))

4)百分比堆积图制图前要事先添加一个百分比的数据之后才好作图,这里我们用mutate(percent=n/sum(n))添加该百分比数据。同时去掉position=”dodge”

data4-diamonds%%filter(cut%in%c(Fair,VeryGood,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–ggplot绘制PieChart饼图》以及这篇文章使用ggplot2画图在ggplot2里并没有直接画饼图的方法,基本上都是先画出柱形图,再用coord_polar转化为饼图

有两种作图方法:1)不指定x轴,直接用geom_bar生成y轴,然后fill=分类颜色,coord_polar直接投影y该方法的好处代码是比较简单(coord_polar(“y”)加标签方法请见:







































北京白斑病医院
白癜风原因



转载请注明:http://www.92nongye.com/xxmb/204615887.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了