R语言_ggplot2

关于ggplot2包的应用。

数据结构、绘图对象、图层、标度变换、分面、坐标系、主题;

数据结构

一个图形对象,由5部分组成

  1. 数据(数据框格式) + 图形属性映射
    • 封箱:将数据分为子集的形式;默认为bins=30
  2. 一个/多个图层;图层:一个图层必须由4部分组成
    • 一种位置调整方式
    • 数据和图形属性映射
    • 一种统计变换
    • 一种几何对象
  3. 标度;每个图形属性映射都对应一个标度
  4. 一个坐标系统
  5. 分面设定


1. 绘图对象(数据+图形属性[aes])

# 数据+图形属性
ggplot(data, aes())
  • why :将数据变量映射到图形中;即指定每个变量扮演的角色

可以使用变量的函数值作为参数;eg: aes(sqtr(age))

aes - aesthetics

数据

  • 必须是数据框(data.frame)
    • ggplot2从给定的数据框中提取所需的变量,并生成一个新的数据集,而不是直接在原数据集上进行数据表换;
    • 数据是以副本而不是引用的形式存储到图形对象的

如果你的数据改变了,绘图不会改变

可以被存储save()到磁盘上,并可被直接加载运行load()

  • 替换数据集( %+% );
    • 用相同的代码,对不同的数据集绘图
p <- ggplot(mtcars aes(mpg,wt)) + geom_point() 
# 绘制散点图
mt <- transform(mtcars, mmpg=mpg^2)
# 设置新的数据集

p %+% mtcars
## 对新的数据集绘制相同的图形

图形属性-aes

  • what :大小、颜色、形状、透明度;
    • 每个图形属性还可以映射为一个变量设定为一个常数
    • 每一个图形属性都对应一个称为标度的函数,作用是将数据的取值映射到该图形属性的有效取值
属性 描述
shape 点的形状
fill 填充区域
color 区域的边界;点、线的颜色
linetype 线条类型
size 点的大小;线的宽度
alpha 颜色透明度;
label 标签;rowname(data)
group 分组

alpha

若想采用同一色度,则加上alpha=var

分组

  • 分组变量必须是因子变量
  • 离散型变量的交互作用被设为分组的默认值

group=factor(var) / fill=factor(col)

  • 多个分组 + 单个图形属性 - ggplot()函数
    • [what] - 将数据分成若干组,并用相同的方式对每个组进行渲染
p <- ggplot(Oxboys, aes(age, height, gruop=Subject)) + geom_line()
  • 不同图层 + 不同分组 - geom(aes())函数
    • [what] - 不同水平下的数据整合来对统计汇总信息进行绘图;
    • 不同的图层可能有不同的分组图形属性
      • group=1 ,表示选择所有数据
p + geom_smooth(aes(gruop=1), method="lm", size=2, se=F)
  • 修改默认分组 - geom(aes())函数
    • [what] - 自定义离散型变量中的默认分组
    • [how] - 在几何对象中进行修改
# Occasion为离散型变量,默认分组变量即Occasion
boysbox <- ggplot(Oxboys, aes(Occasion, height)) + geom_boxplot()  

# 在原基础上添加个体轨迹(此处分组变量因为每个个体Subject)
boysbox + geom_line(aes(group=Subject), colour="darkblue") 

--若直接在ggplot()函数中添加分组变量,则表示对之后所有图层都适用


2. 图层(几何对象)

  • what: 每一个几何对象都对应着一个默认的统计变换和位置参数 (geometric object)
    • 具体形式为点、线、条;
  • why :决定了图形的类型
  • how :个体/群组几何对象; / 分组group

设定与映射

设定:p + geom_point(colour="darkblue") (其中p <- ggplot(mtcars, aes(x=mpg, y=wt)))

行为:图层里colour参数设定了点的颜色

映射:p + geom_point(aes(colour="darkblue"))

行为:先创建一个只含有"darkblue"的变量,然后将colour映射到这个新变量;因为这个变量是离散型的,默认的颜色标度用色轮上等间距的颜色,并且此处只有一个值,因此这个颜色就是桃红色

设定

【设定】图形属性为一个单一值 - 几何对象中的参数

  • what:用于设定图层的图形;
    • 设定:几何对象中的参数
  • how :具体组成
