ggplot2全面教程笔记

Page content

ggplot2全面教程笔记 by 生信小知识

ggplot2全面教程笔记

微信公众号:生信小知识
关注可了解更多的生物信息学教程及知识。问题或建议,请公众号留言;

目录

前言1. 学习逻辑2. 数据(data) 和 映射(Mapping)3. 几何对象(Geometric)3.1 直方图——提供一个连续变量,画出数据的分布3.2 柱状图——提供一个分类变量,画出数据的分布3.2.1 直方图与柱状图的区分与联系3.3 箱式图4. 标尺(Scale)4.1 颜色标尺设置(color fill)4.1.1 更改离散型变量的颜色函数4.1.2 更改连续型变量的颜色函数4.2 坐标轴标尺修改(x , y)4.2.1 一些简单偷懒的方法5. 统计变换(Statistics)5.1 stat_summary5.2 stat_smooth6. 坐标系统(Coordinante)6.1 coord_flip() 实现坐标轴翻转6.2 coord_polar()实现极坐标转换7. 分面(Facet)8. 主题(Theme)8.1 theme 参数8.1.1 修改标题,坐标轴8.1.2 修改图例8.1.3 修改绘图背景,主轴和次轴8.2 相关主题8.2.1 ggplot2默认主题8.2.2 扩展包主题9. 其他小知识9.1 多张图合并9.2 额外添加直线9.2.1 设置为虚线9.3 坐标轴中间设置中断9.4 改变字体大小9.4.1 倍数改变9.4.2 指定具体大小9.5 坐标轴上label旋转9.6 图片上特定地方添加字母label后记

前言

用R的人,人人都知道ggplot2的强大,但是作为一个懒人,我只知道ggplot2的最基本用法,每次都是画什么图就去google找代码,这使得我在使用过程中没法根据自己的想法做变换。

为了解决这个问题,我决定画点时间来整理下ggplot2的系统用法。

本文主要使用经典的mtcars数据集和diamonds数据集子集为例来画图。

环境载入:

rm(list = ls())
options(stringAsFactors = F)
#install.packages("ggplot2")
library(ggplot2)
set.seed(1234)

mtcars <- mtcars
data(diamonds)
diamond <- diamonds[sample(nrow(diamonds), 2000), ]

本文参考:

  • ggplot2|详解八大基本绘图要素:https://zhuanlan.zhihu.com/p/77875382

1. 学习逻辑

本文将从ggplot2的七大基本要素逐步介绍这个强大的R可视化包。

  • 数据(Data)和映射(Mapping)

  • 几何对象(Geometric)

  • 标尺(Scale)

  • 统计变换(Statistics)

  • 坐标系统(Coordinante)

  • 分面(Facet)

  • 主题(Theme)

当然,最后也会补充一些画图常常需要用到的小技巧,例如x轴label的旋转、添加辅助线等等。

2. 数据(data) 和 映射(Mapping)

映射:aes()函数是ggplot2中的映射函数, 所谓的映射即为数据集中的数据关联到相应的图形属性过程中一种对应关系, 图形的颜色,形状,分组等都可以通过通过数据集中的变量映射。

使用diamonds的数据子集作为绘图数据,克拉(carat)数为X轴变量,价格(price)为Y轴变量:

ggplot(data = diamond, mapping = aes(x = carat, y = price))

这里为什么没有结果呢?这是因为我们只告诉了ggplot我们x和y轴用什么数据来影射,但是没有告诉它要画成什么图。如果我们告诉它我们要画点图:

ggplot(data = diamond, mapping = aes(x = carat, y = price))+geom_point()

除了x和y轴坐标可以映射外,图形上每个点的颜色、形状等都可以映射:
ggplot(data = diamond) + geom_point(aes(x=carat, y=price, colour=color))# 颜色映射(左图)
ggplot(data = diamond) + geom_point(aes(x=carat, y=price, shape=cut))# 形状映射(右图)
ggplot(data = diamond) + geom_point(aes(x=carat, y=price, colour=color,shape=cut))# 颜色+映射

3. 几何对象(Geometric)

几何对象代表我们在图中实际看到的图形元素,如点、线、多边形等。数据与映射部分介绍了ggplot函数执行各种属性映射,只需要添加不同的几何对象图层,即可绘制出相应的图形。

