R绘图系列-常用图形以及绘制方法收集

这篇文章搜集了遇到的一些好看且实用图形的绘制方法,以备不时之需;同时也包含了对图形的各种组件进行调整的方法

各种图形绘制



error bar-line or bar plot



boxplot点连线



使用cowplot拼接图形



配色

8种颜色

1
2
"#a47729", "#b6b6b9", "#db3229","#2f9ccc",
"#74ba80","#e8ad3c","#8d6ea8","#FFB6C1"

最终效果图:
ggplot2_color_collection8.png


12种颜色

按顺序依次为:

1
2
3
"#4d81be","#173b5e","#6a521d","#48ffee",
"#dd3e00","#00b449","#e395d0","#7d7d7d",
"#56a9ce","#c8e482","#f09c4f","#7d64a1"

最终效果图:
ggplot2_color_collection1.png


16种颜色

1
2
3
4
"#4d81be","#173b5e","#6a521d","#48ffee",
"#dd3e00","#00b449","#e395d0","#7d7d7d",
"#56a9ce","#c8e482","#f09c4f","#7d64a1",
"#FFB6C1","#CD5C5C","#74ba80","#e8ad3c"

最终效果图:
ggplot2_color_collection16.png


18种颜色

1
2
3
4
5
"#f47f53","#de1e3f","#d4a0c9","#f06ca8",
"#8acdf1","#42bbec","#4b87c6","#4e69b1",
"#6e91ca","#35479d","#a43f98","#4eb847",
"#0e8040","#b8882d","#fbd605","#f9bfcc",
"#242021","#949599"

最终效果图:
ggplot2_color_collection18.png


boxplot

去除outlier

1
2
# 设置outlier.shape = NA来去除outlier的显示
geom_boxplot(outlier.shape = NA,width=0.1)

图形排布

给组合图添加标题

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
# 导入cowplot来执行图片组合功能
library(cowplot)

# 用于组合的figure1
p1 <- ggplot(mtcars, aes(x = disp, y = mpg)) +
geom_point(colour = "blue") +
theme_half_open(12) +
background_grid(minor = 'none')
# 用于组合的figure12
p2 <- ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point(colour = "green") +
theme_half_open(12) +
background_grid(minor = 'none')

# 先将p1、p2进行组合
plot_row <- plot_grid(p1, p2)

# 单独绘制一个title,后面将这个title和已经组合过的图片再进行组合
title <- ggdraw() +
draw_label(
"Miles per gallon decline with displacement and horsepower",
fontface = 'bold',
x = 0,
hjust = 0
) +
theme(
# add margin on the left of the drawing canvas,
# so title is aligned with left edge of first plot
plot.margin = margin(0, 0, 0, 7)
)

# 组合title和组合之后的图片
plot_grid(
title, plot_row,
ncol = 1,
# 0.1是设置两个图片之间的距离,数值越大两个图片越远
rel_heights = c(0.1, 1)
)

图形调整

设置labs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置labs
labs(y="Tissue&Sample",x="Cell Type",title = "title")

# 对字体等进行调整
## main title
theme(plot.title = element_text(family, face, colour, size))
## x axis title
theme(axis.title.x = element_text(family, face, colour, size))
## y axis title
theme(axis.title.y = element_text(family, face, colour, size))

#删除labs信息
## Hide the main title and axis titles
theme(
plot.title = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank())

修改坐标轴刻度名称

针对连续性变量和非连续性变量采取的方法不同,分别采用的方法为:scale_x_discrete, scale_x_continuous

针对非连续性

1
2
3
4
5
6
7
tick_name=c("a","b","c")

# 直接将vector传递给函数
p + scale_x_discrete(labels=tick_name)
# 将tick和新更改的名称对应,相当于绑定
p + scale_x_discrete(labels=c("0.5" = "a", "1" = "b",
"2" = "c"))

参考链接


修改legend

显示legend

如果想自动生成legend的话,在使用ggplot2绘图时需要将参数放入aes

1
2
3
4
5
6
7
8
9
10
11
# 这个会自动生成3个legend:size、fill、color
ggplot(test,aes(x = NewStrClusterWithPosition, y = GeneName,
size = FractionExp,fill=AverageExp,
color=ifelse(test$Tissue =="Trachea_2", "red", "black")))+
geom_point(pch=21)

# 这个就只会生成2个legend:size、fill
ggplot(test,aes(x = NewStrClusterWithPosition, y = GeneName,
size = FractionExp,fill=AverageExp
))+
geom_point(pch=21,color=ifelse(test$Tissue =="Trachea_2", "red", "black"))


