R绘图系列-散点图

这篇文章学习了R中散点图的画法,主要包括针对点的属性如颜色、形状和大小的设置针对分组变量使用不同的形状给点添加border以及针对散点太密集出现重叠的两种解决方法

数据

1
2
3
4
5
6
7
8
9
10
11
data("mtcars")
df <- mtcars
df$cyl <- as.factor(df$cyl)
head(df)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

普通散点图

1
ggplot(df, aes(x = wt, y = mpg)) + geom_point()

ggplot_point_basic.png


设置点的属性

点的属性可以包括:颜色大小形状

1
2
3
4
ggplot(df, aes(x = wt, y = mpg)) + 
geom_point(color = "#00AFBB",
size = 2,
shape = 23)

ggplot_point_property.png

R语言中点的形状可以包括25种

ggplot_point_shape_all.png

更多的形状可以参考ggsymbol

ggplot_point_shape_ggsymbol.png


针对分组变量

1
2
3
4
ggplot(df, aes(x = wt, y = mpg)) + 
# 使用不同的形状以及颜色来表示不同的分组
geom_point(aes(shape = cyl, color = cyl)) +
scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

ggplot_point_group.png


添加border

1
2
3
4
5
# 这里不同的颜色要用fill
# 设置pch=21
ggplot(df, aes(x = wt, y = mpg, fill=cyl)) +
geom_point(pch=21,color="red",size=4) +
scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

ggplot_point_border.png


去除size为0的点

1
2
3
4
5
6
7
8
9
10
11
12
Dates = c("2015-05-01", "2015-05-02", "2015-05-03", "2015-05-04", "2015-05-05", "2015-05-06")
Dates = as.Date(Dates)
Series1 = c(0,2,8,5,3,1)
Series2 = c(0,0,5,0,10,5)
df = data.frame(Dates, Series1, Series2)

# 将range最小值设置为-1即可在图中去除size为0的显示
# 结合break来控制legend的信息
ggplot(data = df) +
geom_line(aes(x = Dates, y = Series1))+
geom_point(aes(x = Dates, y = Series1, size = Series2))+
scale_size_continuous(range = c(-1, 5), breaks = seq(2.5, 10, 2.5))

针对散点存在重叠

画散点图的时候可能会遇到点非常密集(某一个横坐标对应很多很密集的纵坐标),这样会导致本来想查看的一些数据属性丢失,针对这种情况有两种解决方法:

  • jitter图:给点在一定范围内增加抖动,让点分散一些
  • counts图:用点的大小表示某个范围重叠的点的数目

jitter图

1
2
3
4
# 突然发现两个ggplot对象相加可以实现子图的效果
ggplot(mpg, aes(displ, hwy)) + geom_point() +
ggplot(mpg, aes(displ, hwy)) +
geom_point(position = position_jitter(width = 0.5, height = 0.5))

ggplot_point_jitter.png


点的大小表示重叠的数目

1
2
3
ggplot(mpg, aes(displ, hwy)) + geom_point() + 
ggplot(mpg, aes(displ, hwy)) +
geom_count()

ggplot_point_count.png

更多相关设置可以参考:


嵌套if-else语句

针对不同的分组,如果想采取不同的显示方式可以在绘图语句中嵌套if-else语句。具体示例参考自制dotplot中的color=ifelse(df$Tissue == "Monkey2", "blue", "black"),该语句针对Monkey1和Monkey2进行了不同的颜色区分。


自制dotplot

数据

1
2
3
4
5
6
7
8
9
10
11
12
# 查看数据
head(immune_genes)
# A tibble: 6 x 6
# Groups: GeneName [1]
NewStrClusterWithPosition GeneName AverageExp FractionExp Tissue ScaleExp
<fct> <fct> <dbl> <dbl> <chr> <dbl>
1 SMC_17|Trachea_1 IL6 0.133 0.125 Monkey1 0.930
2 SMC_17|Trachea_2 IL6 0.318 0.222 Monkey2 3.00
3 EC_12|Trachea_1 IL6 0 0 Monkey1 -0.557
4 EC_12|Trachea_2 IL6 0.217 0.143 Monkey2 1.87
5 Fib_10|Trachea_1 IL6 0 0 Monkey1 -0.557
6 Fib_10|Trachea_2 IL6 0.0869 0.0857 Monkey2 0.416

绘图函数

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
dotplot_own=function(df,title='Dotplot'){
# 这一部分是关键,主要是区分fill、color
p=ggplot(df,aes(x = NewStrClusterWithPosition, y = GeneName,
size = FractionExp,fill=ScaleExp,
# 这里很关键,区分Monkey1和Monkey2,针对两种使用了不同的方法
color=ifelse(df$Tissue == "Monkey2", "blue", "black")))+
geom_point(pch=21) +
theme_bw()+
coord_flip()+
theme(axis.text.x = element_text(size=8,angle=90, hjust=0.5, vjust=0.5))+
scale_size_continuous(labels = function(x) paste0(x*100, "%"),
range=c(0,6)) +
scale_fill_gradient2(low = "black", mid = "#A9A9A9", high = "red",breaks=c(-2,0,2,4)) +
# 自定义legend的信息,需要结合前面的color
scale_colour_manual(name = 'Tissue',
values =c('black'='black','blue'='blue'),
labels = c('Monkey1','Monkey2')) +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
labs(y="GeneName",x="CellType&Tissue",title = title) +
theme(axis.text.y = element_text(face="bold"),
axis.text.x = element_text(face="bold"),
plot.title = element_text(hjust = 0.5)) +
guides(size = guide_legend(title.hjust = 0.5,order=1),
fill = guide_colorbar(title.hjust = 0.5,order=2),
color = guide_legend(title.hjust = 0.5,order=3,override.aes = list(size=4)))
return(p)
}

dotplot_own(immune_genes)

ggplot2_own_dotplot



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

本文标题:R绘图系列-散点图

文章作者:showteeth

发布时间:2020年05月18日 - 19:14

最后更新:2020年08月08日 - 21:34

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

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

0%