Jimmy那些事儿

R语言_ggplot2

关于ggplot2包的应用。

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

数据结构

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

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


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

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

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

aes - aesthetics

数据

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

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

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

  • 替换数据集( %+% );
    • 用相同的代码,对不同的数据集绘图
1
2
3
4
5
6
7
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] - 将数据分成若干组,并用相同的方式对每个组进行渲染
1
p <- ggplot(Oxboys, aes(age, height, group=Subject)) + geom_line()
  • 不同图层 + 不同分组 - geom(aes())函数
    • [what] - 不同水平下的数据整合来对统计汇总信息进行绘图;
    • 不同的图层可能有不同的分组图形属性
      • group=1 ,表示选择所有数据
1
p + geom_smooth(aes(gruop=1), method="lm", size=2, se=F)
  • 修改默认分组 - geom(aes())函数
    • [what] - 自定义离散型变量中的默认分组
    • [how] - 在几何对象中进行修改
1
2
3
4
5
6
7
# 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))
1
2
3
4
5
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两部分,或者说两个步骤
  • 每一个几何对象都有一个默认的统计变换,并且每一个统计变换也都有一个默认的几何对象”。

    1
    2
    3
    4
    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")
  • 在几何对象中修改统计变换;

1
+ geom_histogram(aes(y=..density..))
  • 可在统计变换中修改集合对象
1
2
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() )

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

scale_xxx_yyy的具体形式

xxx Description
colour Color of lines and points
fill Color of area fills (e.g. bar graph)
linetype Solid/dashed/dotted lines
shape Shape of points
size Size of points
alpha Opacity/transparency
yyy Description
hue Equally-spaced colors from the color wheel
manual Manually-specified values (e.g., colors, point shapes, line types)
gradient Color gradient
grey Shades of grey
discrete Discrete values (e.g., colors, point shapes, line types, point sizes)
continuous Continuous values (e.g., alpha, colors, point sizes)

位置标度 - 坐标轴

坐标轴标签名称

1
2
3
+ xlab("xx") / ylab("xx")
+ labs(x="",y="",title="",subtitle="")

坐标轴刻度范围

  • 固定标度的定义域
  • expand_limits():通过指定的值,使其包含在刻度值中
    • expand_limits(x=0, y=0)
1
2
3
4
5
6
7
8
9
10
+ 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(,) )

刻度值的分段显示 + 转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
+ scale_x_continuous() # 连续型
+ scale_x_discrete() # 离散型
limits=c( ) # 固定标度的定义域;连续型-数值型,离散型-字符; limits影响显示在图形上的元素
## 要显示的范围; #控制标签的个数和顺序
breaks=c( ) # 指定坐标轴上应显示哪些刻度线的值或一个连续型标度在一个图例中将被如何分段
## breaks影响显示在坐标轴和图例上的元素
## scale_x_continuous(breaks=c(0.1,0.2)) # 设置显示的x轴标签刻度值
=c(seq(0,200,20))
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)))
+ scale_x_discete(breaks=rev(levels(PlantGrowth$group)))
## 必须跟在ggplot()之后,不可用 last_plot() + scale_x_ 否则会报错;但可用 p + scale_x_discrete
转置 - 连续变量
# 左右反转 - x轴
scale_x_reverse()
# 上下反转 - y轴
scale_y_reverse()
# 逆时针旋转
coord_flip()
# 顺时针旋转
scale_x_reverse() + coord_flip()
----------------------------------------------------------------------------------
设置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))
----------------------------------------------------------------------------------
使图形从原点(0,0)出发 -expand
scale_x_continuous(expand=c(0,0))
# 这个参数使得数据与坐标轴有一定的距离;默认情况下,连续型变量距离为c(0.05, 0),离散型变量距离为c(0, 0.6)
----------------------------------------------------------------------------------
示例:
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 Sex",x="", y="")

刻度值的变换

  • 在统计计量之前,不会改变几何形状
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
刻度值变化
+ scale_x_continous(trans="")
+ scale_x_continuous(trans="log(10)") "sqtr"
# 变换在计算统计摘要之前,虽然数值变换了,但坐标轴的刻度不会改变
# 若直接在aes(x=log10(x)),变换也在计算统计摘要之前,但坐标轴刻度会改变
日期与时间
as.Date()
+ scale_x_date(labels=date_format("%m%d"), breaks=date_breaks("2 weeks"))
+ scale_x_datetime()
------------------------------------------------------------------可能已失效
# major / minor 指定主要和次要断点的位置,并允许以这些单位的倍数出现
日期与时间-主刻度线 major
breaks=,可为数值型向量
date_breaks="",只能是字符串向量,"2 weeks" / "10 years"
# majOir="2 weeks"
日期与时间-次刻度线 minor
minor_breaks=,
date_minor_breaks="",只能是字符串向量,"1 day"
日期与时间- 格式输出 format
lables=format(" ") # 若失效,改为 data_format()

颜色标度

  • 显示的颜色,前提是已经设置的颜色属性;scalecolor / scalefill
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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")) 手动设定颜色的值
col=rgb(1,1,1) ; col=hsv(0,0,1); col="white"; col="#FFFFFF"
----------------------------------------------------------------------------------
连续型颜色梯度(渐变色)
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色 一个颜色向量