此处介绍几种常用的几何对象:

  • geom_histogram用于直方图

  • geom_bar用于画柱状图

  • geom_boxplot用于画箱式图

3.1 直方图——提供一个连续变量,画出数据的分布

以价格(price)变量为例,且按照不同的切工填充颜色:

ggplot(diamond)+geom_histogram(aes(x=price, fill=cut))

设置position="dodge",side-by-side地画直方图:

ggplot(diamond)+geom_histogram(aes(x=price, fill=cut), position="dodge")

设置使用position="fill",按相对比例画直方图:

ggplot(diamond)+geom_histogram(aes(x=price, fill=cut), position="fill")

3.2 柱状图——提供一个分类变量,画出数据的分布

以透明度(clarity)变量为例,且按照不同的切工填充颜色,柱子的高度即为此分类下的数目

ggplot(diamond)+geom_bar(aes(x=clarity, fill=cut))

直接指定个数,需要通过stat参数,指定geom_bar按特定高度画图:

ggplot()+geom_bar(aes(x=c(LETTERS[1:5]),y=1:5), stat="identity")
3.2.1 直方图与柱状图的区分与联系
  • 直方图:把连续型的数据按照一个个等长的分区(bin)切分,然后计数画柱形图。

  • 柱状图:把分类数据,按类别计数。

3.3 箱式图

箱线图通过绘制观测数据的五数总括,即最小值、下四分位数、中位数、上四分位数以及最大值,描述了变量值的分布情况。同时箱线图能够显示出离群点(outlier),通过箱线图能够很容易识别出数据中的异常值。

按切工(cut)分类,对价格(price)变量画箱式图,再按照color变量分别填充颜色。

ggplot(diamond)+geom_boxplot(aes(x=cut, y=price,fill=color))

4. 标尺(Scale)

在对图形属性进行映射之后,使用标尺可以控制这些属性的显示方式,比如坐标刻度,颜色属性等。

ggplot2的scale系列函数有很多,命名和用法是有一定规律的。一般使用三个单词用 "_" 连接,如scale_fill_gradientscale_x_continuous 等,其规律总结如下:

  • 第一个都是scale

  • 第二个是 coloralphafillxylinetypeshapesize 等可更改的参数

  • 第三个是具体的类型,如 连续型 continuous,离散型 discrete

这里放一个简单的命名总结:

通用设置:* 可用 alpha, color, fill, linetype, shape, size替换:

scale_*_continuous():设置连续型数值
scale_*_discrete():设置离散型数值
scale_*_identity()
scale_*_manual(values = c()):更加自定义设置

x、y坐标设置

  • scale_x_date(labels = date_format("%m/%d"), breaks = date_breaks("2 weeks")):设置时间格式

  • scale_x_datetime():设置日期格式

  • scale_x_log10():将x数值转换为log10的形式

  • scale_x_reverse():x轴逆序绘制

  • scale_x_sqrt():将x数值转换为平方的形式

颜色及填充设置(离散型数据)

  • n + scale_fill_brewer(palette = "Blues"):填充为蓝色

  • n + scale_fill_grey(start = 0.2, end = 0.8, na.value = "red"):填充为红色

颜色及填充设置(连续型数据)

  • o + scale_fill_gradient( low = "red", high = "yellow"):从小到大,小的填充为红色,大的填充为黄色

  • o + scale_fill_gradient2( low = "red", hight = "blue", mid = "white", midpoint = 25):从小到大,小的填充为红色,大的填充为蓝色,中间(25)用黄色过渡

  • o + scale_fill_gradientn(colours = terrain.colors(6)):使用6个连续型颜色进行填充

图中图形点大小的设置:

  • q + scale_size_area(max = 6)

4.1 颜色标尺设置(color fill)

颜色的函数名第二个单词有 colorfill 两个,对应分组使用的颜色函数即可。

颜色标尺第三个单词选择方法

  • 离散型:在颜色变量是离散变量的时候使用,比如分类时每一类对应一种颜色

  • manual:直接指定分组使用的颜色

  • hue:通过改变色相(hue)饱和度(chroma)亮度(luminosity)来调整颜色

  • brewer:使用ColorBrewer的颜色

  • grey:使用不同程度的灰色

  • 连续型:颜色变量是连续变量的时候使用,比如0-100的数,数值越大颜色越深这样

  • gradient:创建渐变色

  • distiller:使用ColorBrewer的颜色

  • identity:使用color变量对应的颜色,对离散型和连续型都有效