删除legend

1
2
3
4
5
6
# 删除所有的legend
p + theme(legend.position = "none")

# 多个legend的情况下删除某一个
# 删除color带来的legend
p + guides(color = FALSE)

修改legend的name

如果想单纯地修改legendname可以使用labs(同时修改颜色和刻度等信息可以参考后面的内容):

1
2
3
# 这里的legend是颜色生成的legend
# 还可以是fill
labs(color="Cluster")

将legend设置为非连续的

将那一列数据设置为factor即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# named vector
anno_col
M1 (0) M1 (3) M2 (1) M2 (21) DC1 (6) DC2 (9) Fib (2) Fib (8) Fib (11) Fib (20) EC (4) EC (5)
0 0 0 0 0 0 1 0 0 1 2 2
EC (12) EC (15) EC (18) CM (7) CM (17) PC (10) SMC (19) SC (13) Epi (14) Ery (16)
0 0 0 1 0 0 0 1 1 0

# 如果直接画图
# 得到的会是一个连续的legend,也就是颜色bar
ggplot(rat_inte_condi_freq_plot_se_dot_fi, aes(x = ident,y=cluster)) +
geom_point(aes(size=relative_frac,colour=anno_col))

# 将其变为非连续的
ggplot(rat_inte_condi_freq_plot_se_dot_fi, aes(x = ident,y=cluster)) +
geom_point(aes(size=relative_frac,colour=factor(anno_col)))


设置legend的label

如果只想设置legend的label,而不想修改颜色之类的可以使用: scale_colour_hue,scale_fill_hue.

1
2
3
4
cluster_name=c("a","b","c")
# 按顺序设置
scale_colour_hue(labels=cluster_name)
# 也可以绑定设置,具体参见后面的:将颜色和分类特征绑定起来


设置legend的name、label和颜色

主要分为三种函数,用法都是相同的,只是产生legend的方法不同:scale_colour_manual(), scale_fill_manual(), scale_size_manual().

1
2
3
4
5
6
# breaks是前面设置的factor(anno_col)中得到的factor的levels
# value是设置颜色
scale_colour_manual(values = c("grey", "red", "blue"),
name="Change Type",
breaks=c("0", "1", "2"),
labels=c("Non", "up", "down"))


将颜色和分类特征绑定起来

在实际绘图中经常会遇到:通常情况下,数据颜色填充时会依据多种key,但是某些数据只有多种key中的某几种,为了适配所有的情况,将每种key预先设置颜色,然后在每个数据中,有什么key就直接使用预先设置的颜色即可

1
2
3
4
5
6
# 不能使用前面设置legend的name、label和颜色中提到的方法
# 不会生效,最终的颜色会依次调用,不会按照设置
# 如下进行类似字典的设置即可
# 多余的key和颜色对也不会出现
scale_colour_manual(values = c("up_no"="grey", "up_s"="#FF6A6A", "up_vs"="red", "down_vs"="blue","down_s"="#1E90FF","down_no"="grey"),
name="Change Type")


设置指定的break和label

有时候自动生成的legend可能比较密集,比如生成了1,2,3,4,5,6,7,8,9这种按照顺序的legend(表示图中圆点的大小),如果想减少数量的同时达到表征的意思可以只用1,4,7这种:

1
2
3
# 使用breaks参数即可
# range是指定最小的值和最大值的圆点比例
p + scale_size_continuous(name="Number",breaks = c(1,4,7),range=c(1,5))


legned字体大小和颜色

1
2
3
4
# legend.text:字体设置,可以设置颜色和大小
# legend.title:名称设置,对上面的name进行修改
theme(legend.text=element_text(size=10),
legend.title = element_text(size=10,face="bold"))

百分比显示legend label

有时候需要将点的大小表征百分比,绘图中在aes中使用size参数指定变量名即可,但是默认出来的legend是小数显示的百分比,不是很好看,这个时候可以使用如下方法进行修改:

1
2
# 这个修改label为百分比的方法可以使用在任何legend中,只要可以传递labels即可
scale_size_continuous(labels = function(x) paste0(x*100, "%"))


guide使用

guide主要是用于修改legend的信息,而legend又包括两种类型:连续型和非连续型,对这两种不同的类型,guide有不同的函数来进行设置,如果混用可能会得到意外的结果,比如如果将非连续型的用到了连续型的legend上,那么可能会使得连续型的legend被转化为非连续型的legend。

