《ggplot2: 数据分析与图形艺术》学习笔记1


title: "《ggplot2: 数据分析与图形艺术》学习笔记1"
author: "wintryheart"
date: "2019年5月10日"
output:
html_document:
toc: TRUE
toc_float: TRUE


knitr::opts_chunk$set(echo = TRUE, warning = FALSE)

1、图形语法

一张统计图形是从数据几何对象的图形属性的一个映射。此外,图形中还可能包含数据的统计变换,最后绘制在某个特定的坐标系中,而分面则可以用来生成数据不同子集的图形。
一张统计图形就是由上述这些独立的图形部件所组成的。

  • 最基础的部分是你想要可视化的数据(data)以及一系列将数据中的变量对应到图形属性的映射(mapping)
  • 几何对象(geom):在图中实际看到的图形元素,如点、线、多边形等;
  • 统计变换(stats):对数据进行的某种汇总,如分组计数、线性回归等。可选,但很有用。
  • 标度(scale):将数据的取值映射到图形空间,如用颜色、大小或形状来表示不同的取值,使读者可以从图形中读取原始数据。展现方式为绘制图例坐标轴
  • 坐标系(coord):描述数据是如何映射到图形所在的平面,同时提供看图所需的坐标轴和网络线。通常使用笛卡尔坐标系,但也可以变换为其他类型,如极坐标和地图投影。
  • 分面(facet):描述如何将数据分解为各个子集,以及如何对子集作图并联合进行展示。分面也称为条件作图或网格作图。

2、qplot(quick plot)快速作图

主要学习:

  • qplot()的基本用法
  • 数据和映射
  • 图形属性(如颜色、大小和形状)
  • 几何对象(如点、线、条形等))
  • 分面(条件作图)
  • 外观

2.2 数据集

ggplot2包中的diamonds数据集包含约54000颗钻石的信息,数据涵盖:

  • 钻石质量的四个C:

    • 克拉重量(carat)
    • 切工(cut)
    • 颜色(color)
    • 净度(clarity)
  • 五个物理指标

    • 深度(depth)
    • 钻面宽度(table)
    • 其他测量尺度(x, y, z)
library(gridExtra)  #支持ggplot2多图并列
library(ggplot2)
data("diamonds")
head(diamonds)

这个数据集太大,我们取100个随机样本来作图展示。

set.seed(1410) ##让样本可重复
dsmall <- diamonds[sample(nrow(diamonds),100),]
第一张图
attach(diamonds)
p1 <- qplot(carat, price)  #价格和重量之间的关系
p2 <- qplot(log(carat), log(price))  #变量变换
p3 <- qplot(carat,x*y*z)  #变量组合,体积和重量之间关系
grid.arrange(p1,p2,p3, ncol=3)
detach(diamonds)
qplot-1.png

2.4 图形属性

attach(dsmall)
p4 <- qplot(carat, price, color=color) #将color变量映射到点的颜色
p5 <- qplot(carat, price, shape=cut)  # 将cut变量映射到点的形状
grid.arrange(p4,p5,ncol=2)
detach(dsmall)
mapping-1.png

不同类型的变量适合不同的图形属性:

  • 颜色和形状适合于分类变量;
  • 大小适合于连续变量;
  • 数据量很大,不同组的数据之间很难区分,适合于分面。

2.5 几何对象

适用于考察二维变量关系的几何对象:

  • geom="point",绘制散点图。
  • geom="smooth",拟合一条平滑曲线,并将曲线和标准误展示在图中。
  • geom="boxplot",绘制箱形胡须图,用以概括一系列点的分布情况。
  • geom="path"和geom="line"可以在数据点之间绘制连线。
    • 路径图可以是任意的方向;
    • 线条图只能创建从左到右的连线。

适用于考察一维变量分布的几何对象:

对于连续变量:

  • geom="histogram", 绘制直方图;
  • geom="freqpoly",绘制频率多边形;
  • geom="density",绘制密度曲线。
  • qplot()默认直方图。

对于离散变量:

  • geom="bar",绘制条形图。