.png)

离散型的手动标度

1
2
3
+ scale_shape_manual(values=c())
+ scale_size_manual(valuse=c())
+ scale_linetype_mannule(values=c())


图例标度 - guides

  • guides为每一个scale_by_scale的函数来设置参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
图例-guide_legend()
guides(fill= guide_legend(title=, title.position="top", title.hjust=, title.vjust=, label=T, label.position="top", label.hjust=, label.vjust=, direction="vertical"/"horizonttal", nrow=2, ncol=2, reverse=F, byrow=F)
图例 - 删除
# bp <- ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) + geom_boxplot()
guides(fill=FALSE) 替换fill为所需的美学
+ guides(fill=FALSE)
+ scale_fill_discrete(guide=FALSE)
+ theme(legend.position="none") # 删除所有图例
----------------------------------------------------------------------------------
图例 - 位置 - 整个区域内 # 下面的数字位置是相对于整个区域,包括标题和标签,而不仅仅是绘图区域
bp + theme(legend.position="top") # 该表示方法在绘图区之外; bottom;left;right;
bp + theme(legend=c(0,0)) # 见下图
位置 - 绘图区域内 # 添加legend.justification=c(0,0) 表示在绘图区的c(0,0)的方位,而不是在整个区域
bp + theme(legend.justification=c(0,0), legend.position=c(0,0))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
图例 - 项目顺序
更改图例中项目的顺序 - breaks
+ scale_fill_discrete(breaks=c("ctr1","ctrl","ctr2")) # fill是ggplot(aes(fill=group)) 详见bp的构造
反转图例中项目的顺序
+ guide(fill=guide_legend(reverse=T))
+ scale_fill_discrete(guide=guide_legend(reverse=T)) # 注意这里的fill参照bp的构成
+ scale_fill_discrete(breaks=rev(levles(PlantGrowth$group)))
+ 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=NULL))
third + guides(fill = guide_legend(title = "how"))
third + guides(fill = guide_legend(title.position = "top"))
# 通过theme来调整
+ theme(legend.title=element_blank())
----------------------------------------------------------------------------------
图例 - 标题和标签的文本
第一种方式:guide可以被fill,colour, linetype, shape所引导
+ scale_fill_discrete(values=c("#999999","#E69F00","#56B4E9"), name="Experiment\nCondition", breaks=c("ctrl", "trt1", "trt2"), labels=c("Control", "Treatment 1", "Treatment 2")) # 更改图例标题必须使用 scale_xx_discrete的方式
图例-标签
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)))
第二种方式:改变数据框
pg <- PlantGrowth
levels(pg$group)[levels(pg$group)=="ctrl"] <- "Control"
levels(pg$group)[levels(pg$group)=="trt1"] <- "Treatment 1"
levels(pg$group)[levels(pg$group)=="trt2"] <- "Treatment 2"
names(pg)[names(pg)=="group"] <- "Experimental Condition" # 更改单个列的列名
----------------------------------------------------------------------------------
图例 - 标题和标签的外观
# 默认情况下,图例不会有一个框。要添加一个框并修改其属性:
bp + theme(legend.background = element_rect())
bp + theme(legend.background = element_rect(fill="gray90", size=.5, linetype="dotted"))
图例-图表
third + guides(fill = guide_legend(keywidth = 5)) # 图表宽度
third + guides(fill = guide_legend(direction = "horizontal")) / "vertical"
third + guides(fill = guide_legend(nrow = 2)) # 图表的列数
图例 - 斜杠
如果使用轮廓制作条形图(通过设置color =“black”),它将通过图例中的颜色绘制斜杠。


5. 分面(facet)

  • what: 将数据划分为多个子集,并依次绘图
    • 适用于离散型变量(若对连续型变量则需要先将其转换)
1
2
3
4
连续型变量转换为离散型
cut_interval(x, n=10) # 将数据划分为n个长度相同的部分
cut_number(x, n=10) # 将数据划分为n个有相同数目点的部分
  • why :用于比较不同分组之间的情况;(理解为aes中gruop的不同变体;)
    • 分组:容易发现各组之间细微的差别
    • 分面:对于各组之间重叠问题严重时,可很好地解决该问题
  • how : + facet_grid / wrap

网格型

  • what :二维面板,由行和列通过变量来定义;

  • why :用于两个或多个变量来生成一个2维网格

  • how :需要设定哪些变量作为分面绘图的行与列

  • 多种形式 - facet_grid()

1
2
3
4
5
6
7
8
9
10
. ~ a # 一行多列,根据变量a进行分面为n列
a ~. # 一列多行,根据变量a进行分面n行
a~b # 多行多列
.~a+b / a+b~. # 多个变量的多个水平在行/列上(或同时)
--------------------------边际图----------------------------------------
margins=T # 展示所有分面的边际图
margins=c("col","col") # 列出需展示边际图的变量名称
grand_row / grand_col # 分别生成所有行/列的边际图

网格型 - 分面位置占比 - space=”fixed”/ “free”(随标度范围变化而变化)

