哑铃图(Dumbbell Chart)就像它的名字一样,长得像一个哑铃。当然当你有多个节点的时候,它们还有点像DNA,所以也有人把这种图形称为DNA图。哑铃图是一种很好的可视化方式,比如你想要表征不同指标的不同组的情况你可以用多个“哑铃”表示。另外,你想要表示某一组在外界刺激后的变化情况也可以用这种方式。
我们来看两个例子。第一个例子中比较了成年人和青少年在使用视频游戏设备方面的差异。很直观的可以看到青少年比成年人频率更高,同时在不同设备的使用频率也能看到明显差异。第二个例子,分别显示了最低价格,中间的价格和最高价格,可以看到不同项目的花费差异。
那么在生物研究中我们可以用于表示哪些数据呢?最简单的,当然是有多个指标的时候,我们可以用于显示对照组和实验组的差异。或者是男女之间的差异等等。当然,如果你想显示给予一些刺激,比如用药前后指标的变化,这也是一个选择。另外,现在有很多是多组学的数据,我们会统计志愿者的年龄,或者展示某些生理指标的范围等,所以我们也可以考虑第二个例子,用哑铃图进行展示,这样可能会比图标看起来更加直观一些,也显得更加美观。
使用ggalt包或者plotly包就可以实现哑铃图的制作。我们选择使用ggalt包(该包基于ggplot2包)。
1)需要什么格式的数据
这次使用一个不同学校男女年收入(单位:千美元)的数据。具体如下:
dat <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/school_earnings.csv")
head(dat)
School Women Men Gap
1 MIT 94 152 58
2 Stanford 96 151 55
3 Harvard 112 165 53
4 U.Penn 92 141 49
5 Princeton 90 137 47
6 Chicago 78 118 40
一共统计了21所美国高校,包括哈佛、斯坦福、MIT等。
2)如何作图
library(ggplot2)
library(ggalt)
ggplot(aes(x=Women,xend=Men,y=School),data=dat)+
geom_dumbbell(colour_x = "#FFB6C1",colour_xend = "#4169E1",size_x = 2,size_xend = 2,size=0.5,color="gray")+
theme_light()+
theme(panel.grid.minor.x =element_blank(),
)+
xlab("Annual Salary (in thousands)")
image.png
当然还可以,进一步修改,比如:添加一个外环
library(ggplot2)
library(ggalt)
ggplot(aes(x=Women,xend=Men,y=School),data=dat)+
geom_dumbbell(colour_x = "#FFB6C1",colour_xend = "#4169E1",size_x = 2,size_xend = 2,size=0.5,color="gray")+
geom_point(aes(x=Women,y=School,size=Women),alpha=0.5,color="#FFB6C1")+
geom_point(aes(x=Men,y=School,size=Men),alpha=0.5,color="#4169E1")+
theme_light()+
theme(panel.grid.minor.x =element_blank(),
legend.position = c("none")
)+
xlab("Annual Salary (in thousands)")
又比如再加入Gap的人数:
library(ggplot2)
library(ggalt)
ggplot(aes(x=Women,xend=Men,y=School),data=dat)+
geom_dumbbell(colour_x = "#FFB6C1",colour_xend = "#4169E1",size_x = 2,size_xend = 2,size=0.5,color="gray")+
geom_point(aes(x=Women,y=School,size=Women),alpha=0.5,color="#FFB6C1")+
geom_point(aes(x=Men,y=School,size=Men),alpha=0.5,color="#4169E1")+
geom_point(aes(x=Gap,y=School),color="#9ACD32",shape=2)+
theme_light()+
theme(panel.grid.minor.x =element_blank(),
legend.position = c("none")
)+
xlab("Annual Salary (in thousands)")
也可以换一个风格:
library(ggplot2)
library(ggalt)
ggplot(aes(x=Women,xend=Men,y=School),data=dat)+
geom_dumbbell(colour_x = "#8B8B7A",colour_xend = "#9ACD32",size_x = 2,size_xend = 2,size=0.5,color="gray",dot_guide = T)+
theme_light()+
theme(panel.grid.minor.x =element_blank(),
panel.grid = element_blank(),
legend.position = c("none")
)+
xlab("Annual Salary (in thousands)")
还可以加入平均值:
library(ggplot2)
library(ggalt)
dat$mean<-apply(dat[,2:3],1,mean)
ggplot(aes(x=Women,xend=Men,y=School),data=dat)+
geom_dumbbell(colour_x = "#4682B4",colour_xend = "#CD2626",size_x = 3,size_xend = 3,size=0.5,color="gray",dot_guide = T)+
geom_point(aes(x=mean,y=School),color="#EE7621",size=3)+
theme_light()+
theme(panel.grid.minor.x =element_blank(),
panel.grid = element_blank(),
legend.position = c("none")
)+
xlab("Annual Salary (in thousands)")
然后可以用AI添加一下图例哦
往期精彩: