ggplot2包图形参数(坐标轴、分面、配色)整理

2021-02-22 15:03:22 浏览数 (1)

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,从而将刻度间距设为相同。

代码语言:javascript复制
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()时,各子图将像纸上的文字一样被依次横向排布并换行

代码语言:javascript复制
facet_wrap( ~ class) # class为变量

facet_wrap()默认使用相等数量的行和列,比如说分面为4时,行与列为2x2;分面为5时,为3x3。

修改行与列数目,通过nrowncol赋值实现。

代码语言:javascript复制
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()代替即可。

代码语言:javascript复制
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)用自定义的。

代码语言:javascript复制
# 自定义调色板(颜色选用对色盲友好的颜色)
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()

代码语言:javascript复制
两色渐变
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数据可视化手册》。

End

0 人点赞