4.1.1 更改离散型变量的颜色函数
  1. manual 直接指定分组使用的颜色

#左上
p1 <- ggplot(diamond)+geom_bar(aes(x=color,fill=cut))
#直接指定颜色 (右上)
p2 <- p1 + scale_fill_manual(values=c("red""blue""green","yellow","orange"))
#对应分组指定 (左下)
p3 <- p1 + scale_fill_manual(values=c("Fair" = "red""Good" = "blue""Very Good" = "green""Premium" = "orange""Ideal" = "yellow"))
#更改图例名字,对应指定并更改图例标签 (右下)
p4 <- p1 + scale_fill_manual(name="Label", values=c("red""blue""green","yellow","orange"), breaks = c("Fair""Good""Very Good","Premium","Ideal"),labels = c("一般""好""很好""高级""理想"))

p1+p2+p3+p4
  1. palette参数调用色板

library(RColorBrewer)
# scale_fill_brewer() 常用的参数有3个:
# 1. type:选择不同的颜色类型seq (sequential), div (diverging) or qual (qualitative)
# 2. palette:选择预制的色板,数字或者字符
# 3. direction:1 or -1,顺序或者逆序

# 默认使用Blues调色板中的颜色(左上)
pa = p1 + scale_fill_brewer()
#使用Greens调色板中的颜色,以字母表示 (右上)
pb = p1 + scale_fill_brewer(palette = "Greens")
#使用Greens调色板中的颜色,以数字表示 (左下)
pc = p1 + scale_fill_brewer(palette = 2)
#使用Greens调色板中的颜色,逆序表示 (右下)
pd = p1 + scale_fill_brewer(palette = 2,direction = -1)
pa + pb + pc + pd
  1. grey 使用不同程度的灰色

p <- ggplot(diamond)+geom_bar(aes(x=color,fill=cut))
# 0黑色;1白色
# 左上图,默认灰度从0.2-0.8
p1 = p + scale_fill_grey()
# 右上图灰度从1-0
p2 = p + scale_fill_grey(start=1, end=0)
p1 + p2
4.1.2 更改连续型变量的颜色函数
  1. 通过 color 指定连续型数据完成渐变色:

ggplot(diamond) + geom_point(aes(x, y,color = z))
  1. gradient 创建渐变色

#以连续数值作为渐变色映射 (左上)
p <- ggplot(diamond) + geom_point(aes(x, y,color=z))
#设置两端颜色 (中上)
p1 <- p + scale_color_gradient(low = "white", high = "black")
#展示指定标签  (右上)
p2 <- p + scale_color_gradient(low = "white", high = "black", breaks=c(3,4,5),  labels=c("a","b","c"))
#指定legend名称,并指定颜色展示范围 (左下)
p3 <- p + scale_color_gradient(name="Legend", low = "white", high = "black", limits=c(3,5))
#设置中间过渡色 (中下)
p4 <- p + scale_color_gradient2(low = "red", mid = "white", high = "blue", midpoint = 4)
#使用R预设调色板 (右下)
p5 <- p + scale_color_gradientn(colours =rainbow(10))

p + p1 + p2 + p3 + p4 + p5
  1. distiller 使用ColorBrewer的颜色

#以连续数值作为渐变色映射 (左)
p <- ggplot(diamond) + geom_point(aes(x, y,color=z))
#中
p2 <- p + scale_color_distiller(palette = "Spectral")
#右
p3 <- p + scale_color_distiller(palette = "Greens")

p + p2 + p3

4.2 坐标轴标尺修改(x , y)

本部分主要是对坐标轴做如下改变,

  • 更改坐标轴名称

  • 更改x轴上标数的位置和内容

  • 显示对一个轴做统计变换

  • 只展示一个区域内的点

  • 更改刻度标签的位置

实现上面的这些可以使用 scale_x 等函数,同时像 xlab 这样的函数实现其中某一方面的功能,但是用起来更加方便

因为这里的数据也有连续和之分,所以也要使用不同的函数来实现。

  1. x坐标是离散变量,y坐标是连续变量:修改x轴