属性 描述
shape 点的形状
fill 填充区域
color 区域的边界;点、线的颜色
linetype 线条类型
size 点的大小;线的宽度
alpha 颜色透明度;[0~1]
position 位置
binwidth 直方图宽度geom_histogram [0,1]
width 箱线图宽度geom_boxplot [0,1]
side 地毯图geom_rug的位置;
notch=T/F 方块图是否为缺口

position

对图层中元素的位置进行微调;

常用于离散型数据;[连续型数据很少出现完全重叠的现象]

映射

【映射】到一个变量:修改绘图对象的图形属性

  • why :因为图绘图对象可以单独保存,所以才有修改的这个作用
  • how :在几何对象中进行修改
    • 绘图对象 - ggplot(mtcars, aes(mpg, wt))
geom_point(aes(colour=cly)  -> aes(mpg, wt, colour=cyl)))  # 添加

geom_point(aes(y=disp) -> aes(mpg, disp)  # 修改
           
geom_point(aes(y-NULL)) -> aes(mpg)  # 删除


3. 图层(统计变换+位置调整)

统计变化 - stat_xx

  • what:以某种方式对数据进行统计汇总;必须是一个位置尺度不变的量

    • 任何一个ggplot2图层都包括stat和geom两部分,或者说两个步骤
  • 每一个几何对象都有一个默认的统计变换,并且每一个统计变换也都有一个默认的几何对象”。

       x <- c(rnorm(100,14,5),rep(20,20)) 
       y <- c(rnorm(100,14,5) + rnorm(100,0,1),rep(20,20))
       ggplot(data= NULL, aes(x = x, y = y)) + geom_point(color = "darkred",stat = "sum")  等同于
       ggplot(data= NULL, aes(x = x, y = y)) +  stat_sum(color = "darkred",geom = "point")
    
  • 在几何对象中修改统计变换;

    + geom_histogram(aes(y=..density..))
    


- 可在统计变换中**修改集合对象**;

​```R
d <- ggplot(diamonds,aes(carat,price))
d +stat_density2d(geom="point", aes(size=..density..), contour=F)

  • why :将返回的数据集作为输出,并可在图形中展现;故可向原数据集中插入新的变量

    • 当我们需要展示出某个变量的某种统计特征的时候,需要用到统计变换
  • how :生成变量的名字必须用点号围起来 (..xx..)


4. 标度变换(scale)

  • what:控制数据到图形属性的映射;将数据单位(升、英里加仑数)转换为电脑可以识别的物理单位(像素和颜色)的过程

    • 定义域(数据空间)
    • 值域(图形属性空间)
    • 将定义域映射的值域; 变换-训练-映射
  • why :将数据转化为视觉可以感知的东西:大小、颜色、位置;提供读图时使用的工具:坐标轴+图例

  • how :用法 - scale_图形属性名称_标度名称 ( scale_x_discrete() )

    • 可修改的标度,以适应变量类型与标度类型;(当修改底层数据或图形属性映射后)
    p <- ggplot(mpg, aes(cty,hwy)) 
    p + geom_point(aes(x=drv)) + scale_x_discrete()
    
    • 图形属性:scale_colour / fill / x / y / shape / linetype / size

位置标度 - 坐标轴

坐标轴标签名称

+ xlab("xx") / ylab("xx")

+ labs(x="",y="",title="",subtitle="")

坐标轴刻度范围

  • 固定标度的定义域
+ xlim() /ylim()

xlim(n,n) / ylim(n,n) / ylim(0, max(data$var))  # 连续型
xlim("a","b","c")  # 离散型
xlim(as.Date(c("2008-05-01","2008-08-01"))  # 日期型


控制标签出现的个数和顺序
+ scale_x_ (limits=()) 
# + scale_x_discrete(limits=c("trt2", "ctrl"))  # 本应该有3个离散变量

对条形图、直方图不可用xlim(),因为会删除其不再范围内的变量;应改用coord_cartesion(xlim=c(,) )

刻度值的分段与显示

+ scale_x_continuous()  # 连续型
+ scale_x_discrete()  # 离散型


limits=c( )  # 固定标度的定义域;连续型-数值型,离散型-字符; limits影响显示在图形上的元素
## 要显示的范围; #控制标签的个数和顺序

breaks=c( )  # 指定坐标轴上应显示哪些刻度线的值或一个连续型标度在一个图例中将被如何分段。
## breaks影响显示在坐标轴和图例上的元素
## scale_x_continuous(breaks=c(0.1,0.2))  # 设置显示的x轴标签刻度值

labels=c()  # 指定了应在断点处显示的标签
## 若设置了labels,则必须同时指定breaks

----------------------------------------------------------------------------------
改变变量的显示顺序
scale_x_discrete/continuous

自定义
# +scale_x_discrete(limits=c("trt1","ctrl","trt2"))
只显示x1和x2两项
## p <- ggplot(diamonds,aes(x=carat,y=price))
## p + geom_point(colour = "green") + scale_x/y_discrete(limits=c('x1','x2'))

转置
转置 -离散变量
+ scale_x_discrete(limits=rev(levels(PlantGrowth$group)))  
## 必须跟在ggplot()之后,不可用 last_plot() + scale_x_  否则会报错;但可用 p + scale_x_discrete
转置 -连续变量
+ scale_y_reverse()


----------------------------------------------------------------------------------
变更显示的刻度值
breaks=c()
#  + scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6, 8))


----------------------------------------------------------------------------------
设置x/y轴显示的相对比例
# 1:1
+ scale_y_continuous(breaks=seq(0, 420, 30)) 
+ scale_x_continuous(breaks=seq(0, 420, 30))

# 1:2
+ scale_y_continuous(breaks=seq(0, 420, 30))  
+ scale_x_continuous(breaks=seq(0, 420, 15))
  • 刻度值的变换 - 在统计计量之前,不会改变几何形状
+ scale_x_continous(trans="")
+ scale_x_continuous(trans="log(10)")

日期与时间
as.Date()
+ scale_x_data( )

----------------------------------------------------------------------------------
主刻度线
breaks=,可为数值型向量
date_breaks="",只能是字符串向量,"2 weeks" / "10 years"

次刻度线
minor_breaks=,
date_minor_breaks="",只能是字符串向量,"1 day"

----------------------------------------------------------------------------------
格式输出
lables=date_format(" ")

颜色标度

  • 显示的颜色,前提是已经设置的颜色属性;scale_color_ / scale_fill_
scale_color_  / scale_fill_


离散型颜色梯度
+ scale_color/fill_hue()  # 默认
+ scale_color/fill_brewer(palette="")
## 对象为点 -  "Set1" / "Dark2"
## 对象为面积 - "Set2" / "Pastel1" / "Pastel2" / "Accent"
## 得到所有颜色的展示 library(RColorBrewer)  display.brewer.all()
手动离散型颜色标度
+ scale_color/fill_manual(values=c("xx","xx"))  手动设定颜色的值


----------------------------------------------------------------------------------
连续型颜色梯度(渐变色)
scale_color/fill_gradient(low="", high="")  # 双色 low,high,分别控制梯度两端的颜色
scale_color/fill_gradient2(low="",high="", midpoint=)  # 三色 low,high,midpoint(默认为0)
scale_color/fill_gradientn() , color=xx  # 自定义n色 一个颜色向量


图例标度 - guides

  • guides为每一个scale_by_scale的函数来设置参数
图例-guide_legend()

+ guides(color = guide_legend(reverse=TRUE))  # 内部顺序 
# 条形图时,且用fill来分组时
# 当分组用alpha时,guide(alpha=guide_legend(reverse=T))


----------------------------------------------------------------------------------
图例-标题
用fill来填充颜色,那么我们去掉图例就需要用fill, 去掉标题
third <- ggplot(mpg, aes(cyl, hwy, fill = factor(cyl))) + geom_boxplot()
third + guides(fill = guide_legend(title = "how"))
third + guides(fill = guide_legend(title.position = "top"))


----------------------------------------------------------------------------------
图例-标签
third + guides(fill = guide_legend(label = TRUE)) # 标签与否
third + guides(fill = guide_legend(label.position = "top")) # 标签位置
third + guides(fill = guide_legend(label.theme = element_text(size = 15, face = "italic", colour = "red", angle = 30)))


----------------------------------------------------------------------------------
图例-图表
third + guides(fill = guide_legend(keywidth = 5)) # 图表宽度
third + guides(fill = guide_legend(direction = "horizontal"))  /  "vertical"
third + guides(fill = guide_legend(nrow = 2))  # 图表的列数
third + guides(fill = guide_legend(reverse = TRUE)) # 反向显示图例

5. 分面(facet)


6. 坐标系(coord)

  • what:将两种位置标度结合在一起组成的二维定位系统
  • how :笛卡尔坐标系、非笛卡尔坐标系
  • **笛卡尔坐标 - cartesian() **
范围设置
coord_cartesian(xlim=c(n,n))
## 与 +xlim() & scale_x_continuous(limits=c()) 区别:
## coord - 使用的仍是所有数据,只是展示的仅该部分数据;如同用放大镜看数据
## xlim() & scale_x_ - 是将超出此范围的数据都删除,仅对在该范围内的数据做图


x/y轴翻转 
+ coord_flip()
# 或者 直接在图形属性aes()中将变量先后顺序调换


坐标轴变换 - 在统计量计算之后,会改变几何形状
+ coord_trans(x=..., y=...)


x/y轴标度比例
+ coord_equal()  # 默认为1:1
+ coord_equla(ratio=1.5)  # ratio=y/x的值
  • 非笛卡尔坐标
极坐标
polar # 绘制饼图/雷达图

地图投影


7. 主题(theme)

  • what:对数据之外的图形外观进行控制;
  • how :设置与使用
    • 使用方式:+theme(主题元素 = 主题性质)
    • + theme(plot.title=element_text(size=20))

主题与设置

整体风格变动 - 四种种内置主题

+ theme_gray()  # 灰色背景,白色网格线
+ theme_bw()  # 白色背景,灰色网格线
+ theme_classic() # 白色背景,无网格线
+ theme_minimal()  # 无坐标线

--

设置 -
theme_set()  # 返回先前的主题
theme_get()  # 获得当前主题设置

全局设置
theme_set(theme_gray())

局部设置 
直接在ggplot()之后 + theme_gray() / bw()

----------------------------------------------------------------------------------
为之后的图形设置主题 theme_update()
theme_update(plot.title=element_text(hjust=0.5, face="bold"))  # 标题水平居中
或者赋值为theme1 <- theme_update() ,之后是 theme_set(theme1)

--

永久性存储主题
theme1 <- theme_gray() + theme(plot.title=element_text(hjust=0.5, face="bold"))
theme2 <- theme_bw() + theme(plot.title=element_text(hjust=0.5, face="bold"))
theme3 <- theme_classic() +theme(plot.title=element_text(hjust=0.5, face="bold"))
ggplot() + theme_bw

主题元素+元素函数

  • 主题元素
坐标系 - axis. 
axis.line  # 直线和坐标轴
axis.text.x  # x/y轴标签
axis.ticks  # 轴须标签
axis.title.x  # x/y轴标题

--

图例 - legend.
legend.bakgroud  # 图例背景
legend.key  # 图例符号
legend.text  # 图例标签
legend.title  # 图例标题

# 独立运作
+ theme(legend.position="none" / "left" /"right"/"bottom"/"top"/=c(n,n) )  # n为[0,1]

--

面板 - panel.
panel.backgound  # 面板背景
panel.border  # 面板边界
panel.grid.major  # 主网格线
panel.grid.minor  # 次网格线

--

整个图形 - plot.
plot.background  # 整个图形背景
plot.title  # 图形标题

--

其他 - strip.
strip.backgroud  # 分面标签背景
strip.text.x  # 水平/竖直条状文本
  • 元素函数


属性参考

几何对象 - 点 - geom_xx

plot
# 点  # + stat_smooth() # 添加平滑曲线
  
dotplot
# 点直方图(用点来表示观测值的个数)

jitter
# 给点添加扰动(减轻重叠问题)

几何对象 - 线

abline 
# 线(由斜率和截距决定)

hline
# 水平线 ; yintercept=n / n1:n2
vline
# 竖直线 ; xintercept=

----------------------------------------------------------------
line
# 按照x坐标的大小顺序依次连接各个观测值
path
# 路径图(按数据的原始顺序连接各个观测值)
step
# 以阶梯形式联接各个观测值

----------------------------------------------------------------
quantile
# 添加分位数回归线

segment
# 添加线段/箭头 
## geom_segment(aes(x=, xend=, y=, yend= ))

smooth
# 添加光滑的条件均值线
## method=smooth(默认) lm-线性; loess-非参数光滑曲线; gam-广义相加模型; glm-广义线性; rlm-健壮线性; 
## formula= y~x (默认) y~log(x);  y~poly(x,n) -n次多项式拟合;  y~ns(x,n) -具有n个自由度的样条拟合
## se=T/F  绘制置信区间;默认为T
## level=num 默认为95%
## fullrange=F/T ,拟合覆盖全图(T),仅覆盖数据(F) 默认为F


density
# 光滑密度曲线图
density2d
# 二维密度等高线图

----------------------------------------------------------------
linerang
# 一条代表一个区间的竖直线
pointrang
# 用一条中间带点的竖直线代表一个区间

几何对象 - 面

bar - 条形图

  • 先做出x/y轴,再作图,运用stat
    • ggplot(temp3, aes(content_rating, M))
    • last_plot() + geom_bar(stat="identity")
# 条形图(以x轴为底的矩形)

图形/位置调整
# geom_bar(position="dodge") -分组条形图; (position="fill") -百分比条形图;

水平条形图
# + coord_flip()

堆砌分组条形图(两个类别型变量)
# ggplot(hr_good,aes(left,number_project,fill=factor(number_project))) + geom_bar(stat="sum") 

调整距离宽度与间距; 
# width=0.5 -也可以看做x坐标轴之间的分割大小; position=position_dodge(0.7)


----------------------------------------------------------------------
项目排序 -reorder
# 按z值的大小,重新排列条形图的顺序,只需将aes()中x的属性用reorder()函数更改即可; 
## ggplot(df, aes(x = reorder(x, z), y = z, fill = y)) +geom_bar(stat = 'identity') + xlab('x')

项目排序 -降序排序
# 1. arrange(data, M)  升序排列
# 2. data$M <- factor(data$M, order=T, levels=data$M))  # 因子化 / data$M <- with(data, factor(var, order=T, levels=var))

项目排序 -如果x是因子,我们可以对其用带参数limits=rev(levels(…))的函数scale_x_discrete()进行修正。
##  + coord_flip() + scale_x_discrete(limits=rev(levels(PlantGrowth$group)))
项目排序 -直接修正
# 直接用scale_x_discrete(limits=c()) 来修正顺序

-----------------------------------------------------------------------
添加标签
# geom_text(aes(label=var))
## hjust/vjust=-0.2 -表示显示在外面;  hjust/vjust=1.5 -表示显示在里面

添加标签 -对于分组条形图
# geom_text(position = position_dodge(0.9))
添加标签 -对于堆积条形图
# geom_text(position = position_stack())


histogram - 直方图

调整组距:
# 1)binwidth=n  # 组距宽度;也可以看做x坐标轴之间的分割大小
# 2)bins=n  # 组的数量
# 3)breaks=c(n, n, n)  # 具体的x轴坐标尺度来划分

调整分组直方图两者之间重叠程度
# position=position_dodge(0.5)

密度直方图
# histogram(aes(y=..density))
在密度直方图基础上,添加核密度曲线
## stat_density(geom="line")

其他面图

boxplot
# 箱线图

area
# 面积图

freqplot
# 频率多边形图

几何对象 - 非常规图形

errorbar
# 误差棒
errorbarh
# 水平误差棒

rug
# 边际地毯图(轴须图)

--

blank
# 空白

contor
# 等高线图

crossbar
# 带水平中心线的盒子图

hex
# 六边形二维热点图

map
# 基准地图里多边形

ploygon
# 多边型(相当于一个有填充的路径)

raster
# 高效的矩形瓦片图

rect
# 二维矩阵图

ribbon
# 色带图(连续的x值所对应y的范围)

violin
# 小提琴图

tile
# 瓦片图

text - 文本注释

linetype

符号 描述
1 实线
2 虚线
3
4 破折号
5 长破折号
6 双破折号

position

符号 描述 示例
stack 堆叠 堆砌条形图
fill 堆叠并高度标准化为1 百分比堆砌条形图
dodge 并列 分组条形图
jitter 给点添加扰动,避免重叠
identity 不做任何调整

identity ,不适合条形图,因为后面画的条形会挡住先画的

size

地毯图geom_rug的位置;

符号 描述
b 底部
l 左侧
r 右侧
t 顶部
bl 左下
"tl" 、 "tr"、"br" 左上、右上、右下

统计变换

作图问题

图形基本处理

summary()  # 查看结构

ggsave()  # 保存到磁盘
--ggsave("name.png", [plot=plot_name] width=, height=)  
# plot_name为创建图像的名称;若忽略,则对最佳的图像保存

save()  # 缓存保存到磁盘; 可保存一个图形对象的完整副本,并可用load()来重现该函数

print()  # 呈现
  • what:
  • why :
  • how :

你可能感兴趣的:(R语言_ggplot2)