参考资料:R语言实战【第2版】
1、坐标轴
ggplot2包会在创建图的同时自动创建刻度线、刻度标记标签和坐标轴标签。它们往往看起来不错,但我们有时需要在更大程度上控制它们的外观。我们已经知道了如何通过labs()函数来添加标题并改变坐标轴标签。自定义坐标轴函数如下:
函数 | 选项 |
scale_x_continuous() scale_y_continuous() | breaks=指定刻度标记,labels=指定刻度标记标签,limits=控制要展示的值得范围 |
scale_x_discrete() scale_y_discrete() | breaks=对因子的水平进行放置和排序,labels=指定这些水平的标签,limits=表示哪些水平应该展示 |
coord_flip() | 颠倒x轴和y轴 |
由上面的函数可知:ggplot2的函数区分x轴和y轴,以及轴线是否代表一个连续或离散变量(因子)。
下面让我们将这些函数应用到一个分组函数箱线图中,其中包含学术等级和性别分组的信息水平:
# 加载car包,用于调用其中的Salaries数据集
library(car)
# 加载ggplot2包
library(ggplot2)
# 绘图
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 and Sex",x="",y="")
2、图例
图例是指出如何用颜色、形状、尺寸等视觉特性表示数据特征的指南。ggplot2包能自动生成图例,而且在很多时候能够满足我们的需求;但有些时候,我们需要进行自定义,标题和位置是最常用的定制特征。
当更改图例的标题时,必须考虑图例是否基于颜色、填充、尺寸、形状或它们的组合。图例代表fill审美(见aes()函数),因此我们可以通过将fill="mytitle"加到labs()函数中来改变标题。
标题的位置有theme()函数中的legend.position选项控制。可能的值包括"left"、"top"、"right"(默认值)和"bottom"。我们也可以在图中给定的位置指定一个二元素向量。如下图操作所示:
# 加载car包,用于调用其中的Salaries数据集
library(car)
# 加载ggplot2包
library(ggplot2)
# 绘图
ggplot(data=Salaries,aes(x=rank,y=salary,fill=sex))+
geom_boxplot()+
scale_x_discrete(breaks=c("AsstProf","AsscoProf","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 and Gender",
x="",y="",fill="Gender")+
theme(legend.position=c(0.1,0.8))
在上例中,图例的左上角分别距离左侧边缘10%和底部边缘80%的位置(theme(legend.position=c(0.1,0.8)))。如果想要删除图例,可以使用legend.position="none"。
3、标尺
ggplot2包可以使用标尺把数据空间的观察值映射到可视化的空间中。标尺既可以应用到连续的变量,也可以应用到离散的变量。一个连续的标尺可以把Salaries数据集中的yrs.since.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="Miles Per Gallon",
title="Bubble Chart",size="Engine\nDisplacement")
上例中,aes()函数的参数size=disp生成连续型变量(发动机排放)的标尺,并使用它来控制点的尺寸。
下面一个离散的例子,我们可以使用标尺将担忧因子水平的视觉线索(如颜色、形状、线条类型、尺寸和透明度)关联起来。使用scale_color_manual()函数来设定三个学术等级的点的颜色。
# 加载car包,用于调用其中的Salaries数据集
library(car)
# 加载ggplot2包
library(ggplot2)
# 绘图
ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,color=rank))+
geom_point(size=2)+
scale_color_manual(values=c("orange","olivedrab","navy"))
当然,也可以使用scale_color_brewer()和scale_fill_brewer()函数来预先指定颜色集,如下:
ggplot(data=Salaries,aes(x=yrs.since.phd,y=salary,color=rank))+
geom_point(size=2)+
scale_color_brewer(palette="Set1")
把palette="Set1"用其他的值(例如"Set2"、 "Set3"、 "Pastel1"、"Pastel2"、 "Paired"、 "Dark2"或"Accent")来代替将会产生不同的颜色方案。为了得到可获得的颜色集,可以使用:
library(RColorBrewer)
display.brewer.all()
4、主题
主题可以让我们控制这些图的整体外观。theme()函数的选项可以让我们调整字体、背景、颜色和网格线等。主题可以使用一次,也可以保存起来应用到多个图中。
# 加载car包,用于调用其中的Salaries数据集
library(car)
# 加载ggplot2包
library(ggplot2)
# 绘图
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="gray",linetype=1),
panel.grid.minor.y=element_line(color="gray",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 By Rank and Sex",x="Rank",y="Salary")+
mytheme
上例中,主题mytheme指定了图的标题应该为粗斜体的棕色14号字。坐标轴的标题为粗斜体的棕色10号字。坐标轴标签应为加粗的深蓝色9号字。画图区域有白色的填充和深蓝色的边框。主竖屏网格线应该灰色实线,次水平网格线应该是灰色虚线;垂直网格线不输出;图例展示在图的顶部。
5、多重图
将多个ggplot2包的图形放到单个图形中最简单的方法是使用gridExtra包中的grid.arrange()函数。我们在使用前需要事先安装这个包。如下:
install.packages("gridExtra")
下面让我们创建三个ggplot2图并把它们放在单个图形中,如下:
# 加载car包,用于调用其中的Salaries数据集
library(car)
# 加载ggplot2包
library(ggplot2)
# 绘图
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()
# 加载gridExtra包
library(gridExtra)
# 见上面3个ggplot2图合并到一个图形中
grid.arrange(p1,p2,p3,ncol=3)
上例中,每个图都被保存为一个对象,然后用grid.arrange()函数保存到单个图形中。这里需要注意截面图和多重图的区别:截面图是基于一个或多个分类变量创建的一系列的图;而多重图则是将多个独立的图绘制到单个图形中。
6、保存图形
我们通常使用ggsave()函数来保存ggplot2绘制的图。它的选项包括保存哪幅图形,保存在哪里和以什么形式保存。例如:
myplot<-ggplot(data=mtcars,aes(x=mpg))+geom_histogram()
ggsave(fill="mygraph.png",plot=myplot,width=5,height=4)
上例是指在当前路径下将myplot保存为名为mygraph.png的5英寸×4英寸( 12.7厘米×10.2厘米) PNG格式的图片。我们可以通过设定文件扩展名为ps、 tex、 jpeg、 pdf、 tiff、 png、 bmp、 svg或wmf来保存为不同的格式。 wmf文件仅限在装有Windows系统的计算机中保存。
如果忽略plot=选项,最近创建的图形会被保存。