Posted on

首先是棒棒糖图

棒棒糖图 (Lollipop Chart),其实是一种特殊的barplot,只是将bar转变成了line和dot。效果如下两图所示:

1. ggplot2实现

以mtcars数据集为例:

library(ggplot2)

data(mtcars)

mtcars$cyl <- factor(mtcars$cyl)

mtcars <- mtcars[order(mtcars$mpg), ]

mtcars$name <- rownames(mtcars)

mtcars$name <- factor(mtcars$name, levels = rownames(mtcars))

ggplot(mtcars, aes(x=name, y=mpg, color = cyl, label=mpg)) +

geom_segment(aes(y = 0,

x = name,

yend = mpg,

xend = name),

color = "gray", size=2) +

geom_point(stat='identity', size=6) +

geom_text(color="white", size=2) +

labs(title="Lollipop Chart") +

theme_bw() +

coord_flip()

可修改geom_segment(aes(y = 20))修改中间的基准线:

2. ggpubr实现
library(ggpubr)

ggdotchart(mtcars, x = "name", y = "mpg",

color = "cyl",

sorting = "ascending", # ggpubr中可以直接排序

add = "segments",

xlab=""

)

rotate转变为垂直方向,group实现分组,dot.size修改点的大小:
library(ggpubr)

ggdotchart(mtcars, x = "name", y = "mpg",

color = "cyl",

sorting = "ascending",

add = "segments",

xlab="",

rotate = TRUE,

group = "cyl",

dot.size = 3

)

其次是哑铃图

什么是哑铃图(Dumbbell Chart)

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

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

https://upload-images.jianshu.io/upload_images/8637066-4dff21877ed18d81.png

https://upload-images.jianshu.io/upload_images/8637066-0c3fd544c87606b6.png

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

怎么做哑铃图

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

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

具体如下:

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)")

https://upload-images.jianshu.io/upload_images/18814178-a4f0995a01f06c53.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)")

https://upload-images.jianshu.io/upload_images/18814178-3806f005fb6df429.png

又比如再加入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)")

https://upload-images.jianshu.io/upload_images/18814178-b03c4c8b6fe98e54.png

也可以换一个风格:

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)")

https://upload-images.jianshu.io/upload_images/18814178-076ad5049d643e98.png

还可以加入平均值:

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)")

https://upload-images.jianshu.io/upload_images/18814178-0c9049ac5e035e3b.png

发表评论

邮箱地址不会被公开。 必填项已用*标注