# x坐标是离散变量,y坐标是连续变量
p <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_point()
# 更改坐标轴名称
p2 <- p + scale_x_discrete(name = "cyl")
# 更改横轴标度名称
p3 <- p + scale_x_discrete(labels = c("4"="a","6"="b","8"="c"))
# 指定横轴顺序以及展示部分
p4 <- p + scale_x_discrete(limits=c("6","4"))

p + p2 + p3 + p4
  1. x坐标是离散变量,y坐标是连续变量修改y轴

# 更改坐标轴名称
p1 <- p + scale_y_continuous(name="ylab_mpg")
# 指定横轴展示部分
p2 <- p + scale_y_continuous(breaks = c(10,20,30))
# 更改横轴标度名称
p3 <- p + scale_y_continuous(breaks = c(10,20,30), labels=c("$10","$20","$30"))
# 限定定横轴展示部分
p4 <- p + scale_y_continuous(limits = c(10,20))

p1 + p2 + p3 + p4
  1. x坐标是离散变量,y坐标是连续变量修改y轴变换

# 纵坐标翻转,小数在上面,大数在下面
p + scale_y_reverse()
  1. 更改刻度标签的位置

p + scale_x_discrete(position = "top") +  scale_y_continuous(position = "right")
4.2.1 一些简单偷懒的方法
p <- ggplot(mtcars, aes(factor(cyl), mpg)) + geom_point()
# 使用更简单易用 的函数
p + xlab("cyl")
p + labs(x = "cyl")
p + ggtitle("ggtitle",subtitle = "subtitle")
p + xlim(c("4","6"))

5. 统计变换(Statistics)

ggplot2提供了多种统计变换方式,此处介绍两种较常用的。

5.1 stat_summary

要求数据源的y能够被分组,每组不止一个元素, 或增加一个分组映射,即aes(x= , y = , group = )

g <- ggplot(mtcars,aes(x=cyl, y=mpg)) + geom_point()
# 计算最大值,以点显示
p1 <- g + stat_summary(fun = "max", color = "red", size = 2, geom = "point")
# 计算最小值,以线显示
p2 <- g + stat_summary(fun = "min", color = "red", size = 0.6, geom = "line")
# 计算均值,以点显示
p3 <- g + stat_summary(fun = "mean", color = "red", size = 2, geom = "point")
# 计算中位值,以点显示
p4 <- g + stat_summary(fun = "median", color = "red", size = 2, geom = "point")

p1+p2+p3+p4

5.2 stat_smooth

对原始数据进行某种统计变换计算,然后在图上表示出来,例如对散点图上加一条回归线。

p <- ggplot(mpg, aes(displ, hwy))+geom_point()
# 默认loess拟合,默认有置信区间
p1 <- p+stat_smooth()
# 使用线性拟合,去除置信区间
p2 <- p+stat_smooth(method = lm, se = F)

p+p1+p2

6. 坐标系统(Coordinante)

坐标系统控制坐标轴,可以进行变换,例如XY轴翻转,笛卡尔坐标和极坐标转换,以满足我们的各种需求。

6.1 coord_flip() 实现坐标轴翻转

p <- ggplot(diamond)+geom_bar(aes(x=cut, fill=cut))
# x和y轴翻转
p1 <- p + coord_flip()
p/p1

6.2 coord_polar()实现极坐标转换

p <- ggplot(diamond)+geom_bar(aes(x=cut, fill=cut))
# x和y轴翻转
p1 <- p + coord_polar(theta="y")
p+p1

或者,我们稍微调整下参数,就可以得到同心圆图了:

p <- ggplot(diamond)+geom_bar(aes(x=cut, fill=cut))
# x和y轴翻转
p1 <- p + coord_polar(theta="y")
p+p1

如果我们只看一个数据,就可以得到饼图:

p <- ggplot(diamond)+geom_bar(aes(x=1, fill=cut))
# x和y轴翻转
p1 <- p + coord_polar(theta="y")
p+p1

7. 分面(Facet)