封装型

  • what:一维面板条,再封装到二维中
  • why :处理单个多水平变量
  • 多种形式 - facet_wrap()
1
2
~ a, ncol=n
~a, nrow=n

封装型 - 标度控制

1
2
3
4
5
6
7
8
scales=""
scales="fixed" # 所有面板中x/y标度相同(默认)
## 在相同的基准上进行比较,观察各子集相似的模式; ## 对于 facet_grid 必须是x/y都相同
scales="free" # x/y每个面板的标度都可以变化; 自由标度,用于发现更多的细节
scales="free_x" / "free_y" # x的标度可变,y 的尺度固定

分面的标签控制

1
2
data %>% mutate(left = factor(left, labels = c("Remain", "Left"))) %>%
# 需先将变量设置为需显示的标签


6. 坐标系(coord)

  • what:将两种位置标度结合在一起组成的二维定位系统
  • how :笛卡尔坐标系、非笛卡尔坐标系

笛卡尔坐标 - cartesian()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
范围设置 - 放大
coord_cartesian(xlim=c(n,n), ylim=c())
## 与 +xlim() & scale_x_continuous(limits=c()) 区别:
## coord - 使用的仍是所有数据,只是展示的仅该部分数据;如同用放大镜看数据
## xlim() & scale_x_ - 是将超出此范围的数据都删除,仅对在该范围内的数据做图
x/y轴翻转
+ coord_flip(xlim=c(), ylim=c())
# 或者 直接在图形属性aes()中将变量先后顺序调换
转置 -离散变量
# + scale_x_discrete(limits=rev(levels(PlantGrowth$group)))
+ scale_x_discete(breaks=rev(levels(PlantGrowth$group)))
## 必须跟在ggplot()之后,不可用 last_plot() + scale_x_ 否则会报错;但可用 p + scale_x_discrete
转置 - 连续变量
# 左右反转 - x轴
scale_x_reverse()
# 上下反转 - y轴
scale_y_reverse()
# 逆时针旋转
coord_flip()
# 顺时针旋转
scale_x_reverse() + coord_flip()
-----------------------------------------------------------------------------
坐标轴变换 - 在统计量计算之后,会改变几何形状
+ coord_trans(x="sqrt", y=, xlim, ylim)
+ coord_trans(xtrans="sqrt", ytrans="", xlim, ylim)
x/y轴标度比例
+ coord_equal() # 默认为1:1
+ coord_equla(ratio=1.5, xlim, ylim) # ratio=y/x的值

非笛卡尔坐标

1
2
3
4
5
6
7
极坐标
+ coord_polar(theta="x", direction=1, start=0 ) # 绘制饼图/雷达图
# direction= 1,顺时针,-1,逆时针 start=0 12点钟弧度的起点偏移量
地图投影
library(mapproj)
coord_map


7. 主题(theme)

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

主题与设置

1
2
3
4
5
6
整体风格变动 - 四种种内置主题
+ theme_gray() # 灰色背景,白色网格线
+ theme_bw() # 白色背景,灰色网格线
+ theme_classic() # 白色背景,无网格线
+ theme_minimal() # 无坐标线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
设置 -
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)

1
2
3
4
5
6
7
8
永久性存储主题
theme1 <- theme_minimal() + theme(plot.title=element_text(hjust=0.5, face="bold"), axis.line =element_line(linetype=1)) # 无坐标线
theme2 <- theme_classic() +theme(plot.title=element_text(hjust=0.5, face="bold")) # 白色背景,无坐标线
theme3 <- theme_gray() + theme(plot.title=element_text(hjust=0.5, face="bold")) # gray为默认
theme4 <- theme_bw() + theme(plot.title=element_text(hjust=0.5, face="bold"))
ggplot() + theme_bw

边界

1
2
# 图形边界
plot.margin = unit(c(1,1,1,1),"lines")

主题元素+元素函数

主题元素

1
2
3
4
5
6
坐标系 - axis.
axis.line # 直线和坐标轴
axis.text.x # x/y轴标签
axis.ticks # 轴须标签
axis.title.x # x/y轴标题
axis.ticks.margin # 坐标系边界 axis.ticks.margin = unit(0.8,"lines")

1
2
3
4
5
6
7
8
图例 - legend.
legend.bakgroud # 图例背景
legend.key # 图例符号
legend.text # 图例标签
legend.title # 图例标题
legend.margin # 每个图例之间的边界
# 独立运作
+ theme(legend.position="none" / "left" /"right"/"bottom"/"top"/=c(n,n) ) # n为[0,1]

1
2
3
4
5
6
面板 - panel.
panel.backgound # 面板背景
panel.border # 面板边界
panel.grid.major # 主网格线
panel.grid.minor # 次网格线
panel.margin # 分面绘图区之间的边距

1
2
3
4
5
6
7
整个图形 - plot.
plot.background # 整个图形背景
plot.title # 图形标题
plot.margin # 图形边距 top, right, bottom, left
plot.margin = unit(c(1,1,1,1),"lines")
# 等价于 = unit(rep(1,4),"lines")

