ggplot2画散点图拼接密度图
2020-11-29 本文已影响0人
小明的数据分析笔记本
image.png
前几天有一个读者在公众号留言问上面这幅图应该如何实现,我想到一个办法是利用ggplot2分别画散点图和密度图,然后利用aplot包来拼图,aplot包是ggtree的作者新开发的一个包,非常重要的一个作用就是解决拼图的时候坐标轴对齐的问题。这个aplot包的用法大家可以在微信搜索里直接搜aplot就可以直接找到原作者写的推文的介绍,而且这个公众号经常推送R语言的学习内容,非常好,作者是真正的大神级别的人物了。
今天的内容主要参考了微信文章
好了下面就开始介绍具体的实现过程
首先是模拟数据
生成两列符合正态分布的数据,然后组合成一个数据框
x<-rnorm(500,0,1)
y<-rnorm(500,0,2)
df<-data.frame(x=x,y=y)
head(df)
先做一个简单的散点图
ggplot(df,aes(x=x,y=y))+
geom_point()
image.png
按照Y轴的范围填充三个颜色,比如大于3填充一个,小于-3填充另外一种,-3到3中间的填充另外一种
给数据添加一列新的用来映射颜色
df$color<-ifelse(df$y>3,"A",
ifelse(df$y<(-3),"B","D"))
head(df)
画图
ggplot(df,aes(x,y))+
geom_point(aes(color=color))+
scale_color_manual(values=c("green","blue","grey"))+
theme_bw()
image.png
接下来是添加辅助线
ggplot(df,aes(x,y))+
geom_point(aes(color=color))+
scale_color_manual(values=c("green","blue","grey"))+
theme_bw()+
geom_hline(yintercept = -3,lty="dashed")+
geom_hline(yintercept = 3,lty="dashed")+
geom_vline(xintercept = -2,lty="dashed")
image.png
接下来是密度图
ggplot(df,aes(x))+
geom_density(fill="grey",alpha=0.5)+
scale_y_continuous(expand = c(0,0))+
theme_minimal()+
theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank())
image.png
y轴的密度分布也是这样画,下面就不重复了
接下来是拼图
library(ggplot2)
library(aplot)
p1<-ggplot(df,aes(x,y))+
geom_point(aes(color=color))+
scale_color_manual(values=c("green","blue","grey"))+
theme_bw()+
geom_hline(yintercept = -3,lty="dashed")+
geom_hline(yintercept = 3,lty="dashed")+
geom_vline(xintercept = -2,lty="dashed")
p2<-ggplot(df,aes(x))+
geom_density(fill="grey",alpha=0.5)+
scale_y_continuous(expand = c(0,0))+
theme_minimal()+
theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank())
p3<-ggplot(df,aes(y))+
geom_density(fill="grey",alpha=0.5)+
scale_y_continuous(expand = c(0,0))+
theme_minimal()+
theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank())+
coord_flip()
p1%>%
insert_top(p2,height = 0.5)%>%
insert_right(p3,0.5)
image.png
遇到的问题是:如何给密度图的右下角的一部分填充另外一个颜色,这个我暂时还不知道如何实现?大家如果知道如何实现欢迎留言呀!
欢迎大家关注我的公众号
小明的数据分析笔记本