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

2019-05-12  本文已影响0人  冬之心

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、图形语法

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

2、qplot(quick plot)快速作图

主要学习:

2.2 数据集

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

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 几何对象

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

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

对于连续变量:

对于离散变量:

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参数可以选择许多不同的平滑器:

qplot(carat, price, data=dsmall, geom=c("point","smooth"), span=0.2)
loess-1.png
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
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

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 其他选项

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

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
上一篇 下一篇

猜你喜欢

热点阅读