1
2
3
其他 - strip.
strip.backgroud # 分面标签背景
strip.text.x # 水平/竖直条状文本

元素函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
文本 - element_text()
# 处理标签axis.text.x/axis.ticks、标题plot.title
face="" # 字体格式
## "bold.italic" # 粗斜体
## "bold" # 加粗
## "italic" # 斜体
## "plain" # 无格式的
color=""
size=num # 文本大小
hjust / vjust =[0,1] # 水平/竖直对齐
## hjust=0 # 左对齐
## hjust=1 # 右对齐
## hjust=0.5 # 居中对齐
lineheight=num # 行高
angle=[0,360] # 旋转角度
family="" # 字族

1
2
3
4
5
6
线条 - element_line()
#处理线条axis.line 或线段panel.grid.major/minor
size=num
color=""
linetype=[0,6]

1
2
3
4
5
6
7
背景 - element_rect()
# 处理背景 .background 使用的矩阵
linetype=n
size=num
color=""
fill=""

1
2
3
4
element_blank()
# 空主题,表示删除的绘图元素
主题元素=element_blank()

一页多图

组图

1
2
library(gridExtra)
grid.arrange(p1,p2,...pn, nrow=n, ncol=n)


子图 - viewport()+print

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
library(grid)
viewport(x=n,y=n,width=n,height=n)
# 设置图形的位置
## x,y - 控制图形的中心位置,范围[0,1] ,左下角为(0,0)
## width/height - 控制图形的大小,默认为比例大小[0,1];
### width=0.5, height=0.5 - 占1/4大小
### width=1,height=1 - 占整个图形
## 也可用绝对单位;eg: width = unit(1, "cm") / unit(1, "inch")
print(p, vp=)
# print(要增加子图的图形对象, vp=设置的图形位置对象)
b <- ggplot(economics, aes(uempmed,unemploy)) + geom_point() + geom_smooth(se=F)
c <- ggplot(economics, aes(uempmed,unemploy)) + geom_path()
library(grid)
subvp <- viewport(x=0.75,y=0.35, width=0.4, height=0.4)
b # 显示当前要增加子图的图
print(c, vp=subvp)
## 若要调整子图的属性,要先在外面调整好,再放入主图中;
eg: c1 <- c + theme()


属性参考

几何对象 - 点 - geom_xx

1
2
3
4
5
6
7
8
plot
# 点 # + stat_smooth() # 添加平滑曲线
dotplot
# 点直方图(用点来表示观测值的个数)
jitter
# 给点添加扰动(减轻重叠问题)

point - 散点图

几何对象 - 线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
abline
abline(..., slope, intercept, show.legend=NA)
# 线(由斜率和截距决定) 指定的斜率和截距
geom_abline(slope=1, intercept=0, linetyep=2)
hline
# 水平线 ; yintercept=n / n1:n2
vline
# 竖直线 ; xintercept=
----------------------------------------------------------------
line
line(x,y, alpha, color, fill, linetype, size, arrow)
# 按照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
linerang(x,ymin,ymaxn,alpha,color, lineype,size, show.legend=T/F)
# 一条代表一个区间的竖直线
pointrang
# 用一条中间带点的竖直线代表一个区间

几何对象 - 面

