R013 绘图简介

1.R的四种主要图形系统

  • Basic,由Ross Ihaka编写,每个R都默认安装
  • grid,由Paul Murrell(2011)编写,通过grid包安装执行
  • lattice,由Deepayan Sarkar(2008)编写,总的来说,网格图形显示一个变量的分布或是变量之间的关系,分别显示一个或多个变量的各个水平。lattice包基于grid包创建,在多元数据的可视化功能方面已经远超Cleveland的原始方法。它为R提供了一种全面的、创建统计图形的备选系统。
  • ggplot2包由Hadley Wickham(2009a)编写,提供了一种基于Wilkinson(2005)所述图形语法的图形系统

2. ggplot

在ggplot2中,图是采用串联起来

\color{red}{(+)}
号函数创建的。每个函数修改属于自己的部分。

2.1 ggplot()函数

ggplot(data = NULL, mapping = aes(), ..., environment = parent.frame())

  • ggplot指定要绘制的数据源和变量,但没有自己的视觉输出
  • aes()函数的功能是指定每个变量扮演的角色(aes代表aesthetics,即如何用视觉形式呈现信息)
2.2 geom()函数

geom()几何函数指定变量如何在视觉上进行表示(使用点、条、线和阴影区),目前,有37个几何函数可供使用

2.2.1 几何函数geom()的主要类型
函数 添加 选项
geom_bar() 条形图 color, fill, alpha
geom_boxplot() 箱线图 color, fill, alpha, notch, width
geom_density() 密度图 color, fill, alpha, linetype
geom_histogram() 直方图 color, fill, alpha, linetype, binwidth
geom_hline() 水平线 color, alpha, linetype, size
geom_vline() 垂线 color, alpha, linetype, size
geom_jitter() 抖动点 color, size, alpha, shape
geom_line() 线图 colorvalpha, linetype, size
geom_point() 散点图 color, alpha, shape, size
geom_rug() 地毯图 color, side
geom_smooth() 拟合曲线 method, formula, color, fill, linetype, size
geom_text() 文字注释 -
geom_violin() 小提琴图 color, alpha, linetype, size
……
2.2.2 几何函数geom()的主要参数
选项 描述
color 对点,线和填充区域的边界进行着色
fill 对填充区域进行着色,如条形或者密度区域
alpha 颜色的透明度,从0(完全透明)到1(不透明)
linetype 图案的线条,1=实线,2=虚线,3=点,4=点破折号,5=长破折号,6=双破折号
size 点的尺寸和线的宽度
shape 点的形状,同基础画图的pch
position 绘制注入条形图和点对象的位置;对于条形图,“dodge”将分组条形图并排,“stacked”堆叠分组条形图,“fill”垂直地堆叠分组条形图并规范其高度相等;对于点来说,“jitter” 减少点的重叠
binwidth 直方图的宽度
notch 表示方块图是否应为缺口(FALSE/TRUE)
sides 地毯图的安置,“b”=底部,“l”=左侧,“t”=顶部,“r”=右侧,“bl”=坐下侧
width 箱线图的宽度

例如:

ggplot(mtcars,aes(x=wt,y=mpg)) + geom_point()
image.png
2.3 几何图形的堆叠
library(ggplot2)
data(singer, package="lattice")
ggplot(singer, aes(x=voice.part, y=height)) +
geom_violin(fill="lightblue") +
geom_boxplot(fill="lightgreen", width=.2)
image.png
2.4 分组

在R中,组通常用分类变量的水平(因子)来定义。分组是通过ggplot2图将一个或多个带有诸如形状、颜色、填充、尺寸和线类型的视觉特征的分组变量来完成的。

  • ggplot()声明中的aes()函数负责分配变量(图形的视觉特征)
  • 变量应该设在aes()函数内,分配常数应该在aes()函数外,变量在aes()内外的效果是完全不同的
  • 需要注意的是,分组可能是连续变量,在指定颜色时可能会报错,因此需要先转换为分类因子
## 初次使用需install.packas("car")
library(car)
## 加载Salaries可能会报错,但是不影响出图
data(Salaries, package="car")
library(ggplot2)
## aes()指定分组
## 填充设置透明度(alpha),使重叠曲线不掩盖彼此
ggplot(data=Salaries, aes(x=salary, fill=rank)) +
  geom_density(alpha=.3)
