R语言入门--第十六节(ggplot2绘图)

之前学习的绘图方法是基于R的基础绘图系统。在R中一共有四种作图系统,分别为base(之前学的)、grid、lattice,以及ggplot2。其中ggplot2包的目标是提供一个全面的、基于语法的,连贯一致的图形生成系统,允许用户创建新颖的、有创新性的数据可视化图形。关于另外两种的介绍,见p402。

一、预准备

1、安装加载包
不像基础绘图方法可以直接使用,ggplot2包第一次使用要安装、加载。

install.packages("ggplot2")
library(ggplot2)

2、加载实验数据
(1)mtcars数据集包括32辆车的详细信息。

data(mtcars)

(2)singer数据集来自lattice包,包括某合唱团的身高与声音变量

data(singer, package="lattice")
#lattice包已在基础安装里

(3)Salaries数据集来自carData包(教材说是来自car包,可能是最近移动了),其包含了大学教授的收入信息,以及其它相关因素(级别、性别)。

install.packages("carData")
data(Salaries, package="carData") 

二、基础用法

一个简单例子

ggplot(mtcars, aes(x=wt, y=mpg)) +
  geom_point() +
  labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")

如上一个简单的ggplot绘图包括主要有以下三方面内容,用加号(+)相连组成的:
1、ggplot()函数:用于交代绘图的数据来源,并指定要使用的变量信息。其中的aes()即用来指定绘图涉及到的变量,及每个变量扮演的角色,有时也包括分组信息。
2、geom_ 几何函数:指明视觉呈现方式(在我理解就是绘图类型);一张图里可以有多个几何函数呈现,即使用多个geom类型函数。
3、lab()函数:主要用于添加注释信息(标题等)。部分常用参数如下

  • title = 添加主标题;subtitle = 添加副标题,位于主标题下面,字体更小。
  • caption = 在图形右下角添加文本,常用于描述数据来源。
  • x =y =修改坐标轴标题,colour = 修改图例标题

ggplot()函数中的变量选择要根据自己想要绘制什么样的图来研究什么样的变量关系来决定。

汽车重量与MPG的散点图

补充:关于ggplot的绘图变量交代也可放在每个具体的绘图函数中,ggplot()仅交代下数据来源。比如

ggplot(data = mpg) +
  geom_point(aes(x = displ, y = hwy))
# 如果只使用ggplot(data = mpg)只会得到灰色背景

三、关于geom函数

1、geom类型

目前一共有37个几何函数可供使用,教材中列了常见的13种以及所涉及到的参数选项(p407)。比如

  • geom_bar() 表示条形图,涉及选项有color、fill、alpha;
  • geom_boxplot() 表示箱线图,涉及选项有color、fill、alpha、notch、width;
  • geom_histogram() 表示直方图,涉及选项有color、fill、alpha、linetype、binwidth;
  • geom_point() 表示散点图,涉及选项有color、alpha、shape、size;
  • geom_rug() 表示地毯图,涉及选项有color、size。

2、常见选项(详见p408)

  • fill 用于设置填充区域颜色;
  • color 用于设置点、线,边界的颜色;
  • alpha 设置颜色透明度,1不透明;0透明;
  • linetype 设置线条类型;
  • shape 设置点的形状;
  • position 参数对于点图来说 jitter 减少点重叠;对条形图而言有 dodge、stacked、fill三种模式(具体在例子中说明)。

例图:三图综合

ggplot(Salaries, aes(x=rank, y=salary)) +
  geom_boxplot(fill="cornflowerblue",
               color="black", notch=TRUE)+
  geom_point(position="jitter", color="blue", alpha=.5)+
  geom_rug(sides="l", color="black")

如图为箱线图、点图,地毯图的混合图。
(1)对箱线图设置了填充颜色、边界和点的颜色,以及方块缺口;
(2)对点图设置了随机抖动(否则点就排成一列,难以观察)、点的颜色、点的透明度;
(3)对地毯图设置了出现位置,以及线的颜色。


学术级别与收入的关系

举例-1:geom_smooth添加光滑曲线

除了上述提到的几何函数类型,还有一种比较常见的函数:为散点图添加平滑曲线geom_smooth。其涉及到的参数有--(详见p416)一般直接选默认参数。

  • method= 设置使用的平滑函数,默认为smooth的非参数光滑曲线;此外还可选lm(线性)、glm(广义线性)、rlm(稳健线性)、gam(广义相加)。
  • formula= 设置光滑函数公式,默认为y~x;如果是n次多项式,y~poly(x,n)
  • se 设置置信区间,默认TRUE。
  • level 设置置信水平,默认95%
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
  geom_smooth() + geom_point()
#直接使用默认参数
毕业年数与收入的关系,并添加95%置信区间的光滑曲线
  • 如上图,散点的线性关系不是很明显。因此可以拟合一个二次多项式的回归的有参模型。
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
  geom_smooth(method=lm, formula=y~poly(x,2),
              se=FALSE, size=1) +  #设置多项式拟合,并取消了置信区间  
              geom_point(size=2)
多项式拟合

四、分组与刻面

绘图时,若存在一个/多个分类变量可以就分组关系将图分类,以研究分类变量对数据的分布影响。例如将全校的成绩按各个班级角度来看。

1、分组

(1)特征:不同组的分类变量绘制在一张图里。
(2)书写格式:在aes()函数中指明用来区分分类变量的方法即可(比如颜色、符号形状等);比如下例中的color=rank,左边为区分方式(颜色)、右边为分类变量(等级)。其它的分组依据还有:size =alpha =shape =

ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank))  +
  geom_point()