bar - 条形图

  • 先做出x/y轴,再作图,运用stat
    • ggplot(temp3, aes(content_rating, M))
    • last_plot() + geom_bar(stat=”identity”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 条形图(以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
2
3
4
5
6
7
8
9
10
11
12
调整组距:
# 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")

其他面图

1
2
3
4
5
6
7
8
boxplot
# 箱线图
area
# 面积图
freqplot
# 频率多边形图

几何对象 - 非常规图形

漏斗图

1
2
3
4
5
## 漏斗图
# 涉及概念
# 1.占位数 = (上阶段人数 - 当前人数)/2
# 2.环节转化率 =当前人数/上阶段人数;
# 3.整体转化率 = 当前人数 / 总人数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
## 思路1,利用占位符;条形图
---------------------------test----------------------------------------------------
library(reshape2)
scope<-c(0.9,0.8,0.6,0.4,0.2)
Part<-paste("part",1:5,sep="")
Order<-1:5
help<-(1-scope)/2 # 表示该值为 两边留空的二分之一
mydata<-data.frame(Order,Part,help,scope)
Order Part help scope
1 1 part1 0.05 0.9
2 2 part2 0.10 0.8
3 3 part3 0.20 0.6
4 4 part4 0.30 0.4
5 5 part5 0.40 0.2
# 重构为长格式
mydata1<-melt(mydata,id.vars=c("Order","Part"),variable.name="perform",value.name="scope")
Order Part perform scope
1 1 part1 help 0.05
2 2 part2 help 0.10
3 3 part3 help 0.20
4 4 part4 help 0.30
5 5 part5 help 0.40
6 1 part1 scope 0.90
7 2 part2 scope 0.80
8 3 part3 scope 0.60
9 4 part4 scope 0.40
10 5 part5 scope 0.20
# 构造有序因子变量,两个因子水平,分别是实际指标值和辅助值
# 【关键1】在构造有序因子变量时,注意辅助值因子水平要高于实际值数据。柱形图堆叠时,【关键2】按照因子水平由高到低堆叠(底层因子水平高,顶层因子水平低,这样才能将指标值的数据条撑起,其实水平均居中)。
mydata1$perform<-factor(mydata1$perform,level=c("scope","help"),order=T)
-----------------------------绘制图形--------------------------
ggplot(mydata1,aes(Order,scope,order=desc(scope),fill=perform))+geom_bar(stat="identity",position="stack") # 即先堆叠高水平help,然后再堆叠低水平scope;
# 制作色盘:(其实使用了一个白色色值隐藏掉了辅助列,理念跟在excel里面制作漏斗图一致,但是色盘颜色顺序白色要在第一个,这样将来颜色映射的时候颜色顺序与因子水平由大到小进行匹配的。)这一点非常重要,也是ggplot临摹漏斗图的核心技巧。
Color<-c("#FFFFFF","#088158")
ggplot()+
geom_bar(data=mydata1,aes(x=Order,y=scope,fill=perform),stat="identity",position="stack")+
scale_fill_manual(values=sort(Color))+ # sort表示重新排序;因为颜色的填充是低水平(scope),在高水平(help)进行填充
geom_text(data=mydata,aes(x=Order,y=help+scope/2-.025,label=Part),col="white",size=4)+
geom_text(data=mydata,aes(x=Order,y=help+scope/2+.035,label=paste(100*mydata$scope,"%",sep="")),col="white",size=5.5)+
theme_nothing()
ggplot()+
geom_bar(data=mydata1,aes(x=Order,y=scope,fill=perform),stat="identity",position="stack")+
scale_fill_manual(values=sort(Color))+
coord_flip()+ scale_x_reverse() + # 顺时针旋转
geom_text(data=mydata,aes(x=Order,y=help+scope/2-.05,label=Part),col="white",size=4)+ # 标签位置设定
geom_text(data=mydata,aes(x=Order,y=help+scope/2+.05,label=paste(100*mydata$scope,"%",sep="")),col="white",size=5.5)+
theme_nothing()


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
## 思路2,利用箱线图
set.seed(123) #设定随机种子,保证做的图和这里的一样
df <- data.frame(
var=LETTERS[1:10], #字母A-J
id=1:10, #数字1-10
a=runif(10), #10个随机数
b=runif(10), #10个随机数
c=runif(10), #10个随机数
stringsAsFactors = F #不转换为因子)
var id a b c
1 A 1 0.2875775 0.95683335 0.8895393
2 B 2 0.7883051 0.45333416 0.6928034
3 C 3 0.4089769 0.67757064 0.6405068
4 D 4 0.8830174 0.57263340 0.9942698
5 E 5 0.9404673 0.10292468 0.6557058
6 F 6 0.0455565 0.89982497 0.7085305
7 G 7 0.5281055 0.24608773 0.5440660
8 H 8 0.8924190 0.04205953 0.5941420
9 I 9 0.5514350 0.32792072 0.2891597
10 J 10 0.4566147 0.95450365 0.1471136
df_tmp4<-df %>% select(1:3) %>% arrange(a) %>%
mutate(new_id=1:10, # 创建新变量,以此为排序
ymin = (1-a)/2, # 最小值,左边留空的值
ymax = a+(1-a)/2, # 最大值,右边留空的值
mid = 0.5)
var id a new_id ymin ymax mid
1 F 6 0.0455565 1 0.47722175 0.5227782 0.5
2 A 1 0.2875775 2 0.35621124 0.6437888 0.5
3 C 3 0.4089769 3 0.29551154 0.7044885 0.5
4 J 10 0.4566147 4 0.27169263 0.7283074 0.5
5 G 7 0.5281055 5 0.23594726 0.7640527 0.5
6 I 9 0.5514350 6 0.22428249 0.7757175 0.5
7 B 2 0.7883051 7 0.10584743 0.8941526 0.5
8 D 4 0.8830174 8 0.05849130 0.9415087 0.5
9 H 8 0.8924190 9 0.05379048 0.9462095 0.5
10 E 5 0.9404673 10 0.02976636 0.9702336 0.5
---------------------------------------------
ggplot(df_tmp4,aes(new_id,mid)) + # x轴为对应的各个指标
geom_linerange(aes(ymin=ymin,ymax=ymax,
colour=factor(new_id)),
size=15,
alpha=0.5,show.legend = F)+
scale_x_continuous(breaks = 1:10,
labels = df_tmp4$var)+
coord_flip()
-------------------------------------------
ggplot(df_tmp4,aes(new_id,mid))+ # geom_step(colour="grey50")+
geom_crossbar(aes(ymin=ymin,ymax=ymax),
size=0,
fill="skyblue",
colour="grey50",
width=1)+
scale_x_continuous(breaks = 1:10,
labels = df_tmp4$var)+
coord_flip()

其他图形

1
2
3
4
5
6
7
errorbar
# 误差棒
errorbarh
# 水平误差棒
rug
# 边际地毯图(轴须图)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
blank
# 空白
contor
# 等高线图
crossbar
# 带水平中心线的盒子图
hex
# 六边形二维热点图
map
# 基准地图里多边形
ploygon
# 多边型(相当于一个有填充的路径)
raster
# 高效的矩形瓦片图
rect
# 二维矩阵图
ribbon
# 色带图(连续的x值所对应y的范围)
violin
# 小提琴图
tile
# 瓦片图

text - 文本注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
geom_text()
geom_text(aes(label=var)) / geom_text(aes(label=rownames(var)))
(x,y, alpha=, color=, size=, hjust=, vjust=,,nudge_x=0,nugde_y=0, angle=, fontface=, family=, lineheight=, show.legend=NA/F/T, check_overlap=F, na.rm=F )
# hjust=0(右侧),=1(左侧),=0.5(居中,默认);若小于0,则继续向右
# vjust=0(向上),=1(向下), =0.5(居中,默认); 若小于0,则继续向上;
## vjust/yjust ,可以是 0(right/bottom) 和 1(left/top),或者是字符串("left","right","middle","bottom","center","top"); 或者是 字符串 ("inward","outward")
## nudge_x=2.5 ,x轴方向,向右微调2.5
# 常用字体大小 size=4 ; 5.5;
## 标签显示为百分比
label=paste(100*mydata$scope,"%",sep="")
# ggplot() + geom_text(data=mydata,aes(x=Order,y=help+scope/2+.035,label=paste(100*mydata$scope,"%",sep="")),col="white",size=5.5)
p <- ggplot(mtcars, aes(x=wt, y=mpg, label=rownames(mtcars)))
p + geom_text()
p + geom_text(size=10) # Change size of the label[变更标签的大小]
p <- p + geom_point()
# Set aesthetics to fixed value[设置为固定值的美学]
p + geom_text()
p + geom_point() + geom_text(hjust=0, vjust=0)
p + geom_point() + geom_text(angle = 45)
# Add aesthetic mappings[审美映射]
p + geom_text(aes(colour=factor(cyl)))
p + geom_text(aes(colour=factor(cyl))) + scale_colour_discrete(l=40)
p + geom_text(aes(size=wt))
p + geom_text(aes(size=wt)) + scale_size(range=c(3,6))
# Add an annotation not from a variable source[添加注释,而不是从一个变量源]
c <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
c + geom_text(data = NULL, x = 5, y = 30, label = "plot mpg vs. wt")
# Or, you can use annotate[或者,您可以使用注释]
c + annotate("text", label = "plot mpg vs. wt", x = 2, y = 15, size = 8, colour = "red")
---------------------------------------------------------------------------------------
geom_label()
# draws a rectangle behind the text, making it easier to read.

aes(label=rownames(var)) 可在任何几何对象中出现

geom_point(aes(laber=rownames(var)))

图形属性

linetype

符号 描述
1 solid - 实线
2 dashed - 虚线
3 dotted - 点
4 dotdash - 破折号
5 longdash - 长破折号
6 twodash - 双破折号

position

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

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

side

地毯图geom_rug的位置;

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

shape

fontface

1
fontface= "plain", "italic", "bold", "bold.italic"


统计变换

常用统计变换

统计变换 描述
stat_identity 不做任何统计变换
stat_boxplot 计算组成箱线图的各种元素值
stat_density 一维密度估计
stat_density2d 二维密度估计
stat_smooth 添加拟合曲线
stat_summary 对每个x所对应的y值做统计描述
stat_unique 删除重复值
stat_bin count - 直方图
density - 频率多边形图
1
2
3
4
5
6
7
密度直方图
# ggplot(diamonds, aes(carat)) + geom_histogram(aes(y=..density..), binwidth=0.1)
添加拟合曲线
# p <- ggplot(diamonds, aes(x=carat,y=price,color=cut))
# p + geom_point(color='green',alpha=0.2)+ stat_smooth()

统计变换 stat_xx

统计变换 描述
stat_bin 计算封箱(bin)数据
bin2d 计算封箱内的观测值个数
bindot 计算“点直方图”封箱数据
binhex 计算“六边形热图”封箱数据
boxplot 计算组成箱线图的各种元素值
contour 三维数据的等高线
density 一维密度估计
density2d 二维密度估计
function 添加新的函数
identity 不对数据进行统计变换
qq 计算qq图的相关值
quantile 计算连续的分位数
smooth 添加光滑曲线
spoke 将角度和半径转换成xend和yend
sum 计算每个单一值的频数[有助于解决散点图的图形重叠问题]
summary 对每个x对应的y值做统计描述
summary2d 对二维矩形封箱设定函数
summaryhex 对二维六边形封箱设定函数
unique 删除重复值
ydensity 小提琴图,计算一维y轴方向的核密度函数的估计值

作图规范

标准作图规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
ggplot(mtcars, aes(disp,hp)) # 绘制对象(数据,图形属性aes)
+ geom_point(aes(color=factor(cyl))) # 图层(几何对象)-设定;若要分组,必须为因子factor变量
# geom_point(color="blue") # 图层(几何对象)-映射
# stat_() # 统计变化
+ goem_text(aes(label=cyl, color=cyl), size=, vjust=0.5,hjust=0.5,nudge_x=0.5, nudge_y=0.5, show.length=F) # 标签; hjust=0(向右),vjust=0(向上); nudge_x=0.5 向x轴方向微调0.5
+ annotate("text", x = 4, y = 25, label = "Some text")
+ xlim(0,10) # x轴的定义域,表示只选取该范围内的数值进行作图;超出部分则删除;
# xlim(0,max(mtcars$disp)) # 必须有data$var
# xlim("a","b","c") # 离散型
# xlim(as.Date(c("2008-05-01","2008-08-01")) # 日期型
+ sacle_y_continuous(
limits=c(min(mtcars$hp),300),
breaks=c(100,150,400), # =c(seq(0,200,20)) 指定坐标轴上应显示哪些刻度线的值 或一个连续型标度在一个图例中将被如何分段(即显示哪些刻度的值)
labels=c("100k","150k","400k") # 指定了应在断点处显示的标签
+ labs(x="", y="", title="", subtitle="") # 坐标轴的标签名称
+ scale_x_discrete(breaks=rev(levels(mtcars$hp))) # 转置
# scale_x_reverse() # 转置-连续型变量
+ scale_y_continuous(breaks=seq(0, 420, 30)) + scale_x_continuous(breaks=seq(0, 420, 15))
# 设置x/y轴显示的相对比例; 同 coord_equal(ratio=)
+ sacle_color_brewer(palette="") + scale_fill_hue() # 离散型标度的颜色设置
# scale_color_manual(values=c()) 手动自定义设置颜色
# scale_color_gradient(low="", high="") 连续型标度的颜色设置; 双色;
+ guides(fill=guide_legend((title=, title.position="top",label.position="top", nrow=2,reverse=F) # 设置图例
# guides(fill=FALSE) 删除图例
+ facet_grid(.~ y, margins=T, space="fixed") # 网格型分面 margins=c("col","col") 所需展示的边界图的变量
# facet_wrap(~y, ncol=2, scales="free_x") # 封装型分面
+ coord_flip() # 坐标轴翻转
+ coord_equal(ratio=2, xlim, ylim) y/x轴的比例
+ theme1 # theme1 <- theme_minimal() + theme(plot.title=element_text(hjust=0.5, face="bold"), axis.line =element_line(linetype=1))
+ theme(axis.line=element_line(linetype=1,size=1), axis.title.x=element_text(), panel.grid.minor=element_blank(), plot.title=element_text(face="bold",size=, hjust=0.5), plot.background=element_rect(fill=,color=)) # theme(主题元素= 主题性质) axis/legend/panel/plot/strip
+ plot.margin = unit(c(1,1,1,1),"lines") # 图形边界 top/right/bottom/left
grid.arrange(p1,p2,...pn, nrow=2) # library(gridExtra) 组图
--------------------------------------------------------------------
ggplot(data=, aes(x=, y= )) +
geom_xx(...) + stat_xx(...) +
annotate(...) +
scale_xx(...) + coord_xx(...) + guides(...) + theme(...)
# mtcars,R中自带的数据集

可对图形分别进行设定与修改 - 基础图形可被保存

1
2
3
4
5
6
创建绘图对象
# p <- ggplot(mtcars, aes(x=mpg, y=wt))
设定与修改
p + geom_point(aes(colour=factor(cyl))
p + geom_point(aes(y=disp))

1
2
3
4
做不同运算的图形
# ggplot(huron, aes(year))
+ geom_line(aes(y=level-5), color="blue")
+ geom_line(aes(y=level-5), color="red")

作图问题

图形基本处理

  • 矢量图形(PDF, PostScript, SVG,AI,)
  • 位图(PNG, JPEG, TIFF,bmp,jpg)
1
2
3
4
5
6
7
8
9
10
11
12
summary() # 查看结构
print() # 呈现
-----------------------------------------------------------------------------------
保存
ggsave() # 保存到磁盘
--ggsave("name.png", [plot=plot_name] width=, height=)
# plot_name为创建图像的名称;若忽略,则对最佳的图像保存
save() # 缓存保存到磁盘; 可保存一个图形对象的完整副本,并可用load()来重现该函数

图片保存

21.5寸显示频:1920px $\times$ 1080px (比值 = 1.7777)

电脑显示频 -16:9 (比值 = 1.777)

电脑显示频 - 4:3 (比值 = 1.333)

savePlot 的妙用(在R中的使用,非Rstudio)

1
2
3
4
5
6
7
savePlot(filename = "Rplot",
type = c("wmf", "emf", "png", "jpg", "jpeg", "bmp",
"tif", "tiff", "ps", "eps", "pdf"),
device = dev.cur(),
restoreConsole = TRUE)
# JPEG quality is 75% ; TIFF 无压缩。
# 所以这个命令在Rstudio上没法运行,在在R编辑器下运行成功

粘贴复制(rstudio)

1
2
3
4
export - copy to clipboard
生成图片以后,点击copy to clipboard,调整合适的大小,然后选择copy as的类型(bitmap,metafile), 确认后,然后就可以将图片粘贴到你想要他到的地方了,得到的是矢量图(metafile)
# 点击 export默认的单位是像素

导出高清的图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
tiff(filename = "test.tif",width = 15,height = 18,units ="cm",compression="none",bg="white",res=600)
# res设置图片分辨率; units指定长宽的单位,px(oixeis,默认的),in(inches),cm或者mm。compression为压缩方式,lzw压缩之后图片较小。可选的方式为none,rle,zlw,jpeg,zip。
dev.new()
pdf(file="example.pdf", width=12, height=8) #矢量图,pdf格式
svg(file="example.svg", width=12, height=8) #矢量图,svg格式
tiff(file="example.tiff", width=12, height=8, units="in", compression="lzw", res=150) #位图,tiff格式,常用于文章投稿。
dev.off()
# 默认的单位unit是英寸
ggsave("myplot.png", width=8, height=8, unit="cm", dpi=300)
------------------------------------------------------------------------------
改变字体
install.packages("extrafont")
library(extrafont) # Find and save information about fonts installed on your system
font_import() # List the fonts
fonts()
After the one-time setup is done, there are tasks you need to do in each R session:
library(extrafont) # Register the fonts with R
loadfonts()
# On Windows, you may need to tell it where Ghostscript is installed
# (adjust the path to match your installation of Ghostscript)
Sys.setenv(R_GSCMD = "C:/Program Files/gs/gs9.05/bin/gswin32c.exe") # Finally, you can create a PDF file and embed fonts into it, as in Figure 14-4:
library(ggplot2)
ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
ggtitle("Title text goes here") +
theme(text = element_text(size = 16, family="Impact"))
ggsave("myplot.pdf", width=4, height=4)
embed_fonts("myplot.pdf")

图片不清晰

R中生成的图片,保存为.tiff格式,有3M,在word里还是模糊

  1. 一般情况下,如果需要在word中插入图片,分为两种方法:复制黏贴与插入图片菜单。同时,由于word文档往往为表述性质使用,因此并不需要分辨率很高的图片,像我个人使用都是800*600的jpg格式,单张图片尺寸保持在100k~200k之间刚好。然后如果插入图片较多,往往会造成word文档尺寸较大,不便于使用MMS工具传输,所以会使用wrod中的图片处理工具压缩文档中的所有图片。
  2. 关于图片模糊,事实上在给定显示设备参数不变的状态下会有两种情况,一种是图片分辨率太低,还有一种是图片分辨率太高。解决方法是根据你最终输出的需求(出版物,电子文档等)来调整相应输出设备分辨率参数,并把其作为模版保存下来即可

为图形添加注释 - annotate

1
2
3
4
5
6
7
8
9
10
11
# 一次只添加一个位置上的图形
当x/y轴均为连续型的数值变量时,当annotate中的x/y引用对象时,必须是数值,可用as.numeric()来转换
# peak <- filter(data, var==max(var))
# peak_x <- as.numeric(peak[1,1])
# peak_y <- as.numeric(peak[1,2])
p + annotate("text", x = 4, y = 25, label = "Some text")
p + annotate("rect", xmin = 3, xmax = 4.2, ymin = 12, ymax = 21, alpha = .2)
p + annotate("segment", x = 2.5, xend = 4, y = 15, yend = 25, colour = "blue")
p + annotate("pointrange", x = 3.5, y = 20, ymin = 12, ymax = 28,colour = "red", size = 1.5)

项目排序顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
先设置好顺序 - factor
按当前排序来指定顺序
# data$col <- factor(data$col, levles=data$col, order=TRUE)
## arrange(data, col) 升序排列
自定义顺序
# data$col <- factor(data$col, levels=c("col1","col2"),order=TRUE)
----------------------------------------------------------------------------------
标度变换
# scale_x_discrete(limits=c("col","col")
# scale_x_discrete(limits=data$col)

遮盖问题

  • 图形相互覆盖无法看清
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
点的大小与形状
# geom_xxx(shape=)
## shape=1(中空的点)
## shape="." (像素大小的点)
透明度;最小透明度为1/256
# geom_xxx( alpha = [1/256 ,1] )
添加随机扰动 - jitter ;[当数据存在一定离散性]
# td <- ggplot(diamonds, aes(table,depth)) + xlim(50,70) + ylim(50,70)
## 直接添加 - td +geom_point ; td + geom_jitter() # 默认扰动量为40%
## 调整后变更扰动率 - jit <- positon_jitter(width=0.5); td +geom_jitter(position=jit)
将点分箱,并统计每个箱中点的数量,在可视化这个数量
# d <- ggplot(diamonds, aes(carat,price)) + xlim(1,3) # 此时并无图形显示
# d + stat_binhex() # 默认分箱数 # 即使没有几何对象也能做出图形
# d + stat_binhex(bins=10) # 共10个封箱 # 默认为30个
用stat_density2d做二维密度估计,并将等高线添加到散点图中

含权重数据

  • 点/线 - size = 权重变量

  • 复杂情况 - weight = 权重变量

交互式作图 - ggplotly

1
2
library(plotly)
ggplotly(object)

统计摘要:为统计量绘图

1
2
3
4
5
单独的摘要计算函数
# fun.y / fun.ymin / fun.ymax
统一的摘要统计函数
# fun.data