2.5.1 平滑曲线

添加平滑曲线,展示数据趋势。

p5 <- qplot(carat, price, data=dsmall, geom=c("point","smooth")) 
#利用c()函数将多个几何对象组成一个向量传递给geom。几何对象会按指定的顺序进行堆叠。  
#如果不想绘制标准误,可以使用se=FALSE。
p6 <- qplot(carat, price, data=dsmall, geom=c("point", "smooth"), se=FALSE)
grid.arrange(p5, p6, ncol=2)
smooth-1.png

利用method参数可以选择许多不同的平滑器:

  • method="loess",当n<1000时是默认选项,使用的是局部回归的方法。曲线的平滑程度由span参数控制,取值范围为0(很不平滑)至1(很平滑)。
qplot(carat, price, data=dsmall, geom=c("point","smooth"), span=0.2)
loess-1.png
  • method="gam", formula=y ~ s(x),调用mgcv包拟合一个广义可加模型。这个模型与lm中的样条模型类似,但样条的阶数是通过数据得到的。如果n>1000,使用公式 formula = y ~ s(x, bs="cs")。
library(mgcv)
p7 <- qplot(carat, price, data=dsmall, geom=c("point","smooth"), method="gam", formula=y~s(x))
p8 <- qplot(carat, price, data=diamonds, geom=c("point","smooth"), method="gam", formula=y~s(x, bs="cs"))
grid.arrange(p7, p8, ncol=2)
mgcv-1.png
  • method="lm",默认拟合一条直接。通过指定formula = y ~ poly(x,2)可以拟合二次多项式。通过加载splines包可以使用样条模型:formula = y ~ ns(x,2)。第二个参数是自由度:自由度越大,曲线波动越大。
p9 <- qplot(carat, price, data=dsmall, geom=c("point","smooth"), method="lm")
library(splines)
p10 <- qplot(carat, price, data=dsmall, geom=c("point","smooth"), method="lm", formula=y~ns(x,5))
grid.arrange(p9,p10, ncol=2)
splines-1.png
  • method="rlm",与“lm”类似,但调用MASS包,拟合稳健回归直线。

2.5.2 箱线图和扰动点图

p11 <- qplot(color, price/carat, data=diamonds, geom="jitter")  #扰动点图
p12 <- qplot(color, price/carat, data=diamonds, geom="boxplot")  #箱线胡须图
grid.arrange(p11,p12,ncol=2)
jitter-1.png

对于扰动点图,可以如一般散点图控制其他图形属性,如size, colour和shape。
对于箱线图,可以用color控制框线颜色,fill设置填充颜色,size调节线的粗细。

2.5.3 直方图和密度曲线图

p13 <- qplot(carat, data=diamonds, geom="histogram")  #直方图
p14 <- qplot(carat, data=diamonds, geom="density")  #密度曲线图
grid.arrange(p13, p14, ncol=2)
histogram-1.png

对于密度曲线,adjust参数控制曲线的平滑程度,取值越大,曲线越平滑。
对于直方图, binwidth参数,通过设定组距来调节平滑度。 组距越小,越体现细节。

对于分组分布比较,只需要再加上一个图形映射。

p15 <- qplot(carat, data=diamonds, geom="density", color=color)
p16 <- qplot(carat, data=diamonds, geom="histogram", fill=color)
#等式后面的color是数据集中的变量color钻石颜色,按color分组。
grid.arrange(p15,p16,ncol=2)
group-1.png

2.5.4 条形图

在离散变量的情形下,条形图与直方图类似。
如果数据已经汇总,或者想用其他的方式对数据进行分组处理(如,对连续变量进行分组求和),可以使用weight几何对象。

p17 <- qplot(color, data=diamonds, geom="bar")  #普通条形图
p18 <- qplot(color, data=diamonds, geom="bar", weight=carat) +
  scale_y_continuous("carat")  #按重量加权的条形图,展示每种颜色的钻石的总重量
grid.arrange(p17,p18,ncol=2)
bar-1.png

2.5.5 时间序列中的线条图和路径图

