散点图,是一种常见的展示2组及以上连续变量关系的可视化方式之一。本文主要介绍如何给普通的散点图“镶边”——添加边际图。我们知道R作图思路就是一层一层的叠加上去,同理可得绘制一个如下所示的图,我们也应该是先定位X、Y轴,再绘制一个散点图,最后叠加上一个边际图。
01.涉及的R包
1.ggplot2
最常用也是最万能的绘图R包。
2.ggExtra
用于给散点图添加边际图。
3.hexbin
hexbin包的hexbin函数应用于数据量太大、且有数据重叠、普通散点图可视化效果变差的情况。
02.开始画图
1.载入R包
install.packages("ggExtra")
install.packages("hexbin")
library(ggExtra)
library(hexbin)
library(ggplot2)
2.绘制散点图
本文数据以R自带的diamonds数据为例,散点图的基本语法如下,数据集、X轴、Y轴,最后是散点层。
p <- ggplot(data=diamonds, mapping = aes(x = carat,y = price)) +
geom_point(shape=19 ,alpha = .5,size=1.5)
一个最基础不加任何修饰的散点图就绘制好了,接下来要做的工作就是思考如何美化它。当数据量特别大,散点都堆叠在一起,很多区域很难辨识,我们可以考虑使用hexbin函数绘制高密度散点图。hexbin函数将二元变量的封箱放到六边形单元格中,且通过图例颜色标定每一个区域数据点的数量颜色越深则散点密度越大。
p <- ggplot(data=diamonds,mapping = aes(x = carat,y = price)) +
geom_point(shape=19 ,alpha = .01,size=0.5)+
stat_binhex()
调整图片的细节
p <- ggplot(data=diamonds,mapping = aes(x = carat,y = price)) +
geom_point(shape=19 ,alpha = .01,size=0.5)+
stat_binhex()+
scale_fill_gradient(low = "lightblue", high = "red",limits =c(0,6000)) + #设置映射颜色和图例尺度
theme_bw() +
theme(
legend.position = "left", #调整图例的位置
axis.title = element_text( family = "sans",size = 17,face = "bold",color = "gray25"),#设置X、Y轴标题字体、大小以及颜色
axis.text = element_text( family = "sans",size = 15,face = "bold"), #设置X、Y轴标签字体、大小以及颜色
title = element_text( family = " sans ",size = 20,face = "bold"), #设置图片标题的字体、大小以及颜色
plot.title = element_text(margin = margin(t = 10, b = 10)),#控制标题与图表之间的距离
axis.title.x = element_text(margin = margin(t = 15),family = "sans"),
axis.title.y = element_text(margin = margin(r = 15) ,family = "sans"),#调整X、Y轴标题距离绘图区的距离
legend.title = element_blank(), #去除图例的标题
panel.border = element_rect( linetype = "solid", size = 2,color = "gray50") #绘图区外框颜色、线型以及粗细
) +
labs(title="Add marginal to scatter",hjust=0.5) + xlab("carat") + yl
ab("price") #添加标题
3.添加边际图
边际图是叠加在散点图上的,它有多个类型可供选择。
参数解读:
p:之前绘制好的散点图
type:添加的边际图类型
density:密度曲线
histogram:直方图
boxpot:箱线图
violin:小提琴图
densigram:密度图与直方图的结合
margins:边际图添加在哪一方向
both:X、Y轴都添加
X:只添加X轴
Y:只添加Y轴
size:主图与边际图的比例关系
fill:填充颜色
color:描边颜色
p1 <- ggMarginal(p, type ="densigram", margins = "both", fill="#A7B9D7", color="steelblue")
一副完整的散点图加边际图就绘制好了。边际图也可以根据需要尝试各样的类型:
只添加X轴的密度图
ggMarginal( p, type = "density", margins = "x", fill = "#A7B9D7", color="steelblue")
只添加Y轴的小提琴图
ggMarginal( p, type = "violin", margins = "y", fill = "red", color="steelblue" )