image.png
2.5 刻面
  • 基础画图的mfcol,mfrow,layout不适用与ggplot
  • 可以使用facet_wrap()函数和facet_grid()函数创建网格图形(在ggplot2中也称刻面图)
语法 结果
facet_wrap(~var,ncol=n) 将每个var水平排列成n列的独立图
facet_wrap(~var,nrow=n) 将每个var水平排列成n行的独立图
facet_grid(rowvar~colvar) rowvar和colvar组合的独立图,其中rowvar表示行,colvar表示列
facet_grid(rowvar~.) 每个rowvar水平的独立图,配置成一个单列
facet_grid(.~colvar) 每个colvar水平的独立图,配置成一个单行
data(singer, package="lattice")
library(ggplot2)
ggplot(data=singer, aes(x=height)) +
  geom_histogram() +
  facet_wrap(~voice.part, nrow=4)
image.png
2.6 添加光滑曲线
  • geom_smooth()函数被用来添加一系列的平滑曲线和和置信区域
选 项 描 述
method= 使用的平滑函数。允许的值包括lm、glm、smooth、rlm和gam,分别对应线性、广义线性、loess、健壮线性和广义相加模型。smooth是默认值
formula= 在光滑函数中使用的公式。例子包括y~x(默认),y ~ log(x),y~poly(x,n)表示n次多项式拟合,y ~ ns(x,n)表示一个具有n个自由度的样条拟合
se 绘制置信区间(TRUE/FALSE)。默认为TRUE
level 使用的置信区间水平(默认为95%)
fullrange 指定拟合应涵盖全图(TRUE)或仅仅是数据(FALSE)。 默认为FALSE
  • 注意:ggplot2包中含有大量统计函数来计算所需要的量,从而生产更多的可视化数据。通常情况下几何函数隐式地调用统计函数,我们不需要直接处理这些问题。例如geom_smooth()函数依赖于stat_smooth()函数来计算画出一个拟合曲线及其置信限所需的数量。在探索几何函数如何工作和哪些选项可供选择时,一定要检查这个函数及其相关统计函数。
library(car)
data(Salaries, package="car")
library(ggplot2)
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
  geom_smooth() + geom_point()
image.png
2.7 修改ggplot2 图形的外观
  • 基础函数使用par()函数或特定画图函数的图形参数来自定义基本函数。
    但是改变基本图形参数对于ggplot2图形没有影响
2.7.1 坐标轴
  • ggplot2包会在创建图时自动创建刻度线、刻度标记标签和坐标轴标签
  • labs()函数可用来来添加标题并改变坐标轴标签
  • 控制坐标轴及刻度线外观的函数
    ggplot2的函数区分x轴和y轴,以及轴线是否代表一个连续或离散变量(因子)(连续:continuous,离散:discrete)
    | 函 数 | 选 项 |
    | - | - |
    | scale_x_continuous()和scale_y_continuous() | breaks=指定刻度标记,labels=指定刻度标记标签,limits=控制要展示的值的范围 |
    | scale_x_discrete()和scale_y_discrete() | breaks=对因子的水平进行放置和排序,labels=指定这些水平的标签,limits=表示哪些水平应该展示 |
    | coord_flip() | 颠倒x轴和y轴 |
library(car)
## 可能会报错没有‘Salaries’这个数据集,但不影响出图
data(Salaries,package="car")
library(ggplot2)
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
  geom_boxplot() +
## 设置离散型变量x,x轴标签通过labels设置,“\n”为换行显示防止标签过长  
  scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
                   labels=c("Assistant\nProfessor",
                            "Associate\nProfessor",
                            "Full\nProfessor")) +
## 设置离散型变量y 
    scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
                     labels=c("$50K", "$100K", "$150K", "$200K")) +
## 标题设置为labs(),与轴标签“labels=”进行区分
  labs(title="Faculty Salary by Rank and Sex", x="", y="")
