R语言实战第19章 ggplot2画图
1. 前言
图形系统有grid包、lattice包、ggplot2包,其中grid包控制图形基础单元,latteric包通过一维,二维或者三维条件绘图,对多元变量关系进行直观展示。Ggplot2包则是基于全面图形的语法进行的一种绘图。
而在ggplot2包中,图是通过串联起来(+)号的函数创建,每个函数修改属于自己的部分
ggplot(data=mtcars,aes(x=wt,y=mpg))+
geom_point()+
labs(title="automobile data",xlab="weight",ylab="milesper gallon")
ggplot()绘图时要先制定数据来源以及变量,aes()函数的功能是制定每个变量扮演的角色,geom_plot()是只是在图形中画点,创建散点图,labs()函数是可选,添加注释。
ggplot(data=mtcars,aes(x=wt,y=mpg))+
geom_point(pch=20,color="blue",size=2)+
geom_smooth(method="lm",color="red",linetype=2)+
labs(title="automobiledata",xlab="weight",ylab="miles per gallon")
这里采用geom_point()函数设置点的形状为圆形,pch=20,大小为2(size=2),使用过了蓝色,geom_smooth()函数来添加了一条平滑曲线,采用了线性拟合和红色的虚线(linetype=2)且线条尺寸为1,ggplot2包提供了分组和小棉花的方法,分组即是在一个图形中显示两组或者是多组的观察结果,小棉花是指在单独的并排的图形上显示观察组,
ggplot(data=mtcars,aes(x=hp,y=mpg,shape=cyl,color=cyl))+
geom_point(size=3)+
facet_grid(am~vs)+
labs(title="automaticdata by engine type",
x="horsepower",y="miles per gallon")
2. 用集合函数指定图的类型
Ggplot包中较常用的函数如下
几何函数
函数 |
添加 |
选项 |
Geom_bar() |
条形图 |
Color、fill、alpha |
Geom_boxplot() |
箱线图 |
color、fill、alpha、notch、width |
Geom_density() |
密度图 |
color、fill、alpha、linetype |
Geom_histogram() |
直方图 |
color、fill、alpha、linetype、binwidth |
Geom_hline |
水平线 |
color、alpha、linetype、size |
Geom_jitter() |
抖动点 |
Color、size、alpha、shape |
Geom_line() |
线图 |
Colorvalpha、linetype、size |
Geom_point() |
散点图 |
Color、alpha、shape、size |
Geom_rug() |
地毯图 |
Color、side |
Geom_smooth() |
拟合曲线 |
Method、formula、color、fill、linetype、size |
Geom_text() |
文字注释 |
|
Geom_violin |
小提琴图 |
color、fill、alpha、linetype |
Geom_vline |
垂线 |
Color、alpha、linetype、size |
ggplot(singer,aes(x=height))+geom_histogram()
ggplot(singer,aes(x=voice.part,y=height))+geom_boxplot()
可见低音歌唱家比高音歌唱家身高更高。
常见的函数选项
选项 |
详述 |
Color |
对点、线和填充区域的边界进行着色 |
Fill |
对填充区域着色,如条形和密度区域 |
alpha |
颜色的透明度,从0(完全透明)到1(不透明) |
linetype |
图案的线条(1=实线、2=虚线、3=点、4=点破折号、5=长破折号、6=双破折号) |
size |
点的尺寸和线的宽度 |
shape |
点的形状(0=开放的方形,1=开放的圆形,2=开放的三角形等) |
position |
绘制注入条形图和点等对象的位置,对条形图来说,“dodge”将分组条形图并排,“stacked”堆叠分组条形图,“fill”垂直的堆叠分组条形图并规范其高度相等 |
notch |
表示方块图是否为缺口 |
sides |
地毯图的安置(“b”=底部,“l”=左部,“r”=右部,”t”=顶部,“bl”=左下) |
Width |
箱线图的宽度 |
ggplot(Salaries,aes(x=rank,y=salary))+
geom_boxplot(fill="cornflowerblue",
color="black",notch=T)+
geom_point(position="jitter",color="blue",alpha=0.5)+
geom_rug(side="l",color="black")
地毯图设在左侧,只是了薪水的一般扩散,该图画了不同学术地位对薪水的缺口箱线图,对观测点采用了一般的透明化以防止遮挡了箱线图。当图形结合时,产生的图形如下:
ggplot(singer,aes(x=voice.part,y=height))+
geom_violin(fill="lightblue")+
geom_boxplot(fill="lightgreen",width=0.2)
3. 分组
通常会在一个图中话两个或者更多组的观察值方便理解数据,在R中,通常用分类变量的因子来定义,分组通过ggplot2图将一个活多个带有注入形状、颜色、填充、尺寸和线条型的视觉特征的分组变量完成。
通过探讨工资数据集画相关图形
ggplot(Salaries,aes(x=salary,fill=rank))+
geom_density(alpha=0.3)
通过画出不同的密度曲线并以不同的颜色区分,展现出不同教育水平的工资不同,且设置了透明度,防止不同的密度图被覆盖,接下来探索通过性别与学术等级分组,绘制获得博士学位年数与薪水的关系。
ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank,shape=sex))+
geom_point()
由图可见,薪水随着毕业年数的增加而增加,但关系并非线性,就直观来看,男性取得较高薪水的比例较大,且学位越高,薪水越高。
ggplot(Salaries,aes(x=rank,fill=sex))+
geom_bar(position="stack")+
labs(title='position="stack')
ggplot(Salaries,aes(x=rank,fill=sex))+
geom_bar(position="dodge")+
labs(title='position="dodge')
ggplot(Salaries,aes(x=rank,fill=sex))+
geom_bar(position="fill")+
labs(title='position="fill')
将分组变量通过三种不同形式的图形进行比较,可以看出教授的人数大于其他学术水平的人数,且女性教授的人数比其他学术水平的人数要少,第三个表示女性教授的少于男性。且较该注意的是aes()函数内部一般只是用来分配变量。
4.刻面
若在图中并排出现并不是重围为单一的图形,即可用facet_wrap()函数和facet_grid()函数来创建网格图形。
Ggplot刻面图函数
语法 |
结果 |
facet_wrap(~var,ncol=n) |
将每个var水平排列成n列的独立图 |
facet_wrap(~var,nrow=n) |
将每个var水平排成n行的独立图 |
facet_grid(rowvar~colvar) |
Rowvar和colvar组合的独立图,其中rowvar表示行,colvar表示列 |
facet_grid(rowvar~.) |
每个rowvar水平的独立图,配置成一个单列 |
facet_grid(.~colvar) |
每个colvar水平的独立图,配置成一个单行 |
ggplot(data=singer,aes(x=height))+
geom_histogram()+
facet_wrap(~voice.part,nrow=4)
该图画出了不同的音位的歌唱家身高直方图
ggplot(Salaries,aes(x=yrs.since.phd,y=salary,color=rank,shape=rank))+
geom_point()+
facet_grid(.~sex)
该图画出了不同性别之间,根据不同学历和不同的取得博士学位的薪水分布。
ggplot(singer,aes(x=height,fill=voice.part))+
geom_density()+
facet_grid(voice.part~.)
4. 添加光滑曲线
可用geom_smooth()函数来添加一系列的平滑曲线和置信区间,参数表如下:
geom_smooth()函数
选项 |
描述 |
Method= |
使用的平滑函数,允许的值包括glm、lm、smooth、rlm、gam分别对应广义线性,线性,健壮线性和广义相加模型,smooth是默认值 |
Formula= |
在光滑函数中使用的公式,包括y~log(x),y~poly(x,n)表示n次多项式拟合y~ns(x,n)表示一个具有n个自由度的样条拟合。 |
Se |
绘制置信区间(T/F)默认为T |
Level |
使用的置信区间水平(默认为95%) |
Fullrange |
制定拟合应涵盖全图(T)或仅仅是数据(F)(默认为F) |
图例:ggplot(Salaries,aes(x=yrs.since.phd,y=salary))+
geom_smooth()+
geom_point()
该图显示了博士毕业年数与薪水之间的关系外加一条95%的置信区间的光滑曲线,再看个按照性别拟合一个二次多项式的例子。
ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,linetype=sex,shape=sex,color=sex))+
geom_smooth(method=lm,formula=y~poly(x,2),
se=F,size=1)+
geom_point(size=2)
对于男性来说,获得博士学位30年后薪水开始下降,对于女性,取得博士学位后薪水会一直上涨(在40年内),且数据集中没有女性的数据超过40年。
5. 修改ggplot2图形的外观
ggplot2提供了特定的函数来改变其图形的外观,我们将使用几个函数来自定义ggplot2的图形外观,
5.1坐标轴
该包在创建图时自动创建刻度线,刻度标记标签和坐标轴标签,可用过labs()函数来添加标题并改变坐标轴的标签,在本节中,将自定义轴标签,下表采用了自定义坐标轴的函数。
控制坐标轴和刻度线外的函数
函数 |
选项 |
Scale_x_continuous()和scale_y_continuous() |
Breaks=指定刻度标记,labels=指定刻度标记标签,limits=控制要展示的值的范围 |
Scale_x_discrete()和scale_y_discrete() |
Breaks=对因子的水平进行防治和排序,Labels=是制定这些水平的标签,limits=表示哪些水平应该展示 |
Coor_flip() |
颠倒x轴和y轴 |
data(Salaries,package="car")
ggplot(data=Salaries,aes(x=rank,y=salary,fill=sex))+
geom_boxplot()+
scale_x_discrete(breaks=c("AsstProf","AssocProf","Prof"),#对水平因子进行放置和排序
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor"))+
scale_y_continuous(breaks=c(50000,100000,150000,200000), #breaks标记刻度,lebels标记刻度标签
labels=c("$50k","$100k","$150k","$200k"))+
labs(titles="faculty salary by rank andsex",x="",y="")
图示可以看的,随着学术水平上升,薪水水平也会上升,而每个学术等级中,男性平均工资水平都高于女性平均工资水平。
5.2图例
图例即是指出如何用颜色、形状、尺寸等视觉特性表示数据特征,当在更改图例的标题时,可以更改其颜色,填充,尺寸,形状或他们的组合等。且可通过将fill=”mytitle”加到labs()函数中来改变我们要的标题。而标题的位置可以用theme()函数中的legend.position选项控制,可能的值有“left”、“top”、“right”、“bottom”可以在图中给定的位置指定一个二元素向量。
ggplot(data=Salaries,aes(x=rank,y=salary,fill=sex))+
geom_boxplot()+
scale_x_discrete(breaks=c("AsstProf","AssocProf","Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor"))+
scale_y_continuous(breaks=c(50000,100000,150000,200000),
labels=c("$50k","$100k","$150k","$200k"))+
labs(title="faculty salary by rank andgender",
x="",y="",fill="Gender")+
theme(legend.position = c(.1,.8)) #放在左边边缘的10%和底部边缘的80%
若想删除图例,采用的是legend.poistion=”none”
5.3标尺
标尺即是将数据空间的观测值给反映到可视化空间里面,标尺可以用于连续的变量,也可以用到离散的变量,连续性的标尺将yrs.snce.phd变量的数值映射到x轴上,同时把salary的数值给映射到Y轴上。
ggplot(data=mtcars,aes(x=wt,y=mpg,size=disp))+
geom_point(shape=21,color="black",fill="cornsilk")+
labs(x="weight",y="mpg",title="bublechart",size="engine\nDisplacement")
ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,color=rank))+
scale_color_manual(values=c("orange","olivedrab","navy"))+
geom_point(size=2)
用scale_color_manual()函数设定三个学术等级的点的颜色,也可以用scale_color_brewer()和scale_fill_brewer()函数来预先制定分得清的颜色。
ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,color=rank))+
scale_color_brewer(palette="Set1")+
geom_point(size=2)
5.4主题
采用theme()函数中的选项来让我们调整字体,背景,颜色,和网格线条等。主题可以使用一次,也可以使用后保存期,用于多个图形。
mytheme<-theme(plot.title=element_text(face="bold.italic",
size="14",color="brown"),
axis.title =element_text(face="bold.italic",size=10,
color="brown"),
axis.text =element_text(face="bold",size=9,
color="darkblue"),
panel.background=element_rect(fill="white",
color="darkblue"),
panel.grid.major.y=element_line(color="grey",
linetype = 1),
panel.grid.minor.y=element_line(color="grey",
linetype=2),
panel.grid.minor.x=element_blank(),
legend.position= "top")
ggplot(Salaries,aes(x=rank,y=salary,fill=sex))+
geom_boxplot()+
labs(title="salary byrank and sex",x="rank",y="salary")+
mytheme
5.5多重图
Ggplot包中将多个图形放到单个图形的方法为使用gridExtra包中的grid.arrange()函数,故在事先需首先下载gridExtra包
library(gridExtra)
p1<-ggplot(data=Salaries,aes(x=rank))+geom_bar()
p2<-ggplot(data=Salaries,aes(x=sex))+geom_bar()
p3<-ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary))+geom_point()
grid.arrange(p1,p2,p3,ncol=3)
借此,即可把不同的图合并到同个界面中。
6. 保存图形
使用ggsave()函数将ggplot画出的图来将其保存。
myplot<-ggplot(data=mtcars,aes(x=mpg))+geom_histogram()
ggsave(file="mygraph.png",plot=myplot,width=5,height=4)
这段将会把画图文件保存在当前路径的文档里,且命名为mygraph,倘若忽略了Plot参数,则R会自动保存最近做的图。