ggplot2绘图包及其扩展
ggplot2是由RStudio的首席科学家Hadley Wickham开发的用于绘图可视化的R包,其背后有一套完整的图层图形语法, ggplot2在R中作用就相当于matplotlib在python中的作用一样,同时在python中也可以调用(from ggplot import ggplot2)。在ggplot2之前,R中已经有自己的基础图形系统(Graphics包)、网格图形系统Grid包和用来画图的Lattice包,但是这些绘图包并不是从数据层面去生成图像分析问题,就比如在R中调用上述包使用时,可以指定某一个点或者线是什么颜色,但在ggplot2包中还可以根据分类变量的不同取值来生成不同颜色、形状的图形。同时ggplot2默认的颜色设置和图形布局比上述包更为专业,即使不专门去修改美化图形,默认效果也可以。
ggplot2最早可以追溯到2005年Leland Wilkinson出版的《The Grammar of Graphics》,是一种抽象级别更高的对图表的描述方法。它的基本思路是,把图表的主体看成是数据和几何图形的视觉特征绑定的结果;同时,把图表看成一些简单的相互正交的特征组合而成的结果,比如说,数据点视觉特征(visual cue)和坐标系(coordinates),但技术上可操作性不强。Hadley Wikham在《Elegant Graphics for Data Analysis》中解决了此语法的实用性,使其更好地匹配R。
ggplot2包主要函数
作图函数qplot()
是名副其实的quick plot的函数,能快速对数据进行可视化分析。它的用法和R base包的plot函数很相似。
基本形式:qplot(x=, y= ,data=, color=, shape=, alpha=, geom= ,stat= , method=, formula=, position= , facets=, xlim=, ylim=, xlab=, ylab=, main=, sub=)
- 优点:
- 与plot()相似,可以作为ggplot2的快速入门函数。
- 基于图形语法,可以对数据进行更好地分析。
- 局限性:只能使用一个数据集和一组图形属性映射。
qplot(x=carat, y=price ,data=diamond, color=cut, geom="point")
#运用R中自带的钻石数据diamond,以钻石克拉数为横坐标,钻石价格为纵坐标绘制散点图,不同切割工艺的钻石采用不同的颜色进行标记
qplot(x=log(carat), y=log(price) ,data=diamond, geom=c("point","smooth"))#根据图形初步判断,钻石克拉与价格并不是简单的线性关系,将数据进行取对操作后再作图来判断二者之间的关系,可以发现,经过钻石克拉与价格对数化处理后,线性关系较显著,完成对数据的初步分析。
作图函数ggplot()
ggplot()这一作图函数是ggplot2的核心,Hadley Wickham将ggplot2 总结为”一张统计图形就是从数据到几何对象的图形属性的一个映射。此外,图形中还可能包含数据的统计变换,最后绘制在某个特定的坐标系中,而分面则可以用来生成数据中不同子集的图形。“具体形式如下:
- ggplot(data, aes(x = , y = )) + #基础图层
- geom_xxx()+|stat_xxx() + #几何图层或统计变换
- coord_xxx() + #坐标变换,默认笛卡尔坐标系
- saler_xxx() + # 标度调整,调整具体的标度
- facet_xxx() + #分面,将其中一个变量进行分面变换
- guides()+ # 图例调整
- theme() # 主题系统
ggplot()函数构成
数据(Data)和映射(Mapping)
- 数据:
- ggplot(data= )其中数据data指定绘图环境,必须是数据框格式,如果数据都是向量,但是要在申明中标注data=NULL,不然就会报错。
- 映射:
- aes(x= ,y= ,color= ,fill= ,alpha= ,linetype= ,size= ,shape= ,group=),是ggplot2中的映射函数,反映数据集中的数据关联到相应的图形属性过程中一种对应关系,按映射性质来分有位置类映射、颜色类映射、形状类映射、特殊类映射四种类型。
- 共性映射与个性映射:ggplot(aes())中的映射为共性映射,在geom_xxx(aes())或stat_xxx(aes())未指定个性映射时可以继承该映射。geom_xxx()或stat_xxx()内的参数属于局部参数,仅仅作用于内部。为了避免混乱,可以把不同的图层中共用的映射提供给ggplot( )函数,而某一几何对象才需要的映射参数提供给geom_xxx( )函数。
常见映射:
常见属性 | 描述 |
---|---|
color | 指定点、线和填充区域边界的颜色(面积为0),可以用colors( )查看内置函数 |
fill | 指定填充区域的颜色,如条形和密度区域,与color区别 |
alpha | 指定颜色的透明度,从0(完全透明)到1(不透明) |
size | 指定点的尺寸或线的宽度,单位为mm |
angle | 只有部分几何对象有,如geom_text文本的摆放角度, geom_spoke中短棒摆放角度 |
linetype | 指定线条的类型 |
shape | 点的形状,为[0,25]区间的26个整数 |
vjust | 垂直位置微调,在(0, 1)区间的数字或位置字符串:0=“buttom”,0.5=“middle”,1=“top”,区间外的数字微调比例控制不均 |
hjust | 水平位置微调,在(0, 1)区间的数字或位置字符串:0=“left”,0.5=“center”,1=“right”,区间外的数字微调比例控制不均 |
- 当ggplot()中的data为数据框时,可以直接通过列名指定x、y、形状、颜色等属性,同时该图形与上述qplot()讲解中所做的第一个图选择的数据相同,做出的图形也相同,只是ggplot2在代码上采取了图层叠加的方法,可以继续在上面叠加另外的数据作图,在原始图层上添加会更简便。
ggplot(data = diamond, aes(x=carat, y=price, colour = cut)) + geom_point(size=1)
- ggplot()若单独指定x与y时,要指明data=NULL,否则将会出现不必要的报错。
set.seed(1037)
<- c(rnorm(100,14,5))
x <- c(rnorm(100,14,5) + rnorm(100,0,1))
y ggplot(data= NULL,aes(x = x, y = y)) + geom_point(color = "darkred")
几何对象(Geometric)
执行图层的实际渲染,控制生成的图像类型,常见的图形包括点图、折线图、柱形图和直方图等,也包括辅助绘制的曲线、斜线、水平线、竖线和文本,ggplot2唯一不支持的常规平面图形是雷达图。具体形式如下:
geom_point(mapping = NULL, data = NULL, stat = “identity”, position = “identity”, na.rm = FALSE) 查询ggplot2所有的几何对象:ggplot2::geom_
名称 | 描述 | 默认统计变换 | 重要属性 |
---|---|---|---|
geom_abline | 斜线 | abine | colour,linetype,size |
geom_area | 面积图 | identity | colour,fill,linetype,size,x,y |
geom_bar | 柱状图 | bin | colour,fill,linetype,size,weight,x |
geom_bin2d | 二维热图 | bin2d | colour,fill,linetype,size,weight,xmax,xmin,ymax,ymin |
geom_boxplot | 箱线图 | boxplot | colour,fill,lower,middle,size,upper,weight,x,ymax.ymin |
geom_density | 密度图 | density | colour,fill,linetype,size,weight,x,y |
geom_histogram | 直方图 | bin | colour,fill,linetype,size,weight,x |
geom_hline | 水平线 | hline | colour,linetype,size |
geom_line | 折线图 | identity | colour,linetype,size,x,y |
geom_path | 连接线 | identity | colour,linetype,size,x,y |
geom_point | 点图 | identity | colour,fill,shape,size,x,y |
geom_polygon | 多边形 | identity | colour,fill,linetype,size,x,y |
geom_raster | 热力图 | identity | colour,fill,linetype,size,x,y |
geom_segment | 线段图 | identity | colour,linetype,size,x,xend.y.yend |
geom_smooth | 光滑均线 | smooth | aplha,colour,fill,linetype,size,weight,x,y |
geom_text | 文本注释 | identity | angle,colour,hjust,label,size,size,vjust,x,y |
- 直方图
#在钻石价格分布中,通过geom_histogram中的bins分箱参数设置了20个区间来统计钻石价格的频数分布,同时在不同的价格统计区间中通过不同的颜色来区分钻石的切割工艺。
ggplot(diamond,aes(x=price,fill=cut)) + geom_histogram(bins=20)
- 箱线图
#区分不同的切割工艺下,钻石价格的简单分布,即最大值,最小值,前后四分位值与中位数。
ggplot(data = diamond, aes(x=cut, y=price)) + geom_boxplot(aes(color=cut))
- 密度图
library(ggplot2)
ggplot(diamond,aes(x=price)) + geom_density(aes(color=cut))#区分以不同的颜色不同切割工艺钻石价格的分布
- 拟合线
ggplot(data = diamond, aes(x=carat, y=price)) +
geom_smooth(aes(color=cut),method = 'loess' , formula ='y ~ x',
se=FALSE , size=0.4)
#在不同的切割工艺分组下,组内钻石价格对钻石克拉的回归,可以通过method这一参数设置回归方法,se设置是否显示回归值的置信区间。
- 柱状图
ggplot(diamond,aes(x=clarity,fill=cut)) +
geom_bar()#统计离散型变量的频数分布,下图为统计不同清晰度的钻石数量,同时在每组组内通过不同颜色区分不同的钻石切割工艺。
- 几何对象放置位置position参数:
位置调整函数 | 描述 |
---|---|
position_dodge() | 水平并列放置 |
position_dodge2() | 水平并列放置 |
position_identity() | 位置不变 |
position_stack() | 垂直堆叠 |
position_fill() | 百分比填充 |
position_jitter() | 扰动处理 |
position_nudge() | 整体位置微调 |
- 更换堆叠方式的柱状图
ggplot(diamond,aes(x=clarity,fill=cut)) + geom_bar(position = "dodge")#将排列方式变为水平并列
统计变换(Statistics)
ggplot2将常见的统计变换融入到了绘图中,几何对象geom_xxx(stat = ) 内有统计变换参数stat,统计变换stat_xxx(geom = )内也有几何对象参数geom,两种方法结果相同,几何对象更专注于结果,统计变换更专注于变换过程。
统计变换函数 | 描述 |
---|---|
stat_bin | 分割数据绘制直方图 |
stat_function | 增加函数曲线 |
stat_qq | Q-Q图 |
stat_smooth | 平滑曲线 |
stat_ellipse | 椭圆 |
stat_spoke | 绘制有方向的数据点 |
stat_sum | 绘制不重复的取值之和 |
stat_summary | 分组汇总 |
stat_unique | 绘制不同的数据,去掉重复值 |
stat_ecdf | 经验累计密度图 |
stat_xsline | 样条曲线拟合 |
- stat_summary
- 分组计算y的统计量,要求数据源y能被分组,且每组不止一个元素,fun表示指定对y的汇总函数,返回单个数字;fun.data表示指定完整的汇总函数,输出计算的一系列数据组成的数据框。
ggplot(diamonds, aes(x=cut,fill=cut)) +
stat_summary(aes(y = price), fun = "mean", geom = "bar") #通过柱状图来表示不同切割工艺钻石的平均价格
library(Hmisc)
ggplot(diamond,aes(x=cut,y=price)) + geom_point(size=0.5) +
stat_summary(fun.data = "mean_cl_boot",color="red")#通过mean_cl_boot输出不同切割工艺钻石的均值区间
- stat_function:
- 添加分布曲线,通过fun指定分布函数,将参数传递到args中。
ggplot(diamond,aes(x=carat)) + geom_density() +
stat_function(fun=dgamma,args = list(shape=2,rate=3),color="red")#黑色的线表示钻石克拉的密度分布,红色的线为绘制的gamma分布函数
- stat_smooth:
- 添加光滑曲线
ggplot(diamond,aes(x=carat,y=price)) + geom_point(size=0.5,color="blue") +
stat_smooth(method = 'glm',formula = y~x,color="red")#添加拟合线以后的图形:通过glm广义线性回归的方法拟合钻石克拉与钻石价格之间的线性关系
标度(Scale)
每个图形属性都有标度,标度控制着数据到图形属性的映射,将数据转化为视觉上可以感知的属性,如大小、颜色、形状、位置,也提供对坐标轴和图例的映射,ggplot2中有默认标度参数.简单函数有:xlab()、ylab()、ggtitle()、labs()、xlim()、ylim()、lims()、expand_limits()。常用的复合标度函数如下:
复合标度 | 描述 |
---|---|
scale_x_discrete() | 用于离散型变量,更改x轴名称、标度、标签位置 |
scale_y_discrete() | 用于离散型变量,更改y轴名称、标度、标签位置 |
scale_x_continuous() | 用于连续型变量,更改x轴名称、标度、标签位置 |
scale_y_continuous() | 用于连续型变量,更改y轴名称、标度、标签位置 |
scale_fill_distiller | 设置连续型变量的填充颜色 |
scale_colour_gradient | 设置连续型变量的渐变颜色 |
scale_colour_manual | 自定义离散变量颜色 |
scale_shape_manual | 自定义离散变量形状 |
ggplot(data = diamond, aes(x=carat, y=price, colour = cut)) + geom_point(size=1) +
scale_color_manual(values = c('blue','yellow','green','orange','pink'))+
scale_x_continuous(name = '克拉',limits = c(0,3))+ggtitle("钻石克拉与价格关系图")# 修改设定的主题分类颜色
坐标系统(Coordinate)
coord_cartesian()默认为笛卡尔坐标系、coord_fixed()通过ratio参数固定横纵比、coord_flip()翻转坐标系、coord_trans()转化为变比例的笛卡尔坐标系、coord_polar()转化为极坐标。 * 举例:风玫瑰图,在一个分类变量组内,根据另一个分类变量继续分类进行频数统计
ggplot(diamond,aes(x = clarity, fill = cut)) + geom_bar() + coord_polar()
图层(Layer)
使用+号即可实现叠加图层,越往后,其图层越在上方。
分面(Facet)
分面有2种函数,函数具体参数有:nrow 表示封装分面排列时行数目、scales 表示分面后坐标轴适应规则,fixed 、free、free_x、free_y,labeller表示指定分面标题内容,label_value、label_both, strip.position 表示指定分面标题放置位置,top” 、bottom”margins网格分面特有,表示是否设置分类总和
- facet_wrap()基于一个因子进行封装分面
- facet_wrap(~var, nrow/ncol =NULL,labeller=“label_value”,strip.position = “top”)
ggplot(diamond,aes(x=carat,y=price))+geom_point(size=0.5)+facet_wrap(~cut)#通过钻石的不同切割工艺这一单一变量进行分类
- facet_grid()基于两个因子进行网格分面
- facet_grid(var1~var2, scales = “fixed”, labeller=“label_value”)
ggplot(diamond,aes(x=carat,y=price))+geom_point(size=0.5)+facet_grid(clarity~cut,scales = "free",margins=TRUE)#通过钻石清晰度和切割工艺两个变量进行分面,用~连接
美化(Beautify)
- 图例(Guides)
- guide_colorbar () 用于连续变量的图例,guide_legend() 用于离散变量的图例,也可以用于连续变量。guides() 将_colorbar和_legend嵌套进去,方便映射,如guides(fill = guide_colorbar())。 可以在scale_xxx()标度中指定guide类型,guide = “colorbar”或guide = “legend”。
- 主题(themes)
- 图形是由数据展示和非数据展示构成的,主题控制所有与数据无关的展示,不改变图形的感官性质,但可以使图形更具有美感,主要包括标题、坐标轴标签、标签位置、以及网格线、背景的颜色搭配。
ggplot(data = diamond, aes(x=carat, y=price, colour = cut)) +
geom_point(size=1) + theme_minimal()#更改ggplot2主题为theme_minimal()
ggplot()综合作图
导入外部中药行业所选公司的ROE数据,将ROE设置为y值,不同的公司设置不同的绘图颜色,将各个公司每年的ROE连接起来,并标记数据点,同时标记并连线各个年度所选公司ROE的均值,并更改x轴、y轴标签,设置y轴刻度,并修改标签位置
library(png)
ggplot(data = roedf, aes(x=YEAR, y=ROE, colour = CORPARATION))+
geom_line(aes(group = CORPARATION))+
geom_point(aes(shape = CORPARATION))+
stat_summary(aes(group=1),fun=mean,geom="point",color="orange",shape=13)+
geom_line(aes(group=1),fun=mean,stat = "summary",color="orange")+
labs(x="年份",y="ROE",title = "中药行业龙头ROE比较")+
scale_y_continuous(limits = c(0,0.3),breaks =c(0,0.05,0.10,0.15,0.20,0.25,0.3))+
theme_light() + theme(plot.title=element_text(hjust = 0.5),axis.text.x = element_text(angle = 60, hjust = 1))
通过转换坐标轴的方式绘制钻石不切割工艺的占比,去掉x轴与y轴的标签,添加标题并更改主题样式
ggplot(diamond,aes(x=factor(1),fill=cut)) + geom_bar(width=1) +
geom_bar(width=1) + coord_polar(theta = 'y')+
labs(x = '', y = '', title = '') +
ggtitle("钻石切割类型比例图")+ theme(axis.text = element_blank())
通过函数计算出了不同切割工艺所占比例,并在绘制的饼图中更改默认标签
<-function(m){
funcround((dim(diamond[diamond["cut"]==m,])[1]/dim(diamond)[1]),2)
}=c(paste("Ideal",func("Ideal")*100,"%"),
labelspaste("Premium",func("Premium")*100,"%"),
paste("Very Good",func("Very Good")*100,"%"),
paste("Good",func("Good")*100,"%"),
paste("Fair",func("Fair")*100,"%"))
ggplot(diamond,aes(x=factor(1),fill=cut)) + geom_bar(width=1) +
geom_bar(width=1) + coord_polar(theta = 'y')+
scale_fill_discrete(labels = labels)+
labs(x = '', y = '', title = '') +
ggtitle("钻石切割类型比例图")+
theme(axis.text = element_blank())
读取地图经纬数据(有特有的格式,所以需要用特定的包来进行读取)并将各个省份的统计数据通过省份名进行合并
Reading layer `china-polygon' from data source
`C:\Users\wenkuangyu\Desktop\about_ggplot2\data\china\china-polygon.shp'
using driver `ESRI Shapefile'
Simple feature collection with 35 features and 7 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 73.50235 ymin: 3.397162 xmax: 135.0957 ymax: 53.56327
Geodetic CRS: WGS 84
geom_sf()是ggplot2中专门用来读取地图数据作图的函数,同时根据疫情的严重程度设置省份的填充色(这里采用官方图片渐变红色来表示疫情的严重程度,使用到了RcolorBrewer这一专门设置渐变色的颜色包),同时更改默认标签为等级人数,对图表标题、主题进行重新设置
library(RColorBrewer)
library(png)
ggplot(merge_data) + xlab("经度") + ylab("纬度") + geom_sf(aes(fill = class))+
scale_fill_manual(name="累计病例数",values = brewer.pal(5,"Reds"),
labels=c("<100","100-500","500-1000", "1000-10000",">10000"))+
ggtitle("疫情分布地图")+theme_bw()+
theme(plot.title=element_text(hjust = 0.5),
axis.text.x = element_text(angle = 60, hjust = 1))
ggplot2扩展包
ggthemes
- ggthemes是ggplot2的一个扩展包,提供一些额外的themes、geoms、scales。
主题 | 描述 |
---|---|
theme_base | 类似于 ggplot 默认设置 |
theme_calc | 类似 LibreOffice Calc 图表 |
theme_economist | 《经济学人》使用的配色方案 |
theme_economist_white | 《经济学人》使用的配色方案 |
theme_excel | 类似经典excel图表 |
theme_few | 简洁型 |
theme_gdocs | 类似默认的Google Docs Chart |
theme_igary | 主题与白色面板和灰色背景 |
theme_map | 简洁的地图主题 |
theme_pander | pander的默认主题 |
theme_solid | 主题删除所有non-geom元素(线条、文本等),这个主题只有所需的几何对象 |
theme_stata | 基于 Stata graph schemes的主题 |
theme_wsj | Wall Street Journal theme |
#更改默认主题为theme_excel()
library(ggthemes)
library(ggplot2)
ggplot(data = diamond, aes(x=carat, y=price, colour = cut))+
geom_point(size=1) + theme_excel()+
theme(plot.title=element_text(hjust = 0.5),axis.text.x =element_text(angle = 60, hjust = 1))
ggmap
ggmap的基本思路是使用下载的地图图像作为ggplot2的基础画布, ggplot2将其作为背景层,然后在地图上绘制数据,统计信息或模型等图层。在ggmap中,这个过程被分成两部分: * (1)下载图像并对它们进行格式化,使用geo_map完成。(被墙了以后无法通过谷歌获取图像,所以ggmap很少被用到,还是使用ggplot2中的geom_sf()绘制底层数据图像) * (2)使用ggmap完成绘图。 `
ggplotgui
ggplotgui顾名思义,ggplot+gui,gui指的是graphic user interface即图形用户界面,我们的windows软件视窗就是一个gui。 * 代码为:ggplot_shiny()