线条图将点从左到右进行连接(等价于将数据按X取值进行排序,然后绘制路径图);x轴一般是时间,展示单变量随时间变化的情况。
路径图按照点在数据集中的顺序对其进行连接。展示两个变量随时间联动的情况,时间反映在点的顺序上。

p19 <- qplot(date, unemploy/pop, data=economics, geom="line")  #失业率变化  
p20 <- qplot(date, uempmed, data=economics, geom="line")  #失业星期数的中位数变化
grid.arrange(p19,p20, ncol=2)
serial-1.png

我们可以用一张散点图表示失业率和失业时间长度之间的关系,但是我们不能看出变量关系随时间的变化。解决办法是将临近时间点的散点连接起来,形成一张路径图。
由于线条有很多交叉,我们可以将年份映射到color属性上,方便看出时间的行进方向。

year <- function(x) as.POSIXlt(x)$year +1900  #year函数提取年份
qplot(unemploy/pop, uempmed, data=economics, geom="path", color=year(date))
#可以看出虽然失业率失业时间长度一直高度相关,但最近几年,失业时间长度与失业率相比有增长的趋势。
path-1.png

2.6 分面

分面将数据分割成若干子集,然后创建一个图形矩阵,将每一个子集绘制到图形矩阵的窗格中。所有的子图采用相同的图形类型,并进行一定的设计,使得它们之间方便比较。

qplot()通过row_var ~ col_var表达式进行指定。可以指定任意数量的行变量和列变量,但注意当变量数超过两个时,生成的图形可能非常多,以至于不适合在屏幕上显示。

如果只想指定一行或一列,可以使用.作为占位符,例如row_var ~ . 创建一个单列多行的图形矩阵。

p21 <- qplot(carat, data=diamonds, facets = color ~ ., geom = "histogram", binwidth=0.1, xlim = c(0,3))
p22 <- qplot(carat, ..density.., data=diamonds, facets = color ~ ., geom = "histogram", binwidth=0.1, xlim = c(0,3))  
# ..density..告诉ggplot2将密度而不是频数映射到y轴。
grid.arrange(p21, p22, ncol=2)
#左图展示的是频数,右图展示的是频率。在比较不同组分布时,频率图不受该组样本量大小的影响。图形显示,高质量的钻石(颜色D)在小尺寸分布上是偏斜的,但随着质量下降,重量分布越来越平坦。
facet-1.png

2.7 其他选项

其他一些控制图形的外观的参数:

  • xlim, ylim: 设置x轴和y轴的显示区间。取值是一个长度为2的向量。例如xlime=c(0,20);
  • log: 一个字符型向量,说明哪个坐标轴应该取对数。例如:log="x",表示对x轴取对数;log="xy",表示对x轴和y轴都取对数。
  • main:图形的主标题,可以是字符串,也可以是一个表达式。例如main = expression(beta[1]==1)。更多数学表达式参见?plotmath命令。
  • xlab, ylab:设置x轴和y轴的标签文字。可以是字符串,也可以是表达式。
p23 <- qplot(carat, price, data=dsmall,
      xlab ="Weight(carats)" , ylab="Price($)",
      main="Price-weight relationship"
)

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

推荐阅读更多精彩内容

  • 收拾好过往,再度出发。 内容声明:本文是幸福进化俱乐部易仁永澄老师的02期真自由训练营的结...
    Andy熙阅读 213评论 1 0
  • 帮我看到这张照片的时候我看圈我看到了一位天使他是这么的可爱这么的积几拉呱钱还这么,嗨很爱护他的弟弟衣服天下衣服乐观...
    Lily_a6cc阅读 132评论 0 0
  • 水果罐头在南方比较少见,特别是潮汕人讲究吃新鲜当季的水果。小时候看电影,电影里头探望病人总是用网兜装着水果罐头,以...
    mimi播报阅读 608评论 2 5
  • 【践行精进-打卡第61天】-眭红艳 2018.03.25 【每日精进打卡第61天】 姓名:眭红艳 公司:绿山墙养心...
    利他心阅读 95评论 0 0