文章目录
说明1、图形微调效果2、调整坐标轴2.1 labs 调整轴标签2.2 lims 调整刻度范围2.3 theme 调整具体细节
3、调整背景画布3.1 调节主题函数3.2 theme 调整细节
4、调整标尺4.1 三种标尺4.2 x轴上的标尺4.3 y轴上的标尺4.4 图例上的标尺4.4.1 透明度标尺4.4.2 颜色标尺4.4.3 其他标尺
5、输出高DPI图片
说明
R语言的版本为4.0.2,IDE为Rstudio,版本为1.3.959。本次学习的内容是依据一组数据,画出样条曲线拟合图,并输出为高DPI图片。 学习过程中主要参考了以下文章: R语言绘图高质量输出(博客园) ggplot2学习笔记系列之利用ggplot2绘制散点图(简书) 使用ggplot2 如何修改刻度方向 ,使刻度朝内?(知乎) 如何在ggplot2里将图片文字改成微软雅黑() ggplot2一页多图(简书) ggplot2作图详解7(完):主题(theme)设置 (新浪) R语言之正则表达式(博客园)
1、图形微调效果
微调之前微调之后
## 未经调整
waveFile
<- file('weave.txt')
wave
<- scan(file
= waveFile
)
close(waveFile
)
library(ggplot2
)
time
<- c(1990:2016)[-17][-15]
waveLine
<- data
.frame(time
= time
, wave
= wave
)
sWaveLine
<- data
.frame(spline(waveLine
, n
= 6000))
ggplot(waveLine
, aes(time
, wave
)) +
geom_point(colour
="red", shape
="*", size
=6) +
geom_line(data
=sWaveLine
, aes(x
=x
, y
=y
), size
= 0.3)
## 调整之后
waveFile
<- file('weave.txt')
wave
<- scan(file
= waveFile
)
close(waveFile
)
time
<- c(1:25)
waveLine
<- data
.frame(time
= time
, weave
= weave
)
sWaveLine
<- data
.frame(spline(waveLine
, n
= 6000))
library(ggplot2
)
weavePlot
<- ggplot(waveLine
, aes(time
, weave
)) +
geom_point(colour
="red", shape
=8, size
=2) +
geom_line(data
=sWaveLine
, aes(x
=x
, y
=y
), size
= 0.3) +
theme_bw() +
theme(panel
.grid
= element_blank(),
axis
.line
= element_line(size
= 0.1),
axis
.ticks
.length
= unit(-0.2,"cm"),
axis
.title
.x
=element_text(family
="serif",size
=17, margin
= unit(rep(0.1, 4), 'cm')),
axis
.title
.y
=element_text(family
="serif",size
=17, margin
= unit(rep(0.1, 4), 'cm')),
axis
.text
.x
=element_text(family
="serif",size
=17, margin
= unit(rep(0.6, 4), 'cm')),
axis
.text
.y
=element_text(family
="serif",size
=17, margin
= unit(rep(0.6, 4), 'cm')))+
ylab("Wave(m)") +
xlab("Time(year)") +
scale_x_continuous(breaks
= seq(1,27,3),
expand
= c(0,0),
labels
=c("1990","1993","1996","1999","2002","2006","2010","2013","2016"),
sec
.axis
= sec_axis(~./0.999,name
="", breaks
=seq(1,27,3),
labels
=c(" "," "," "," "," "," "," "," "," "))) +
scale_y_continuous(breaks
= seq(0,8,2),
limits
= c(0,8),
expand
= c(0,0),
labels
=c("0","2","4","6","8"),
sec
.axis
= sec_axis(~./0.999,name
="", breaks
=seq(0,8,2),
labels
=c(" "," "," "," "," ")))
require(Cairo
)
ggsave("wavePlot.pdf", weavePlot
, width
= 9.36, height
= 4.29)
2、调整坐标轴
调整坐标轴主要有三种方法:
通过 labs 调整坐标轴标签通过 lims 调整刻度范围通过 theme 控制具体细节
在这里插入代码片
2.1 labs 调整轴标签
# 该函数有三个快捷方法,分别是
#
xlab(label
):快捷设置x轴标题
#
ylab(label
):快捷设置y轴标题
#
ggtitle(label
, subtitle
= waiver()):快捷设置图标题
# 它们是
labs()类的快捷实现,用
labs()也能达到同样的效果
# 例如以下两种写法等价
ylab("Wave(m)") +
xlab("Time(year)")
labs(x
="Wave(m)", y
="Time(year)")
2.2 lims 调整刻度范围
需注意,用该函数修改刻度范围会与 scale 函数中修改范围重复,最终仅有一个生效
# 该函数有两个快捷方法
#
xlim(...):快捷设置x轴刻度范围
#
ylim(...):快捷设置y轴刻度范围
# 二者是
lims()函数的快捷实现,用
lims()也能实现
# 例如以下两种写法等价
ylim(0,10)
lims(y
=c(0,10))
2.3 theme 调整具体细节
对于坐标轴而言,主要调整 theme 函数中 axis 参数的值
## 该类中axis参数有很多
# axis
.title 全局轴标题,以下表示具体轴标题
# axis
.title
.x
# axis
.title
.x
.top
# axis
.title
.x
.bottom
# axis
.title
.y
# axis
.title
.y
.left
# axis
.title
.y
.right
# 修改该参数需要借助
element_text(),文字元素生成函数
# 该函数的参数、含义列举如下
# family:字体,需要先引入windows字体,然后使用
#
例如:windowsFonts(A=windowsFont("微软雅黑"))
#
plot(1:10, 1:10, type
="n")
#
text(6,4,"微软雅黑", family
="A")
# face:字体样式,字符串设置倾斜、加粗等
# colour
,color:线条或者边框的颜色,颜色名或
RGB名
#
size:线条(mm
)、边框(mm
)、文字(pt
)的尺寸
# hjust:水平对齐,值在
0-1之间
# vjust:竖向对齐,值在
0-1之间
# angle:旋转角度,值在
0-360之间
# lineheight:线高度,数值
# margin:文字周围的留白,
# debug:辅助可视化调试,逻辑值
# inherit
.blank:是否从父类继承留白,逻辑值
axis
.title
.x
=element_text(family
="serif",size
=17, margin
= unit(rep(0.1, 4), 'cm'))
# axis
.text 全局轴刻度标签,以下表示具体轴刻度标签
# axis
.text
.x
# axis
.text
.x
.top
# axis
.text
.x
.bottom
# axis
.text
.y
# axis
.text
.y
.left
# axis
.text
.y
.right
# 修改该参数需要借助
element_text(),文字元素生成函数
# 该函数的参数、含义列举如下
# family:字体,需要先引入windows字体,然后使用
#
例如:windowsFonts(A=windowsFont("微软雅黑"))
#
plot(1:10, 1:10, type
="n")
#
text(6,4,"微软雅黑", family
="A")
# face:字体样式,字符串设置倾斜、加粗等
# colour
,color:线条或者边框的颜色,颜色名或
RGB名
#
size:线条(mm
)、边框(mm
)、文字(pt
)的尺寸
# hjust:水平对齐,值在
0-1之间
# vjust:竖向对齐,值在
0-1之间
# angle:旋转角度,值在
0-360之间
# lineheight:线高度,数值
# margin:文字周围的留白,
# debug:辅助可视化调试,逻辑值
# inherit
.blank:是否从父类继承留白,逻辑值
axis
.text
.x
=element_text(family
="serif",size
=17, margin
= unit(rep(0.6, 4), 'cm'))
# axis
.ticks 全局轴刻度线,以下表示具体轴刻度
# axis
.ticks
.x
# axis
.ticks
.x
.top
# axis
.ticks
.x
.bottom
# axis
.ticks
.y
# axis
.ticks
.y
.left
# axis
.ticks
.y
.right
# 修改参数值还需借助
element_line(),线元素生成函数
# 该函数的参数、含义列举如下
# colour
,color:线条或者边框的颜色,颜色名或
RGB名
#
size:线条(mm
)、边框(mm
)、文字(pt
)的粗细
# linetype:线型,用数字
1-8或者字符串指定,
# lineend:线两端的形状,用字符串指定
# arrow:线条末端箭头
,要借助
arrow() 函数构造箭头
#
例如:arrow(angle
= 30, length
= unit(0.25, "inches"),
# ends
= "last", type
= "open")
# inherit
.blank:是否从父类继承留白,逻辑值
axis
.ticks
= element_line(size
= 0.1)
# axis
.ticks
.length 全局刻度长度,以下表示具体刻度长度
# axis
.ticks
.length
.x
# axis
.ticks
.length
.x
.top
# axis
.ticks
.length
.x
.bottom
# axis
.ticks
.length
.y
# axis
.ticks
.length
.y
.left
# axis
.ticks
.length
.y
.right
# 直接给该参数赋值即可,负值代表反方向,使用unit可转换单位
axis
.ticks
.length
= unit(-0.2,"cm")
# axis
.line 全局轴线,以下表示具体轴线
# axis
.line
.x
# axis
.line
.x
.top
# axis
.line
.x
.bottom
# axis
.line
.y
# axis
.line
.y
.left
# axis
.line
.y
.right
# 修改参数值还需借助
element_line()线元素生成函数
# 该函数的参数、含义列举如下
# colour
,color:线条或者边框的颜色,颜色名或
RGB名
# size:
线条(mm
)、边框(mm
)、文字(pt
)的尺寸
# linetype:线型,用数字
1-8或者字符串指定,
# lineend:线两端的形状,用字符串指定
# arrow:线条末端箭头
,要借助
arrow() 函数构造箭头
# 例如:
arrow(angle
= 30, length
= unit(0.25, "inches"),
# ends
= "last", type
= "open")
# inherit
.blank:是否从父类继承留白,逻辑值
axis
.line
= element_line(size
= 0.1)
3、调整背景画布
背景画布的调节主要有两种方式:
通过快捷主题函数调节通过 theme 中的 panel 参数调节
3.1 调节主题函数
p13:
# 快捷主题函数有以下几种,是已经设定好的主题模板
library("cowplot")
xx
<- c(1:5)
yy
<- c(1:5)
line
<- data
.frame(x
=xx
, y
= yy
)
plot
<- ggplot(line
, aes(xx
,yy
)) +
geom_point(colour
="red", shape
=8, size
=2)
p1
<- plot
+theme_bw()
p2
<- plot
+theme_classic()
p3
<- plot
+theme_dark()
p4
<- plot
+theme_get()
p5
<- plot
+theme_gray()
p6
<- plot
+theme_grey()
p7
<- plot
+theme_light()
p8
<- plot
+theme_linedraw()
p9
<- plot
+theme_minimal()
p10
<- plot
+theme_replace()
p11
<- plot
+theme_test()
p12
<- plot
+theme_update()
plot
+theme_void()
plot_grid(p1
, p2
, p3
, p4
, p5
, p6
, p7
, p8
,
p9
, p10
, p11
, p12
, p13
, nrow
= 2, ncol
= 6,
labels
= c('p1', 'p2', 'p3', 'p4',
'p5', 'p6', 'p7', 'p8',
'p9', 'p10', 'p11', 'p12', ))
3.2 theme 调整细节
对于背景而言,主要调整 theme 函数中 panel 参数的值
# panel
.background 画布背景
#
调节该参数,需要依靠element_rect(),边界和背景生成函数
# 该函数的参数、含义列举如下
# fill:填充颜色,颜色名或
RGB名
# colour
,color:线条或者边框的颜色,颜色名或
RGB名
#
size:线条(mm
)、边框(mm
)、文字(pt
)的尺寸
# linetype:线型,用数字
1-8或者字符串指定,
library("cowplot")
xx
<- c(1:5)
yy
<- c(1:5)
line
<- data
.frame(x
=xx
, y
= yy
)
plot
<- ggplot(line
, aes(xx
,yy
)) +
geom_point(colour
="red", shape
=8, size
=2)
plot1
<- plot
+ theme(panel
.background
= element_rect(fill
= "blue",
color
= "red",
size
= 2,
linetype
= 3))
plot_grid(plot
, plot1
, nrow
= 1, ncol
= 2,
labels
= c('plot', 'plot1'))
# panel
.border 边框
#
调节该参数,需要依靠element_rect(),边界和背景生成函数
# panel
.spacing # 不同子plot之间距离大小
,以下是具体方向
# panel
.spacing
.x
# panel
.spacing
.y
# panel
.grid 全局栅格线,以下是具体栅格线
# panel
.grid
.major
# panel
.grid
.minor
# panel
.grid
.major
.x
# panel
.grid
.major
.y
# panel
.grid
.minor
.x
# panel
.grid
.minor
.y
# 修改参数值需借助
element_line(),线元素生成函数
# panel
.ontop 逻辑值,将背景层和栅格层放到数据层之上
4、调整标尺
标尺的调整使用scale函数进行操作,其中包含的函数有121个之多,但是其逻辑有些混乱,我按照自己的理解梳理以下。
4.1 三种标尺
# 使用正则表达式列出所有标尺函数的个数
library(ggplot2
)
scalex
<- ls("package:ggplot2", pattern
= "^scale.+")
length(scalex
)
# 按照命名方式对标尺归类
scalex
<- scalex
[grep("([^_]+_){2}.+", scalex
)]
unique(gsub("(([^_]+_){2}).+", "\\1***", scalex
))
# 输出结果为:
[1] 121
[1] "scale_alpha_***" "scale_color_***"
[3] "scale_colour_***" "scale_continuous_***"
[5] "scale_discrete_***" "scale_fill_***"
[7] "scale_linetype_***" "scale_shape_***"
[9] "scale_size_***" "scale_x_***"
[11] "scale_y_***"
# 在实际运用中发现如果理解成有
11种标尺,发现不恰当
# 按照一张图的要素来讲,实际上只有
3种标尺,分别是
#
1、表现在x轴上的标尺,包括
#
"scale_x_***" 其具体函数,用于设置在x轴上显示的标尺参数
#
2、表现在y轴上的标尺,包括
#
"scale_y_***" 其具体函数,用于设置在y轴上显示的标尺参数
#
3、表现在一侧图例上的标尺,包括
#
"scale_alpha_***" 其具体函数,用于设置在x轴
#
"scale_color_***"
#
"scale_colour_***"
#
"scale_continuous_***"
#
"scale_discrete_***"
#
"scale_fill_***"
#
"scale_linetype_***"
#
"scale_shape_***"
#
"scale_size_***"
4.2 x轴上的标尺
#
"scale_x_continuous" 更改默认x轴标尺的属性
#
"scale_x_binned" 累计图x轴标尺
#
"scale_x_continuous" 默认x轴标尺
#
"scale_x_date" 日期格式的x轴标尺
#
"scale_x_datetime" 日期格式的x轴标尺
#
"scale_x_discrete" 离散的的x轴标尺
#
"scale_x_log10" 对数形式的x轴标尺
#
"scale_x_reverse" 颠倒的x轴标尺
#
"scale_x_sqrt" 开方形式的x轴标尺
#
"scale_x_time" 时间格式的x轴标尺
library("cowplot")
xx
<- c(1:5)
yy
<- c(1:5)
zz
<- c(0,0.5,0.1,0.3,3)
line
<- data
.frame(x
=xx
, y
= yy
)
plot
<- ggplot(line
, aes(xx
,yy
)) +
geom_point(colour
="red", shape
=8, size
=2)
plot1
<- plot
plot2
<- plot
+
scale_x_continuous(breaks
= c(1:5),
expand
= c(0,0),
labels
=c("1990","1993","1996","1999","2002"),
sec
.axis
= sec_axis(~./0.999,name
="", breaks
=c(1:5),
labels
=c(" "," "," "," "," ")))
plot_grid(plot1
, plot2
, nrow
= 1, ncol
= 2,
labels
= c('plot1', 'plot2'))
4.3 y轴上的标尺
使用方法和参数与x轴上的完全一致。
4.4 图例上的标尺
4.4.1 透明度标尺
#
"scale_alpha_***" 透明度型标尺
,对映射到透明度上的数据起作用
library("cowplot")
xx
<- c(1:5)
yy
<- c(1:5)
zz
<- c(0,5,1,3,3)
line
<- data
.frame(x
=xx
, y
= yy
)
plot
<- ggplot(line
, aes(xx
,yy
)) +
geom_point(colour
="red", shape
=8, size
=2, aes(alpha
= zz
))
plot1
<- plot
+
scale_alpha(range
= c(0.3, 0.7))
plot_grid(plot
, plot1
, nrow
= 1, ncol
= 2,
labels
= c('plot', 'plot1'))
4.4.2 颜色标尺
#
"scale_color_***" 离散型颜色标尺
#
"scale_colour_***" 离散型颜色标尺
#
"scale_fill_***" 连续型颜色标尺
# 当数据特别多的时候,更加明显,此时数据较少
library("cowplot")
xx
<- c(1:5)
yy
<- c(1:5)
zz
<- c(0,0.5,0.1,0.3,3)
line
<- data
.frame(x
=xx
, y
= yy
)
plot
<- ggplot(line
, aes(xx
,yy
,fill
= zz
)) +
geom_tile()
plot1
<- plot
+
scale_fill_continuous(type
= "gradient")
plot2
<- plot
+
scale_color_continuous(type
= "gradient")
plot_grid(plot
, plot1
, nrow
= 1, ncol
= 2,
labels
= c('plot1', 'plot2'))
# 此时数据较多
library("cowplot")
v
<- ggplot(faithfuld
, aes(waiting
, eruptions
, fill
= density
)) +
geom_tile()
plot1
<- v
+ scale_color_continuous(type
= "gradient")
plot2
<- v
+ scale_fill_continuous(type
= "viridis")
# 以下是上面的快捷函数
v
+ scale_fill_gradient()
v
+ scale_fill_viridis_c()
plot_grid(plot1
, plot2
, nrow
= 1, ncol
= 2,
labels
= c('plot1', 'plot2'))
4.4.3 其他标尺
#
"scale_linetype_***" 线型标尺
#
"scale_shape_***" 形状标尺
#
"scale_size_***" 大小标尺
5、输出高DPI图片
# 使用Cairo包输出为
PDF形式的矢量图,再用
AI打开,导出为高清
PNG位图
require(Cairo
)
ggsave("wavePlot.pdf", weavePlot
, width
= 9.36, height
= 4.29)
ggplot(data
, aes(x
= x
, y
= y
)) + geom_line(size
= 1) +
theme_bw()
#最后关闭图像设备,同时储存图片
dev
.off()