ggplot2 学习
前言
在R in action 第2版中有对这个绘图包的简单介绍,可以画出一些初步的图,并且对这个包有系统的了解,内容比较全面,基本可以满足常见的绘图需求。冲冲冲!之后再深入细节,参考官方文档、书籍、以及其它人的经验等,画出更好看的图。
例子与基本语法
首先一个简单的例子:(前提,先安装一下ggplot2)
library(ggplot2)
ggplot(data = mtcars,aes(x = wt,y = mpg))+
geom_point()+
labs(title = "plot1",x = "weight",y = "miles per gallon")
得到一张比较原始的图:
ggplot() 用来初始化图形,并且指定数据来源和变量,aes()是用来指定每个变量扮演的角色,最基本的就是指定一下x,y轴啦,比如变量wt的值映射沿x轴的距离。但是这里的设置并没有视觉输出,加点的函数在第二行,创建了一个散点图。
几何函数:向图中添加几何对象,比如例子中的geom_point(),都是以geom_开头的一系列函数,包括点、线、条、箱线图等。
添加注释 例子中的labs,可以添加标题和轴标签。
每一个函数都有许多自己的参数,然后把每个函数设置的都用+连接起来,越后边的设置,就越上边,有点像图层的叠加,把每种类型参数的设置都分开,有点抽象,多试试可能就更理解了吧。
设置更多的参数,能画出更多想要的效果。
1.几何函数 - 图的类型
有很多种几何函数,比较常见的有:
- geom_bar() : 条形图
- geom_boxplot() : 箱线图
- geom_density() : 密度图
- geom_histogram() : 直方图,仅需指定x轴,记录其频数。
- geom_hline() : 水平线
- geom_vline() : 垂直线
- geom_jitter() : 抖动点
- geom_line() : 线图
- geom_point() : 散点图
- geom_rug() : 地毯图,??好奇
- geom_smooth() : 拟合曲线
- geom_text() : 文字注解
- geom_violin() : 小提琴图
几何函数常见的参数,点、线颜色和类型等等。 - color 点、线、填充区域的边界颜色
- fill 填充区颜色,比如条形、密度等
- alpha 颜色透明度,0(完全透明)~1(不透明)
- linetype 线形,有六种,1-6
- size 点的尺寸和线的宽度
- shape 点的形状,和pch类型相同
- positon 位置,如:"dodog"将分组条形图并排,"stacked"分组条形图的堆叠,“fill” 垂直的堆叠分组条形图并规范其高度相等,"jitter"抖动,减少点的重叠。
- binwidth 直方图宽度
- notch 方块是否应为缺口(T/F)
- side 地毯图的位置,“b” “l” “t” “R” “bl” 分别表示,底部、左边、顶部、右边、左下。
- width 箱线图的宽度
来用一用这些函数:
mtcars$vs_f<-factor(mtcars$vs,levels = c(0,1),labels = c("vs_0","vs_1"))#把数字变成因子
ggplot(mtcars,aes(x = vs_f,y = drat))+
geom_jitter(color = "blue",size = 1.5,shape = 16,alpha = 0.8)+ #抖动点不聚在一块
geom_boxplot(color = "black",alpha = 0.5)+
geom_rug(side = "l",color = "blue")
密度图:
ggplot(data = mtcars,aes(x = drat,fill = vs_f))+#在aes里设置分组,自动产生图例
geom_density(alpha = 0.5)+
theme_classic()#改一个背景,灰色的好丑
2.分组 - aes()
上述的几个图其实也用到了分组,可以发现都是在aes() 中设置,变量应该设置在aes内,常数设置在它外头的其它函数中。前提是这些分组的变量都是因子类型,在图中还会自动给出图例,图例中的颜色、点的类型都是自动给出的,之后会讲到如何手动调整到自己想要的。
试一下分组散点图:
mtcars$am_f<-factor(mtcars$am,levels = c(0,1),labels = c("am_0",'am_1'))
ggplot(data = mtcars,aes(x = wt,y = mpg,col = vs_f,shape = am_f))+
geom_point()+
theme_classic()
3.分面 - 刻面图
一个图变成多个并列的图,刻面图函数有:
- facet_wrap(~var,ncol = n),将每个var水平排列成n列的独立图;
- facet_wrap(~var,nrow = n),将每个var水平排列成n行的独立图;
- facet_grid(rowvar ~ colvar) rowvar 和colvar 组合的独立图;
- facet_grid(rowvar ~ .)每个rowvar水平的独立图,配置成一个单列;
- facet_grid(.~ colvar) 每个colvar水平的独立图,配置成一个单行。
#分面
ggplot(data = mtcars,aes(x = wt,y = mpg))+
geom_point()+
facet_grid(am_f ~ vs_f)
#分组分面结合
ggplot(data = mtcars,aes(x = wt,y = mpg,col = vs_f))+
geom_point()+
facet_wrap(~ am_f,ncol = 2)
4.添加光滑曲线
添加一些拟合线的函数为geom_smooth()
参数有:
- method = 使用的平滑函数,包括:lm-线性拟合;glm-广义线性;smooth-loess;rlm-稳健线性;gam-广义相加模型。默认是smooth.
- formula = 光滑函数中使用的公式,默认的话就是y ~ x,还有y ~ log(x),y ~ poly(x,n) n次多项式拟合,y ~ ns(x,n)具有n个自由度的样条拟合。
- se 绘制置信区间,默认为TRUE。
- level 使用的置信区间水平,默认0.95
- fullrange 指定拟合应涵盖全图(T)仅数据(F),默认为F。
#添加光滑曲线
ggplot(data = mtcars,aes(x = wt,y = mpg,col = vs_f))+
geom_point()+
geom_smooth(method = lm,se = F)+#线性拟合,删掉灰色的置信区间。
theme_classic()
5.修改图形外观
坐标轴
在最开始的例子里,用了labs()来添加标题和修改轴标签,那有哪些自定义坐标轴的函数呢?针对连续变量和分组变量,有以下一些函数:
- scale_x_continuous(),scale_y_continuous() :breaks = 指定刻度标记,labels = 指定刻度上要标记的标签,limits = 控制要展示值的范围。
- scale_x_discrete(),scale_y_discrete():breaks = 对因子的水平进行放置和排序,labels = 指定标签,limits = 控制要展示哪些水平。
- coord_flip() :颠倒x.y轴。
图例的修改和位置
labs()修改标题、xy轴标签、图例标题。theme()中的函数来调整图例的位置,具体见例子。
#编辑坐标轴、图例
ggplot(mtcars,aes(x = vs_f,y = mpg,fill = am_f))+
geom_boxplot()+
scale_x_discrete(breaks = c("vs_0","vs_1"),labels = c("vs = 0","vs = 1"))+#修改横坐标轴
labs(title = "boxplot of mpg",x = "",y = "Miles Per gallon",#把x轴标签去掉
fill = "value of am")+#这个对应aes中的fill,修改图例的标题。
theme(legend.position = c(0.2,0.8))#放图例的位置
theme(legend.position = c(0.2,0.8))表示把图例放在距离左边20%、距离下边80%的地方。
还有点问题,一个是标题为啥不是居中,有点别扭,第二是图例中的图案、组名怎么修改呢?先保留一下问题。
标尺
用标尺把观测值映射到可视化的空间中,可以应用于连续变量,也可以应用于离散变量,那具体有什么用呢?在之前的例子中也用到了,在aes()函数中指定fill,color等,还可以指定size,在图像中呈现出更多信息。
#标尺
ggplot(mtcars,aes(x = wt,y = mpg,size = disp))+ #disp是一个连续变量哦
geom_point(shape = 21,col = "black",fill = "pink")+
labs(x = "Weight",y = "Miles per gallon",title = "Bubble chart",
size = "Engine\nDisplacement")#这个是对应与aes中的,修改图例标题。
这里的disp是一个连续变量,实现了把它的大小和圆圈大小联系起来,并且在图例中也自动分好了组和标签,这就是传说中的泡泡图。
我想了想,大小可以跟着连续变量变化,那深浅是不是也可以嘞,于是乎,我稍作改动。
ggplot(mtcars,aes(x = wt,y = mpg,size = disp,alpha = wt))+ #disp是一个连续变量
geom_point(shape = 21,col = "black",fill = "red")+
labs(x = "Weight",y = "Miles per gallon",title = "Bubble chart",
size = "Engine\nDisplacement")#这个是对应与aes中的,修改图例标题。
虽然在这个图里这个深浅是没什么必要,因为很坐标上标了,不过在其它图中说不定是很有用的。
ggplot(data = mtcars,aes(x = drat,y = disp, color = disp ))+
geom_point(size = 2)
多重图-图的组合
想把几个设置颜色的图组合在一块,顺便就学上这个图的组合。在R基础作图中,可以使用par(),layout(),在ggplot2中不行,需要下载安装一个gridExtra包。使用grid.arrange()函数。
install.packages("gridExtra")
library(gridExtra)
p1<-ggplot(data = mtcars,aes(x = drat,y = disp, color = vs_f ))+
scale_color_manual(values = c("orange","blue"))+#手动设置颜色之直接写名字
geom_point(size = 2)+
theme_classic()
p2<-ggplot(data = mtcars,aes(x = drat,y = disp, color = vs_f ))+
scale_color_brewer(palette = "Set1")+#手动设置颜色之直接写名字
geom_point(size = 2)+
theme_classic()
p3<-grid.arrange(p1,p2,ncol = 2)
ggsave(file = "D:/R_demo/ggplot2/12.23_11.jpg",plot = p3,width = 10,height = 4)
#如果不指定plot,就是最近的那幅图。
图形的保存
上述例子中用到了,使用ggsave()函数,参数见上述示例。
主题设置
theme()函数中的选项可以调整字体、背景、颜色、网格线等等,可以使用一次,也可以保存起来应用到多个图中,之前的例子中也有用到包里默认的一些主题背景。
看一下默认有的一些主题:
主题的修改或者自己设计该怎么做呢?
参数一大堆嗷,最好就是自己有什么需要,help,找一下对应的修改函数,而且有示例文档。
这里和theme配套的语法,有element_XXX
我理解格式是这样的:
theme(图里位置.元素类型(具体参数))
帮助文档原文:
In conjunction with the theme system, the element_ functions specify the display of how non-data components of the plot are drawn.
element_blank: draws nothing, and assigns no space.
element_rect: borders and backgrounds.注意这个是数据之外的背景,包含标题,标签等。
element_line: lines.
element_text: text.
rel() is used to specify sizes relative to the parent, margin() is used to specify the margins of elements.
然后element_XXX()函数下面也有很多参数,查看帮助文档比较方便。
我只能说实在是有太多参数了,而且图又那么多,还是之后有空再整理一下看看吧,之后仔细学一下主题的设置,还有与ggplot2相关的一些包的使用、各类具体图形的画法。
结语
写了大半天嘞,如果这份学习笔记对你有帮助,那就: