R实战 -绘图(ggplot2)
ggplot2包实现了基于语法的、连贯一致的创建图形的系统,由于ggplot2是基于语法创建图形的,这意味着,它由多个小组件构成,通过底层组件可以构造前所未有的图形。ggplot2可以把绘图拆分成多个面板,且能够按照顺序创建多重图形,基本上,无所不能,是R开发人员必学必会的包。
ggplot2图形系统的核心理念是:
把绘图与数据分离,把数据相关的绘图与数据无关的绘图分离;
按图层作图,有利于结构化思维;
具有命令式作图的调整函数。
使用ggplot2包创建图形时,每个图形都是由函数ggplot()创建的,由几何对象来控制绘制的几何图形,通过符号“+”来增加图形的元素,这使得绘制图形的过程结构化,同时使绘图更具灵活性,绘制出来的图形美观,避免繁琐的细节。
一,初始化图形
使用函数ggplot()初始化图形对象,并指定绘制图形的数据集和坐标轴的映射,在ggplot()函数中,指定数据集的默认设置,便于后续图形选项的操作:
ggplot(data = NULL, mapping = aes())
参数data: 用于指定要用到的数据源;
参数mapping:使用aes()函数指定每个变量的角色,除x和y之外的其他参数,例如,size、color、shape等,必须采用name=value的形式,
aes(x, y, ...)
常见的图形美学选项是:
color:对点、线和填充区域的边界进行着色
fill:对填充区域着色
alpha:演示的透明度,从透明(0)到不透明(1)
linetype:图案的线条(1=实线、2=虚线、3=点、4=点破折号、5=长破折号、6=双破折号)
size:点的尺寸和线的宽度
shape:点的形状(和par()函数的pch参数相同)
position:绘制条形图和点等对象的位置
binwidth:直方图的宽度
notch:表示方块图是否应该有缺口
sides:地毯图的位置("b"=底部、"l"=左部、"r"=右部、"bl"=左下部,等)
width:箱线图的宽度
group:分组
stroke:
在下面的小节中,使用数据集mtcars作为ggplot的输入:
library(ggplot2)data("mtcars")
二,几何对象(geometric)
函数ggplot()可以设置图形,但是没有视觉输出,需要使用一个或多个几何函数向图形中添加几何对象(geometric,简写为geom),包括点(point)、线(line)、条(bar)等,而添加几何图形的格式十分简单,通过符号“+”把几何图形添加到plot中:
ggplot()+geom_xxx()
例如,使用geom_point()函数输出点状图形,并接收以下美学参数:alpha、colour、fill、group、shape、size和stroke,
ggplot(data=mtcars, aes(x=wt,y=mpg))+ geom_point(color="red",size=1,shape=0)
在一个图形中,可以绘制多个几何图形,只需要通过符号“+”添加就可以实现,例如,使用geom_smooth()函数添加一条平滑曲线和置信区间:
ggplot(data=mtcars, aes(x=wt,y=mpg))+ geom_point(color="red",size=1,shape=0)+ geom_smooth(method="lm",color="green",linetype=2)
该平滑函数的定义是几何平滑函数,语法是:
geom_smooth(mapping = NULL, data = NULL, stat = "smooth", position = "identity", ..., method = "auto", formula = y ~ x, se = TRUE, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)
参数注释:
method:指定回归函数
formula:在光滑函数中指定公式
se:绘制置信区间
level:使用的置信区间的水平
fullrange:指定拟合应该涵盖全图(TRUE)或仅仅数据(FALSE),默认是FALSE;
三,主题
主题(Theme)用于控制图形的美学特征,ggplot图形的主题(theme)元素主要有三大类:布局(plot)、面板(panel)和坐标轴(axis),还有两个成分元素附着于面板上,主要包括两类:图例(legend)和带状区域(strip),ggplot2包通过theme()函数来统一控制图形的美学和文本特征,可以用于调整字体,背景色,前景色和网格线等。
对于面板的网格线,分为主线(panel.grid.major)和 次线(panel.grid.minor ),用户可以根据绘制图形的需要,显示或隐藏。
1,主题函数的参数
theme()函数的参数如下所示,每个参数的具体含义,请阅读文档:Modify components of a theme
theme(line, rect, text, title, aspect.ratio, axis.title, axis.title.x, axis.title.x.top, axis.title.y, axis.title.y.right, axis.text, axis.text.x, axis.text.x.top, axis.text.y, axis.text.y.right, axis.ticks, axis.ticks.x, axis.ticks.y, axis.ticks.length, axis.line, axis.line.x, axis.line.y, legend.background, legend.margin, legend.spacing, legend.spacing.x, legend.spacing.y, legend.key, legend.key.size, legend.key.height, legend.key.width, legend.text, legend.text.align, legend.title, legend.title.align, legend.position, legend.direction, legend.justification, legend.box, legend.box.just, legend.box.margin, legend.box.background, legend.box.spacing, panel.background, panel.border, panel.spacing, panel.spacing.x, panel.spacing.y, panel.grid, panel.grid.major, panel.grid.minor, panel.grid.major.x, panel.grid.major.y, panel.grid.minor.x, panel.grid.minor.y, panel.ontop, plot.background, plot.title, plot.subtitle, plot.caption, plot.margin, strip.background, strip.placement, strip.text, strip.text.x, strip.text.y, strip.switch.pad.grid, strip.switch.pad.wrap, ..., complete = FALSE, validate = TRUE)
2,元素函数
每一个参数的赋值,可以通过元素函数来实现,其中 rel()
函数用于指定相对于父对象的相对值,而margins()
函数用于指定元素的边界。
margin(t = 0, r = 0, b = 0, l = 0, unit = "pt")element_blank()element_rect(fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL, inherit.blank = FALSE)element_line(colour = NULL, size = NULL, linetype = NULL, lineend = NULL, color = NULL, arrow = NULL, inherit.blank = FALSE)element_text(family = NULL, face = NULL, colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL, color = NULL, margin = NULL, debug = NULL, inherit.blank = FALSE)rel(x)
元素函数的详细使用示例,请参考:Theme elements
3,向图形中添加主题
在使用ggplot2包绘制图形时,可以单独定义一个theme对象,然后添加到ggplot中,例如:
mytheme <-theme(panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank(), panel.grid.major.y = element_line(color="lightblue",size =0.1,linetype="solid",lineend="round"), panel.grid.minor.y = element_blank(), panel.background = element_blank(), axis.ticks=element_blank() ggplot(data=mtcars, aes(x=wt,y=mpg))+ geom_point(color="red",size=1,shape=0)+ mytheme
三,坐标(scale)
ggplot2包使用函数scale_x_xxx()和scale_y_xxx()分别控制坐标轴的数据,常用的函数有三个:scale_x_date,scale_x_discrete,scale_y_continuous,其中discrete表示坐标轴的值是可罗列的散列值,而continuous表示是不可罗列的连续值:
scale_y_continuous(name = waiver(), breaks = waiver(), minor_breaks = waiver(), labels = waiver(), limits = NULL, expand = waiver(), oob = censor, na.value = NA_real_, trans = "identity", position = "bottom", sec.axis = waiver())
参数注释:
name:坐标轴上的文字
breaks:间距,如何对坐标轴的值进行间断,如果不设置,那么使用默认值,显示设置:NULL(不间断),数值向量,函数(输入是范围,输出是间距)
minor_breaks :同breaks参数,表示最小的间距
labels:标签,间距的文字显示;数量必须同breaks相同;
limits:数值向量,用于指定坐标轴的最小值和最大值
expand:数值向量,默认值是c(0.05,0),用于指定数据离坐标轴的距离
oob:函数对象,Function that handles limits outside of the scale limits (out of bounds).
na.value :用于替换缺失值的值
trans :指定转化对象,用于产生breaks和labels;
position:指定坐标轴的位置;
sec.axis:指定辅助坐标轴(secondary axis);
例如,x轴是以日期(date)为值的坐标轴,而y轴按照pretty_breaks()函数进行间断,标签按照特定的格式显示:
library("scales")ggplot(data=mtcars, aes(x=wt,y=mpg))+ geom_point(color="red",size=1,shape=0)+ scale_x_date(date_labels="%Y-%m",date_breaks="1 month")+ scale_y_continuous(breaks=pretty_breaks(n=3), labels=scales::unit_format("k", 1e-3))
在使用函数pretty_breaks()之前,请首先加载scales包;
install.packages("scales")
四,标签
可以通过函数labs()来指定图形的标题(title),子标题(subtitle),坐标轴的标签(x,y)等,并可以指定标签的美学选项:
labs(...)
参数是美学(aesthetic)选项,使用name=value模式,可以使用的选项是:
指定文字:title、subtitle、caption、x和y
指定美学选项:color、size等
五,多重图
要同时绘制多个图形,可以使用gridExtra包中的grid.arrange()函数,绘制多重图时,需要定义一个ggplot()的列表,并把列表传递给grid.arrange()函数,在该函数中指定图形的布局(layout)例如:
library("gridExtra")gs=list(NULL)gs[[1]]<-ggplot()gs[[2]]<-ggplot()gs[[n]]<-ggplot()grid.arrange(grobs=gs,ncol=1)
六,分组和刻面
分组和刻面,都是把数据分组,便于观察各自的规律、趋势和模式,不同的是,分组是把图形绘制到一个大的图形中,通过美学特征来区分,而刻面是把图形绘制到不同的网格中。
1,分组
分组使通过ggplot2图把一个或多个带有形状、颜色、填充、尺寸和线类型等视觉特征的分组变量来实现的。
在一个图形中画出两个或多个组的图形,使图形重叠为单一的图形,并用不同的颜色来区分,分组通常使用因子来实现,这就要求在数据集中存在因子变量,用于对数据分类,实现数据的分组。
ggplot(data=ds,aes(x=var1,y=var2,fill=var3,shape=var4))+ geom_point()
2,刻面(facet)
使用函数facet_grid()和facet_wrap()创建网格图形,把多个图形分布在不同的网格中。
facet_wrap(~var,ncol)facet_wrap(~var,nrowl)facet_grid(rowvar~colvar)facet_grid(.~colvar)facet_grid(rowvar~.)
其中在facet_grid()中的点号( . )表示单行或单列。
共同学习,写下你的评论
评论加载中...
作者其他优质文章