「R」数据可视化16:哑铃图

2020-07-03 12:07:35 浏览数 (1)

哑铃图(Dumbbell Chart)就像它的名字一样,长得像一个哑铃。当然当你有多个节点的时候,它们还有点像DNA,所以也有人把这种图形称为DNA图。哑铃图是一种很好的可视化方式,比如你想要表征不同指标的不同组的情况你可以用多个“哑铃”表示。另外,你想要表示某一组在外界刺激后的变化情况也可以用这种方式。

我们来看两个例子。第一个例子中比较了成年人和青少年在使用视频游戏设备方面的差异。很直观的可以看到青少年比成年人频率更高,同时在不同设备的使用频率也能看到明显差异。第二个例子,分别显示了最低价格,中间的价格和最高价格,可以看到不同项目的花费差异。

那么在生物研究中我们可以用于表示哪些数据呢?最简单的,当然是有多个指标的时候,我们可以用于显示对照组和实验组的差异。或者是男女之间的差异等等。当然,如果你想显示给予一些刺激,比如用药前后指标的变化,这也是一个选择。另外,现在有很多是多组学的数据,我们会统计志愿者的年龄,或者展示某些生理指标的范围等,所以我们也可以考虑第二个例子,用哑铃图进行展示,这样可能会比图标看起来更加直观一些,也显得更加美观。

怎么做哑铃图

使用ggalt包或者plotly包就可以实现哑铃图的制作。我们选择使用ggalt包(该包基于ggplot2包)。

1)需要什么格式的数据

这次使用一个不同学校男女年收入(单位:千美元)的数据。具体如下:

代码语言:javascript复制
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)如何作图

代码语言:javascript复制
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

当然还可以,进一步修改,比如:添加一个外环

代码语言:javascript复制
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的人数:

代码语言:javascript复制
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)")

也可以换一个风格:

代码语言:javascript复制
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)")

还可以加入平均值:

代码语言:javascript复制
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添加一下图例哦

往期精彩:

  • 「R」数据可视化15:倾斜图
  • 「R」数据可视化14: 瀑布图
  • 「R」数据可视化13 : 相关性图
  • 「R」数据可视化12 : 生存曲线
  • 「R」数据可视化11:PCA和PCoA图
  • 「R」数据可视化10:面积图
  • 「R」数据可视化9: 金字塔图和偏差图
  • 「R」数据可视化8:棒棒图
  • 「R」数据可视化7 : 蜜蜂图
  • 「R」数据可视化6 : 曼哈顿图
  • 「R」数据可视化5 : 气泡图
  • 「R」数据可视化4 : 直方图/条形图
  • 「R」数据可视化3 : 热图
  • 「R」数据可视化2 : 箱形图
  • 「R」数据可视化1: 火山图

0 人点赞