这里绘制毕业年数与收入的关系,并想研究学术级别对其分布的影响


基于学术级别分类,绘制毕业年数与收入的散点图

补充1:分组颜色方案是ggplot2默认的,也可以选择ColorBrewer 提供的系列配色方案;或者直接自己自定义。例如下代码---

ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank))  +
  geom_point()  +
  scale_color_brewer(palette = "Set1")
  #scale_colour_manual(
  #values = c(AsstProf = "red", AssocProf = "blue", Prof = "black")
)

补充2:二分类颜色

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = displ < 5))
#依据displ变量是否大于5,分为两类颜色
  • 接下来举一例:用性别分组的柱状图研究不同学术级别的人数,并以此来探究下之前提到的position的三种设置的区别。(绘图中用到了绘制多重图的方法--grid.arrange()的使用也是一个常用的技巧)
library(gridExtra)
p1 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="stack") + labs(title='position="stack"')
p2 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="dodge") + labs(title='position="dodge"')
p3 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="fill") + labs(title='position="fill"')

grid.arrange(p1, p2, p3, ncol=3)

如下图,可看出:
(1)position="stack" 绘制堆叠分组条形图;
(2)position="dodge" 绘制分组条形图并排;
(3)position="fill" 绘制堆叠分组,高度相同,按比例解释。

学术级别人数基于性别的人数分布

2、刻面图

(1)特征:区别于上述分组图,刻面图是按分类因子分开绘制数张图(几个类别就画几张图)
(2)函数:刻面图有专门的函数绘制,有以下4种--

  • facet_wrap(~var,ncol=n) 设置多图排成n列;
  • facet_wrap(~var,nrow=n) 设置多图排成n行;
data(singer, package="lattice")
library(ggplot2)
ggplot(data=singer, aes(x=height)) +
  geom_histogram() +
  facet_wrap(~voice.part, nrow=4)
#分成4行排列
八个声部歌手的身高分布直方图

如果想把多图排成一个单列/单行,以便于比较组间数据差异。(当然前面提到的连个函数也可以)

  • facet_grid(var~.) 设置排成单列
  • facet_grid(.~var) 设置排成单行
ggplot(data=singer, aes(x=height, fill=voice.part)) +
  geom_density() +
  facet_grid(voice.part~.)
#单列排布,利于比较观察
八个声部歌手的身高分布密度图

如果有两个分类变量var1、var2,分别有m、n类,可以用facet_grid(var1~var2)函数绘制m*n个刻面图。

五、自定义ggplot2图形的外观

1、坐标轴(p419)

主要针对两类坐标轴:类别型与连续型

  • 以x轴为例分别为scale_x_discrete()scale_x_continuous();
  • 主要涉及两个参数breaks=labels=
  • scale_x_discrete()scale_y_discrete() 可用于修改x轴或y轴的刻度单位值(break=);修改刻度标签(labels=)
    关于后者labels= 比较好理解,就是我们看到坐标轴上的注释性刻度标签;
    关于前者breaks=,是实际绘图的参照轴刻度值。对于连续型变量,一般是从小到大的数值型向量;对于类别型变量,一般对应实际数据分类因子字符向量。具体见下例

(1)原图

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Sex", x="", y="")
#ggplot2默认情况下会数据添加标签、图例等。
默认参数

(2)自定义标签

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
                   labels=c("Assistant\na",
                            "Associate\nb",
                            "Full\nc")) +
  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="")
修改标签

注意如果想改变类别型变量在x轴上的分布次序,那么需要修改原数据该列的因子顺序,对应上例,即Salaries$rank=factor(Salaries$rank,levels = c("Prof","AsstProf", "AssocProf")),再执行上述操作,即可改变箱图的顺序。


补充:交换x、y轴+ coord_flip()

2、图例

自动生成的图例都可以满足大多数情况的需求。一般修改的话,即修改图例的标题与位置。
(1)图例标题在labs()函数的fill选项修改。本例中把sex改为了Gender。
(2)图例位置通过theme()函数修改。本例中图例位于距y轴10%,距x轴80%。

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Gender",
       x="", y="", fill="Gender") +
  theme(legend.position=c(.1,.8))

通过指定比例坐标信息,可以将图例摆放在绘图区域的特定位置。而ggplot默认将图例放在图的右侧(四周外面)legend.position="left/top/bottom/right"
legend.positon = "none"则会取消图例。

修改图例

3、主题

  • theme_*()族函数,来定制图形中的非数据元素


    ggplot2内置的8种主题
  • 如下示例对比
g1 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = class))
g2 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = class)) +
  theme_classic()
library(gridExtra)
grid.arrange(g1, g2, ncol=2)
g1 & g2

4、保存图形

ggsave()函数
(1)保存指定图形(plot、width、height)

myplot1 <- ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my01.png", plot=myplot1, width=5, height=4)
#保存尺寸为5英寸×4英寸,即12.7cm×10.2cm

(2)保存刚刚得到的图形

ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
  labs(title="Faculty Salary by Rank and Gender",x="", y="")
ggsave(file="my02.png")

此外教材中还有三维气泡图,如何给分组观测自定义颜色,以及主题的设置,详见p422。以上是关于ggplot2函数基础知识的学习。ggplot2的功能是很强大的,后续有机会再进行深入的探索与学习。
寒假关于R语言的学习可能就暂时到这一章节了,之后要刷学校的网课了,盼望能够早日开学吧。
参考教材《R语言实战(第2版)》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341