这部分比较简单,用一张图概括知识点:

  • facet_wrap:基于一个因子进行设置,可以自由设置具体分为几行(nrow)几列(ncol

  • facet_grid:基于两个因子进行设置,形式为:变量~变量(行~列)。如果把一个因子用点表示,也可以达到facet_wrap的效果,也可以用加号设置成两个以上变量

一些常用的参数:

  • scalesfixed 表示固定坐标轴刻度,free 表示反馈坐标轴刻度,也可以单独设置成 free_xfree_y

  • nrow:分成几行

  • ncol:分成几列

然后我们简单实践下:

p <- ggplot(mpg, aes(cty, hwy)) + geom_point()
p1 <- p + facet_grid(. ~ fl)
p2 <- p + facet_grid(year ~ .)
p3 <- p + facet_grid(year ~ fl)
p4 <- p + facet_wrap(~ fl)
p1+p2+p3+p4

8. 主题(Theme)

ggplot画图之后,需要根据需求对图进行进一步的美化,我们可以通过ggplot的主题进行修改图形的细节。

主题涉及到2个部分:

8.1 theme 参数

我们先画一个原始的图:

# 绘制初始图形
p <- ggplot(data = diamond) +
  geom_point(aes(x=carat, y=price, colour=color,shape=cut)) + 
  labs(title="学习ggplot2可视化",subtitle = "参数好多学不会?",caption = "熟能生巧")
p

然后我们可以对 theme() 函数进行探索。

theme() 有大量参数,可以实现更改图形外观的大多数要求,有四种主要类型:

  1. element_text():使用 element_text() 函数设置基于文本的组件,如title,subtitle 和caption等。

  2. element_line():使用 element_line() 设置基于线的组件,如轴线,主网格线和次网格线等。

  3. element_rect():使用 element_rect() 修改基于矩形的组件,如绘图区域和面板区域的背景。

  4. element_blank():使用 element_blank() 关闭显示的主题内容

8.1.1 修改标题,坐标轴

由于绘图和轴标题是文本组件,使用 element_text() 参数修改。

  1. 设置title的尺寸,颜色,线高,位置

p1 <- p + theme(plot.title=element_text(size=20,
                                        face="bold",
                                        color="skyblue"#颜色
                                        hjust=0.5#调整位置,正中间
                                        lineheight=1.2))
p + p1
  1. 设置subtitle和caption

p1 <- p + theme(plot.subtitle=element_text(size=15,
                                           face="bold",
                                           color = "red",
                                           hjust=0.5),  # subtitle
                plot.caption=element_text(size=15))  # caption
p + p1
  1. 修改坐标轴

p1 <- p + theme(axis.title.x=element_text(vjust=1,  
                                          size=20),  # X axis title
                axis.title.y=element_text(size=10,
                                          color = "blue"),  # Y axis title
                axis.text.x=element_text(size=10,
                                         angle = 45,
                                         color = "red",
                                         vjust=.5),  # X axis text
                axis.text.y=element_text(size=10))  # Y axis text
p + p1

以上示例涵盖了一些常用的主题修改,其中

  • vjust,控制标题(或标签)和绘图之间的垂直间距

  • hjust,控制水平间距。将其设置为 0.5 将标题居中

  • face,设置字体(“plain”,“italic”,“bold”,“bold.italic”)

8.1.2 修改图例

图例的关键是像元素一样的图形,因此使用 element_rect() 函数进行设置。

  1. 设置图例标题,文本和键的样式:

p + theme(legend.title = element_text(size=15, color = "firebrick"),
          legend.text = element_text(size=10),
          legend.key=element_rect(fill='green'))
  1. 删除图例和更改图例位置:

p1 <- p + theme(legend.position="None") + labs(subtitle="No Legend")

p2 <- p + theme(legend.position="bottom", legend.box = "horizontal") + labs(subtitle="Legend bottom")

p3 <- p + theme(legend.title = element_text(size=12, color = "salmon", face="bold"),
          legend.justification=c(1,0),
          legend.position=c(0.950.05),  
          legend.background = element_blank(),
          legend.key = element_blank()) +
  labs(subtitle="Legend: Bottom-Right Inside the Plot")

p / p1 / p2 / p3
legend
8.1.3 修改绘图背景,主轴和次轴
  1. 更改绘图背景

p1 <- p + theme(panel.background = element_rect(fill = 'grey80'),
                plot.background=element_rect(fill="khaki"),
                plot.margin = unit(c(3211), "cm")) +  #设置绘图区域距离边的据类,上,右,下,左
  labs(title="Modified Background", subtitle="Change Plot Margin")

p + p1
  1. 更改主次网格线以及X,Y坐标轴

p1 <- p + theme(
  panel.grid.major = element_line(colour = "burlywood", size=1.5),
  panel.grid.minor = element_line(colour = "tomato",
                                  size=0.25,
                                  linetype = "dashed"),
  axis.line.x = element_line(colour = "darkorange",
                             size=1.5,
                             lineend = "butt"),
  axis.line.y = element_line(colour = "skyblue",
                             size=1.5)) +
  labs(subtitle="Change Major and Minor grid, Axis Lines")

p + p1
  1. 删除主,次网格线,边框,轴标题,文本和刻度

p1 <- p + theme(panel.grid.major = element_blank(), #主网格线
                panel.grid.minor = element_blank(), #次网格线
                axis.title = element_blank(),  #轴标题
                axis.text = element_blank(), # 文本
                axis.ticks = element_blank()) + # 坐标轴上对应label的小虚线
  labs(title="Modified Background", subtitle="Remove major and minor axis grid, axis title, text and ticks")

p + p1

8.2 相关主题

8.2.1 ggplot2默认主题
p <- ggplot(mtcars, aes(x = mpg, y = hp)) + #制定数据,对数据进行映射
  geom_point() + #散点图图层
  geom_smooth(method = lm) # 添加拟合曲线

p1 <- p + labs(title="默认主题")
p2 <- p + theme_bw() + labs(title="theme_bw")
p3 <- p + theme_test() + labs(title="theme_test")
p4 <- p + theme_classic() + labs(title="theme_classic")
p5 <- p + theme_dark() + labs(title="theme_dark")
p6 <- p + theme_gray() + labs(title="theme_gray")
p7 <- p + theme_light() + labs(title="theme_light")
p8 <- p + theme_linedraw() + labs(title="theme_linedraw")
p9 <- p + theme_minimal() + labs(title="theme_minimal")
p10 <- p + theme_void() + labs(title="theme_void")

(p1+p2) / (p3+p4) / (p5+p6) / (p7+p8) / (p9+p10)
ggplot2_theme
8.2.2 扩展包主题
  1. ggthemes 包的主题:

library(ggthemes)
p <- ggplot(mtcars, aes(x = mpg, y = hp)) + #制定数据,对数据进行映射
  geom_point() + #散点图图层
  geom_smooth(method = lm) # 添加拟合曲线

p1 <- p + theme_base() + labs(title="theme_base")
p2 <- p + theme_calc() + labs(title="theme_calc")
p3 <- p + theme_clean() + labs(title="theme_clean")
p4 <- p + theme_economist() + labs(title="theme_economist")
p5 <- p + theme_economist_white() + labs(title="theme_economist_white")
p6 <- p + theme_excel() + labs(title="theme_excel")
p7 <- p + theme_excel_new() + labs(title="theme_excel_new")
p8 <- p + theme_few() + labs(title="theme_few")
p9 <- p + theme_fivethirtyeight() + labs(title="theme_fivethirtyeight")
p10 <- p + theme_foundation() + labs(title="theme_foundation")
p11 <- p + theme_gdocs() + labs(title="theme_gdocs")
p12 <- p + theme_hc() + labs(title="theme_hc")
p13 <- p + theme_igray() + labs(title="theme_igray")
p14 <- p + theme_map() + labs(title="theme_map")
p15 <- p + theme_pander() + labs(title="theme_pander")
p16 <- p + theme_par() + labs(title="theme_par")
p17 <- p + theme_solarized() + labs(title="theme_solarized")
p18 <- p + theme_solarized_2() + labs(title="theme_solarized_2")
p19 <- p + theme_solid() + labs(title="theme_solid")
p20 <- p + theme_stata() + labs(title="theme_stata")
p21 <- p + theme_tufte() + labs(title="theme_tufte")
p22 <- p + theme_wsj() + labs(title="theme_wsj")

(p1+p2) / (p3+p4) / (p5+p6) / (p7+p8) / (p9+p10) / (p11+p12) / (p13+p14) / (p15+p16) / (p17+p18) / (p19+p20) / (p21+p22)
ggthemes_theme
  1. cowplot 包的主题:

p1 <- p + theme_cowplot() + labs(title="theme_cowplot")
p2 <- p + theme_minimal_grid() + labs(title="theme_minimal_grid")
p3 <- p + theme_minimal_hgrid() + labs(title="theme_minimal_hgrid")
p4 <- p + theme_nothing() + labs(title="theme_nothing")

(p1+p2) / (p3+p4)
cowplot_theme

9. 其他小知识

9.1 多张图合并

方法1:画布分割

# 画布分割为1行2列
split.screen(c(12))
# 第1个位置画图
screen(1)
plot(diamond$carat, diamond$price)
# 第2个位置画图
screen(2)
plot(diamond$carat, diamond$table)
# 结束绘图
dev.off()

方法2:patchwork包

library(patchwork)
p1 <- ggplot(data = diamond)+geom_point(aes(x=carat, y=price, colour=color))
p2 <- ggplot(data = diamond) +geom_point(aes(x=carat, y=price, shape=cut))
p1+p2

方法3:ggpubr包

library(ggpubr)
p1 <- ggplot(data = diamond)+geom_point(aes(x=carat, y=price, colour=color))
p2 <- ggplot(data = diamond) +geom_point(aes(x=carat, y=price, shape=cut))
ggarrange(p1, p2, ncol = 2, nrow = 1

9.2 额外添加直线

geom_abline(slope, intercept)
geom_hline(yintercept)
geom_vline(xintercept)
# 其他设置
    # 颜色:
colour = "red"
    # 粗细
size = 1
  • geom_abline:添加斜线,参数 slope 表示斜率,intercept 表示截距

  • geom_hline:添加水平线,参数 yintercept 表示y轴截距或直线所在位置

  • geom_vline:添加垂直线,参数 xintercept 表示x轴截距或直线所在位置

9.2.1 设置为虚线
geom_abline(linetype="dashed")

9.3 坐标轴中间设置中断

library(ggbreak)
ggplot(dat)+
  geom_bar(aes(x=x,y=y),stat="identity")+
  scale_y_break(c(14))

9.4 改变字体大小

9.4.1 倍数改变
# 主要依赖于rel()函数完成大小倍数的调整
theme(axis.text   = element_text(size = rel(0.8)), # 字体大小
      strip.text  = element_text(size = rel(0.8)),# 刻面标题
      legend.text = element_text(size = rel(0.8)),# legend字体
      plot.title  = element_text(size = rel(1.2)),# title字体
      panel.grid.minor = element_line(size = rel(0.5)),# 线段大小
      axis.text.x = element_text(size = rel(1.2)),# x轴刻度标签文本
      axis.text.y = element_text(size = rel(1.2)),# y轴刻度标签文本
      axis.title.x = element_text(size = rel(1.2)),# x轴刻度标题文本
      axis.title.y = element_text(size = rel(1.2)))# y轴刻度标题文本
9.4.2 指定具体大小
# 直接指定文字大小
theme(axis.text   = element_text(size = 5.5), # 字体大小
      strip.text  = element_text(size = 5.5),# 刻面标题
      legend.text = element_text(size = 5.5),# legend字体
      plot.title  = element_text(size = 5),# title字体
      panel.grid.minor = element_line(size = 2),# 线段大小
      axis.text.x = element_text(size = 5),# x轴刻度标签文本
      axis.text.y = element_text(size = 5),# y轴刻度标签文本
      axis.title.x = element_text(size = 5),# x轴刻度标题文本
      axis.title.y = element_text(size = 5))# y轴刻度标题文本

9.5 坐标轴上label旋转

# x轴刻度标签文本旋转45度,hjust用于设置水平对齐方式(1顶部,0.5中间,0底部),vjust用于设置垂直对齐方式(0左,0.5中,1右)。
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
      axis.text.y = element_text(angle = 45, hjust = 1, vjust = 1))

9.6 图片上特定地方添加字母label

# 使用R包
library(ggrepel)
ggplot(dat,aes(x=x,y=y))+
  geom_bar(stat="identity")+
  geom_label_repel(label=dat$labels)

# 使用ggplot2自带函数
ggplot(dat,aes(x=x,y=y))+
  geom_bar(stat="identity")+
  geom_text(label=dat$labels,nudge_x=-0.2,size=5)

后记

后续再做补充~


原文链接