image.png
2.7.2 图例
  • ggplot2包能自动生成图例,而且在很多时候能够满足我们的需求;但是在其他时候,我们可能要对其进行自定义。$\color{red}{标题和位置}是最常用的定制特征。
  • 当更改图例的标题时,必须考虑图例是否基于颜色、填充、尺寸、形状或它们的组合。通常情况下aes()函数分组会自动生成图例,我们可以通过更改分组变量,如将fill="mytitle"加到labs()函数中来改变标题。
  • 标题的位置由theme()函数中的legend.position选项控制。可能的值包括"left"、"top"、"right"(默认值)和"bottom"。我们也可以在图中给定的位置指定一个二元素向量
  • 如果想删除图例,可以使用legend.position="none"
data(Salaries,package="car")
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 Gender",
       x="", y="", fill="Gender") +
  theme(legend.position=c(.1,.8))
image.png
2.7.3 标尺

ggplot2包使用标尺aes("size=")把数据空间的观察值映射到可视化的空间中。标尺既可以应用到连续的变量,也可以应用到离散的变量
可以使用标尺将带有因子水平的视觉线索(如颜色、形状、线条类型、
尺寸和透明度)关联起来

  • 尺寸
## aes()函数的参数size=disp生成连续型变量disp(发动机排量)的标尺,并使用它来控制点的尺寸
ggplot(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")
image.png
  • 颜色
data(Salaries, package="car")
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
  scale_color_manual(values=c("orange", "olivedrab", "navy")) +
  geom_point(size=2)
image.png

可以通过scale_color_brewer()和scale_fill_brewer()函数来预先指定分得清的颜色集
为了得到可获得的颜色集,可以使用:

library(RColorBrewer)
display.brewer.all()
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
  scale_color_brewer(palette="Set1") + geom_point(size=2)
image.png
2.7.4 主题

theme()函数中的选项可以让我们调整字体、背景、颜色和网格线等。主题可以使用一次,也可以保存起来应用到多个图中。

主题元素 类型 描述
line 所有线属性
rect 所有矩形区域属性
text 所有文本属性
title 所有标题属性
plot.title text 图表标题
plot.background rect 图表背景
plot.margin 图表边距
panel.background rect 绘图区背景
panel.border rect 绘图区边框
panel.margin rect 绘图区边距
panel.grid line 网格线系统
panel.grid.major line 主网格线
panel.grid.minor line 次网格线
panel.grid.major.x line x轴主网格线
panel.grid.major.y line x轴次网格线
panel.grid.minor.x line y轴主网格线
panel.grid.minor.y line y轴次网格线
axis.line line 坐标轴线
axis.line.x line x坐标轴线
axis.line.y line y坐标轴线
axis.title text 轴标题
axis.title.x text x轴标题
axis.title.y text y轴标题
axis.text text 轴标签
axis.text.x text x轴标签
axis.text.y text y轴标签
axis.ticks line 坐标轴刻度线
axis.ticks.x line x坐标轴刻度线
axis.ticks.y line y坐标轴刻度线
axis.ticks.length line 刻度线长度
axis.ticks.margin line 刻度线与刻度线标签间的间距
legend.background 图例背景
legend.margin 图例边界
legend.key 图例符号
legend.key.size 图例符号大小
legend.key.height 图例符号高度
legend.key.width 图例符号宽度
legend.text 图例文本标签
legend.text.align 图例文本对齐方式,0=左对齐,1=右对齐
legend.title 图例标题
legend.title.align 图例标题对齐方式
legend.position 图例位置,left,right,bottom,top,二维向量
legend.direction 图例排列方向,horizontal,vertical
legend.justification 图例居中方式,center,或者向量
legend.box 多图例排列,horizontal,vertical
data(Salaries, package="car")
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="grey",
                                                 linetype=1),
                 panel.grid.minor.y=element_line(color="grey",
                                                 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
image.png
2.7.5 保存图形

ggsave()函数能更方便地保存图形。它的选项包括保存哪幅图形,保存在哪里和以什么形式保存

ggsave( filename,
  plot = last_plot(),
  device = NULL,
  path = NULL,
  scale = 1,
  width = NA,
  height = NA,
  units = c("in", "cm", "mm"),
  dpi = 300,
  limitsize = TRUE,
  ...
)

Reference

1.R语言实战第二版
2.https://blog.csdn.net/kmd8d5r/article/details/79386843

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