注意这个guides里面有两种设置情形,一种是guide_legend,针对离散型的legend;一种是guide_colourbar,针对连续型legend,选取的时候需要注意区分。

修改legend符号的大小

这里遇到的问题:添加了多个legend,其中一个的连续的legend,比如size,另一个是前面factor之后生成的,而只想修改factor之后生成的legend大小

1
2
3
4
5
# 这里的color是非连续型的color,通过factor可以将连续转换为非连续
# 这里的color对应于geom_point里面的colour
# 也就是修改colour对应的legend符号的大小
# 有时候需要加上alpha = 1
guides(color = guide_legend(override.aes = list(size=5)))


修改legend的顺序

如果存在多个legend,想要修改legend的顺序的话可以使用前面使用的guides进行修改:

1
2
3
4
5
6
7
# 这里的color是非连续型的color,通过factor可以将连续转换为非连续
# 同时修改了legend大小,透明度以及顺序
# order=1表示在最前面
guides(color = guide_legend(override.aes = list(size=5,alpha = 1),order = 1))

# 可以查看帮助文档
help("guides")


修改legend title的对齐方式

前面两种都是非连续型legend的设置方式,这里给一个连续型的设置方式:

1
2
3
4
# 这里的color是连续型的,1表示右对齐,0表示左对齐
# 需要注意的一点是:如果title的长度大于legend图示的长度,设置这个参数没用
# guide_colorbar对color和fill产生的连续型的都适用
guides(color = guide_colorbar(title.hjust = 1))


参考链接


去除ggplot2自动拓展的坐标轴

默认情况下,ggplot2绘制的图形会在y轴上对图像所在的区域进行一定的拓展,比如实际内容的区间是c(0,1),实际画出来的图可能是c(-1,2),虽然大部分情况下有利于实际画图内容的展示,但有时候可能会不美观,这里记录将其删除的方法:

1
2
3
# 这里的labels是将数字转化为了百分比显示
# expend是设置了上下延伸的大小
scale_y_continuous(labels = function(x) paste0(x*100, "%"),expand = c(0, 0))

默认延伸的大小

The defaults are to expand the scale by 5% on each side for continuous variables, and by 0.6 units on each side for discrete variables.


删去框线并加上坐标线

如果想删除图片的边框,并且保留x轴和y轴的坐标轴信息,可以使用如下方法:

1
2
3
4
5
6
7
8
# panel.grid.major:去除大刻度信息,也就是带有y tick的信息
# panel.grid.minor:去除小刻度信息,也就是不带y tick的框线
# panel.border:将所有的border line都去掉
# axis.line:添加axis框线
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
axis.line = element_line(colour = "black"))


删除坐标轴刻度线以及刻度值

1
2
3
4
5
6
theme(
# 删除刻度线
axis.ticks.y = element_blank(),
# 删除刻度的label,值
axis.text.y = element_blank(),
)

参考链接:


背景透明

如果想保存的图片背景是透明的可以使用如下方法。

只是设置边框为透明:

1
2
3
# 在保存图片的时候加上bg = "transparent"即可
ggsave("test.png",
plot=p,width = 16, height = 6,bg = "transparent")

设置绘图区域除图形之外的所有内容为透明(如点图只有点为非透明)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 设置绘图区域的透明
p = p + theme(
panel.background = element_rect(fill = "transparent"), # bg of the panel
plot.background = element_rect(fill = "transparent"), # bg of the plot
panel.grid.major = element_blank(), # get rid of major grid
panel.grid.minor = element_blank(), # get rid of minor grid
legend.background = element_rect(fill = "transparent"), # get rid of legend bg
legend.box.background = element_rect(fill = "transparent"), # get rid of legend panel bg
legend.key = element_rect(fill = "transparent", colour = NA), # get rid of key legend fill, and of the surrounding
axis.line = element_line(colour = "black") # adding a black line for x and y axis
)

# 如果想去除legend的黑色边框
legend.box.background = element_rect(fill = "transparent",color=NA)

# 在保存图片的时候加上bg = "transparent"即可
ggsave("test.png",
plot=p,width = 16, height = 6,bg = "transparent")

参考链接:



-----本文结束感谢您的阅读-----

本文标题:R绘图系列-常用图形以及绘制方法收集

文章作者:showteeth

发布时间:2019年11月22日 - 11:04

最后更新:2020年08月08日 - 09:58

原始链接:http://showteeth.tech/posts/6682.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%