R具有强大的统计计算功能和便捷的数据可视化系统。目前R主要支持四套图形系统:基础图形(base)、网格图形(grid)、lattice图形和ggplot2。其中ggplot2凭借强大的语法特性和优雅的图形外观,逐渐成为R中数据可视化的主流选择。
《R数据可视化手册》重点讲解R的绘图系统,指导读者通过绘图系统实现数据可视化,主要侧重于解决具体问题,是R数据可视化的实战秘籍。书中绝大多数的绘图案例都是以强大、灵活制图而著称的R包ggplot2实现的,充分展现了ggplot2生动、翔实的一面。
本文根据《R数据可视化手册》整理ggplot2包的图形参数(图形外观、注解、图例、坐标轴、分面、配色)。
目 录
- 4 坐标轴
- 4.1 交换x轴和y轴
- 4.2 坐标轴显示直线
- 4.3 设置连续型坐标轴范围
- 4.4 坐标轴顺序
- 4.5 设置坐标轴缩放比例
- 4.6 刻度线和刻度标签
- 4.7 坐标轴标签
- 4.8 对数坐标轴
- 4.9 绘制环状图形
- 4.10 日期坐标轴
- 5. 分面
- 5.1 使用分面将数据分割绘制到子图中
- 5.2 在不同坐标轴下使用分面
- 5.3 修改分面的文本标签
- 5.4 修改分面标签和标题的外观
- 6. 配色
- 6.1 设置对象的颜色
- 6.2 将变量映射到颜色上
- 6.3 对离散型变量使用不同的调色板
- 6.4 对离散型变量使用自定义调色板
- 6.5 使用色盲友好型调色板
- 6.6 对连续性变量使用自定义调色板
- 6.7 根据数值设定阴影颜色
- End
4 坐标轴
4.1 交换x轴和y轴
代码语言:javascript复制coord_flip() # 翻转坐标轴
4.2 坐标轴显示直线
代码语言:javascript复制# 显示坐标轴直线,并设置为黑色
theme(axis.line = element_line(colour="black"))
其他参数:大小size;
两边界线末端仅部分重叠,完全重叠设置:lineend="square";
4.3 设置连续型坐标轴范围
代码语言:javascript复制xlim() # 设置连续性x轴的最小值和最大值
ylim() # 同上
ylim(0, max(PlantGrowth$weight)) # y轴最大值为weight变量的最大值
ylim()是scale_y_continuous()设定范围的简便写法。
调整参数limits可以设定x轴范围
scale_y_continuous(limits=c(0, 10)) # 设定范围0-10,x轴同理
注意:ggplot2包有两种设置值域的方式,第一种是修改标度;第二种是应用一个坐标变换。当你修改x标度和y标度的范围时,任何在范围以外的数据都会被移除,换言之,超出范围的数据不仅不会被展示,而且会被完全移出考虑处理的数据范围,统计量的计算都会基于修剪后的数据。
通过坐标变换,数据则不会被修剪。从本质上讲,只是将数据放大或缩小到指定的范围。
代码语言:javascript复制coord_cartesian(ylim = c(5, 6.5))
4.4 坐标轴顺序
4.4.1 反转连续型坐标轴
代码语言:javascript复制xlim(6.5, 3.5) # 指定反序范围反转,先写最大值,再写最小值
scale_x_reverse() # 反转x轴,不设定值域范围
scale_x_reverse(limits=c(8, 0)) # 反转x轴并设定值域范围
以上y轴同理
4.4.2 离散型坐标轴
代码语言:javascript复制设定参数limits来修改坐标轴顺序
scale_x_discrete(limits=c("trt1","ctrl","trt2"))
如忽略因子中某些类别,则输入:limits=c("trt1","ctrl")
反转因子顺序
scale_x_discrete(limits=rev(levels(PlantGrowth$group)))
# PlantGrowth$group为因子变量
4.5 设置坐标轴缩放比例
代码语言:javascript复制coord_fixed() # 默认1:1,指坐标轴单位长度表示的数值范围是1:1
coord_fixed(ratio=1/2) # 通过设定参数ratio可以指定其他固定比例
可以在scale_y_continuous()
和scale_x_continuous()
中调整参数breaks,从而将刻度间距设为相同。
p coord_fixed()
scale_y_continuous(breaks=seq(0, 420, 30))
scale_x_continuous(breaks=seq(0, 420, 30))
4.6 刻度线和刻度标签
4.6.1 移除刻度线、刻度标签和网格线
代码语言:javascript复制theme(axis.ticks=element_blank()) # 移除两坐标轴刻度线,无法仅隐藏单个坐标轴的刻度线
theme(axis.text.x = element_blank()) # 仅移除x轴刻度标签,y轴同
scale_y_continuous(breaks=NULL)
# 移除y轴刻度线、刻度标签和y轴网格线,仅对连续型坐标轴有效
4.6.2 设置刻度线位置
代码语言:javascript复制调整参数breaks可以修改刻度线的位置
scale_y_continuous(breaks=c(4, 5, 6, 7,8)) # x轴同理
使用seq()函数可以生成刻度线的位置向量,如seq(4, 8, by=1)
4.6.3 修改刻度标签文本
代码语言:javascript复制调整参数labels可以修改刻度标签文本
scale_y_continuous(breaks=c(50, 56),
labels=c("Tiny", "short"))
# 标签较长可以使用换行符(n)另起一行。
4.6.4 修改刻度标签外观
对于较长的标签,可以使用旋转角度或者另起一行的方式来增加可阅读性。
代码语言:javascript复制theme(axis.text.x = element_text(angle=30, hjust=1, vjust=1))
# 刻度标签旋转30°
# 参数hjust和vjust设置横向对齐(左对齐/居中/右对齐)和纵向对齐(顶部对齐/居中/底部对齐)。
# 其他文本属性包括大小size、颜色colour、样式face和字体族family等;
# size=rel(0.9))意为当前主题基础字体大小的0.9倍。
4.7 坐标轴标签
4.7.1 移除坐标轴标签
代码语言:javascript复制theme(axis.title.x=element_blank()) # 移除x轴标签,不留出空白空间
xlab("") # 通过设置空字符来不显示x轴标签,但是会留出空间,表示存在空白文本
# 以上y轴同
4.7.2 修改坐标轴标签文本
代码语言:javascript复制xlab() # 修改x轴标签文本
ylab() # 修改y轴标签文本
labs(x = "x轴标签", y = "y轴标签")
scale_x_continuous(name="x轴标签")
# scale_y_continuous()、scale_x_discrete()也适用
4.7.3 修改坐标轴标签外观
代码语言:javascript复制theme(axis.title.x=element_text(face="italic", colour="darkred", size=14))
可以设置旋转angle、对齐(hjust/vjust)、大小size、颜色colour、样式face和字体簇family等;
y轴一般不旋转,而是用n表示另起一行;
4.8 对数坐标轴
4.8.1 转换为对数坐标轴
代码语言:javascript复制scale_x_log10() # x轴为对数轴
scale_y_log10() # y轴为对数轴
4.8.2 对数坐标轴刻度标签
代码语言:javascript复制scale_x_log10(breaks=10^(-1:5)) # 值域过大会自动输出为科学记数法
scale_y_log10(breaks=10^(0:3))
scales包的trans_format()函数可使刻度标签使用指数记数法
library(scales)
scale_x_log10(breaks=10^(-1:5),
labels=trans_format("log10", math_format(10^.x)))
4.8.3 对数坐标轴刻度位置
较复杂,有需要建议参考《R数据可视化手册》。
4.9 绘制环状图形
较复杂,有需要建议参考《R数据可视化手册》。
4.10 日期坐标轴
时间有关的对象有两类:日期对象(精确到天)和日期时间对象(精确到秒)。
4.10.1 日期坐标轴
代码语言:javascript复制坐标轴上的日期刻度间距使用seq()函数设定
datebreaks <- seq(as.Date("1992-06-01"), as.Date("1993-06-01"), by="2 month")
scale_x_date(breaks=datebreaks) # 使用设定的日期刻度分割点
调整日期刻度标签的格式
library(scales) # 使用scales包中的date_format()函数来指定格式
scale_x_date(breaks=datebreaks, labels=date_format("%Y %b"))
日期格式应放入一个字符串中传递给date_format()。
日期刻度标签的外观的调整跟前面刻度参数调整一样。
theme(axis.text.x = element_text(angle=30, hjust=1))
常用的日期格式
4.10.2 时间坐标轴
代码语言:javascript复制手动指定刻度分割点和标签
scale_x_continuous(breaks=c(0, 20, 40, 60, 80, 100), labels=c("0:00", "0:20", "0:40", "1:00", "1:20", "1:40"))
其他设定参见《R数据可视化手册》
5. 分面
5.1 使用分面将数据分割绘制到子图中
使用facet_grid()
或facet_wrap()
函数,并指定根据哪个变量来分割数据。
5.1.1 使用facet_grid()分面
进行纵向排布、横向排布或同时进行纵横向排布。
代码语言:javascript复制# drv和cyl为数据集中指定进行分割的变量
facet_grid(drv ~ .) # 纵向排列根据drv变量分面
facet_grid(. ~ cyl) # 横向排列根据cyl变量分面
facet_grid(drv ~ cyl) # 同时根据drv纵向、cyl横向分面
5.1.2 使用facet_wrap()分面
使用facet_wrap()
时,各子图将像纸上的文字一样被依次横向排布并换行。
facet_wrap( ~ class) # class为变量
facet_wrap()默认使用相等数量的行和列,比如说分面为4时,行与列为2x2;分面为5时,为3x3。
修改行与列数目,通过nrow
或ncol
赋值实现。
facet_wrap( ~ class, nrow=2)
facet_wrap( ~ class, ncol=4)
分面方向的选择依赖于你更倾向于鼓励读图者进行哪种类型的比较。
5.2 在不同坐标轴下使用分面
使每个分面的坐标轴不一样,将标度设置为"free_x"、"free_y"或"free"。
代码语言:javascript复制facet_grid(drv ~ cyl, scales="free_y") # 使用自由的y标度
facet_grid(drv ~ cyl, scales="free") # 使用自由的x标度和y标度
通过设置只有的坐标轴标度,各个子图将拥有自己的坐标轴值域。 无法直接设置各行或各列的值域,但是可以通过丢弃不想要的数据(以缩减值域)或通过添加几何对象geom_blank()(以扩展值域)的方式控制值域的大小。
5.3 修改分面的文本标签
分面变量一般为离散型变量或者分类变量,直接修改分面变量各水平的名称就可以修改分面的文本标签。
代码语言:javascript复制# 修改分面变量各水平
levels(数据框名$分面变量)[levels(数据框名$分面变量)=="水平1"] <- "修改后的水平1"
levels(数据框名$分面变量)[levels(数据框名$分面变量)=="水平2"] <- "修改后的水平2"
levels(数据框名$分面变量)[levels(数据框名$分面变量)=="水平3"] <- "修改后的水平3"
5.3.1 贴标函数label_both()
作用:将在每个分面上同时打印出变量的名称和变量的值。
代码语言:javascript复制facet_grid(drv ~ ., labeller = label_both)
5.3.2 贴标函数label_parsed()
作用:可以读入字符串,并将其作为R数学表达式来解析。 在修改分面变量水平时,各水平可以输入为数学表达式。
代码语言:javascript复制facet_grid(drv ~ ., labeller = label_parsed)
注意:上面两个贴标函数适用于facet_grid()函数,可能不适用于facet_wrap()函数。
5.4 修改分面标签和标题的外观
使用主题系统,通过设置strip.text来控制文本的外观,设置strip.background以控制背景的外观。
代码语言:javascript复制facet_grid(. ~ Date)
theme(strip.text = element_text(face="bold", size=rel(1.5)),
strip.background = element_rect(fill="lightblue", colour="black",
size=1))
# 可以设置背景颜色、边框颜色、边框轮廓粗细、字体大小、颜色、样式、字体簇等。
6. 配色
6.1 设置对象的颜色
对于几何对象,设置colour或者fill参数的值。
代码语言:javascript复制ggplot(birthwt, aes(x=bwt))
geom_histogram(fill="red", colour="black")
一般而言,colour参数控制的是线条、多边形轮廓的颜色,而fill参数控制的是多边形的填充色。
对于点形来说,情况略微有些不同。大多数的点形,整个点的颜色是由colour控制的,而不是fi11。例外的情况是21-25号点,它们不仅有填充色,也有边界色。
6.2 将变量映射到颜色上
对于几何对象,将colour或fill参数的值设置为数据中某一列的列名即可。
代码语言:javascript复制# 将变量映射到fill 参数
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))
geom_bar(colour="black", position="dodge")
代码语言:javascript复制# 将变量映射到点的colour 参数
ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) geom_point()
6.3 对离散型变量使用不同的调色板
不同的调色板
6.3.1 默认调色板
代码语言:javascript复制library(gcookbook) # 为了使用数据集
ggplot(uspopage, aes(x=Year, y=Thousands, fill=AgeGroup)) geom_area()
scale_fill_discrete() # 默认调色板
# scale_fill_hue() # 也是默认调色板
6.3.2 ColorBrewer调色板
查看ColorBrewer包中的调色板。
代码语言:javascript复制library(RColorBrewer) # 加载包
display.brewer.all() # 展示该包中所有的调色板名称
ColorBrewer调色板可以通过名称来选择
代码语言:javascript复制scale_fill_brewer(palette="Oranges")
选择Oranges调色板,还可以选择其他的调色板
6.3.3 灰度调色板
灰度调色板适合黑白打印。标度范围是0~1(其中0对应黑色,1对应白色),灰度调色板的默认范围是0.2~0.8,但这个可以更改。
代码语言:javascript复制scale_fill_grey(start=0.7, end=0)
倒转方向并且更改灰度范围
6.4 对离散型变量使用自定义调色板
用scale_colour_manual()
函数来自定义颜色;填充色标度,使用scale_fill_manual()
代替即可。
scale_colour_manual(values=c("red", "blue"))
scale_colour_manual(values=c("#CC6666", "#7777DD"))
参数values向量中的元素顺序自动匹配离散标度对应因子水平的顺序。
查看因子顺序:levels(因子名)
。
变量是字符型向量而非因子形式,那么它会被自动转化为因子;顺序也默认地按字母表排序。
代码语言:javascript复制自定义颜色分配的顺序,可以使用带有名称的向量参数
scale_colour_manual(values=c(m="blue", f="red"))
6.5 使用色盲友好型调色板
使用函数scale_fill_manual()
,调色板(cb_palette)用自定义的。
# 自定义调色板(颜色选用对色盲友好的颜色)
cb_palette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442",
"#0072B2", "#D55E00", "#CC79A7")
scale_fill_manual(values=cb_palette)
6.6 对连续性变量使用自定义调色板
对连续型变量使用自定义渐变式的调色板,可以是默认颜色、两色渐变scale_colour_gradient()
、三色渐变scale_colour_gradient2()
和四色渐变scale_colour_gradientn()
。
两色渐变
scale_colour_gradient(low="black", high="white")
渐变色中间用白色划分
library(scales) # muted()函数需要的包,muted()会针对输入的颜色输出一个饱和度较低的颜色
scale_colour_gradient2(low=muted("red"), mid="white", high=muted("blue"),
midpoint=110)
n个颜色的渐变色
scale_colour_gradientn(colours = c("darkred", "orange", "yellow", "white"))
6.7 根据数值设定阴影颜色
较复杂,有需要参考《R数据可视化手册》。