R语言绘制棒棒糖图

棒棒糖图其实类似于柱状图加散点图的效果,因为他的形状就是由俩部分组成(点+线条),因此在ggplot中,我们只要通过geom_point()函数绘制"糖"的那一部分,geom_segment()函数绘制“棒棒”那一部分,就可轻松绘制出这种图形

image

基础棒棒糖图

横坐标的值可以为数值变量或者分类变量

# 加载包
library(ggplot2)
library(patchwork)
# 创造数值变量数据
data1 <- data.frame(x=seq(1,30), y=abs(rnorm(30)))
# 作图
p1 <- ggplot(data1, aes(x=x, y=y)) +
  geom_point() + 
  geom_segment( aes(x=x, xend=x, y=0, yend=y))

# 创造分类变量数据
data2 <- data.frame(
  x=LETTERS[1:26], 
  y=abs(rnorm(26))
)

# 作图
p2 <- ggplot(data2, aes(x=x, y=y)) +
  geom_point() + 
  geom_segment( aes(x=x, xend=x, y=0, yend=y))
p1+p2

image

自定义点与线条

library(ggplot2)
ggplot(data2, aes(x=x, y=y)) +
  geom_segment( aes(x=x, xend=x, y=0, yend=y),size=1, color="blue", linetype="dotdash" )+ 
  geom_point( size=5, color="red", fill=alpha("orange", 0.3), alpha=0.7, shape=21, stroke=2)+ 
  theme_light() +
  #coord_flip() + 控制图形是否水平放置
  theme(
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()
  ) +
  xlab("") +
  ylab("Value of Y")

image

我们也利用fct_reorder()函数按照Y值从小到大排个序,当然也可以改动因子水平去排序,相比之下前者会方便点。

library(ggplot2)
library(forcats)
library(dplyr)
data2%>%
  mutate(x = fct_reorder(x,y))%>% #降序的话改为desc(y)
  ggplot(aes(x= x, y=y)) +
  geom_segment( aes(x=x, xend=x, y=0, yend=y),size=1, color="blue", linetype="dotdash" )+ 
  geom_point( size=5, color="red", fill=alpha("orange", 0.3), alpha=0.7, shape=21, stroke=2)+ 
  theme_light() +
  #coord_flip() + 控制图形是否水平放置
  theme(
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()
  ) +
  xlab("") +
  ylab("Value of Y")

image

另外,我们也可以很容易地更改图表的基线。如果您感兴趣的数据中某个特定的阈值时候,那么它将提供更深入的理解,我们只需更改geom_segment()调用中的y参数。

ggplot(data2, aes(x=x, y=y)) +
  geom_segment( aes(x=x, xend=x, y=1, yend=y),size=1, color="blue", linetype="dotdash" )+ 
  geom_point( size=5, color="red", fill=alpha("orange", 0.3), alpha=0.7, shape=21, stroke=2)+ 
  theme_light() +
  #coord_flip() + 控制图形是否水平放置
  theme(
    panel.grid.major.x = element_blank(),
    panel.border = element_blank(),
    axis.ticks.x = element_blank()
  ) +
  xlab("") +
  ylab("Value of Y")

image

高亮并添加注释


library(hrbrthemes)
library(ggplot2)
library(dplyr)

data <- data.frame(
  x=LETTERS[1:26], 
  y=abs(rnorm(26))
)

# 数据排序
data <- data %>%
  arrange(y) %>%
  mutate(x=factor(x,x))

# 绘图
p <- ggplot(data, aes(x=x, y=y)) +
  geom_segment( aes(x=x, xend=x, y=0, yend=y ), color=ifelse(data$x %in% c("A","D"), "purple", "grey"), size=ifelse(data$x %in% c("A","D"), 1.3, 0.7) ) +
  geom_point( color=ifelse(data$x %in% c("A","D"), "purple", "grey"), size=ifelse(data$x %in% c("A","D"), 5, 2) ) +
  theme_ipsum() +
  coord_flip() +
  theme(
    legend.position="none"
  ) +
  xlab("") +
  ylab("Value of Y") +
  ggtitle("How did groups A and D perform?")
p
# 添加注释
p + annotate("text", x=grep("D", data$x), y=data$y[which(data$x=="D")]*1.2, 
             label = paste("Group D is very impressive\n (val=",data$y[which(data$x=="D")] %>% round(2),")",sep="" ) ,
             color="purple", size=4 , angle=0, fontface="bold", hjust=0) + 

  annotate("text", x = grep("A", data$x), y = data$y[which(data$x=="A")]*1.2, 
           label = paste("Group A is not too bad\n (val=",data$y[which(data$x=="A")] %>% round(2),")",sep="" ) , 
           color="purple", size=4 , angle=0, fontface="bold", hjust=0) 

image

其实之前介绍过一种高亮图形的包---gghightlight,此操作大家也可以换个包尝试一下~

多组情况

当我们再增添一组分类变量时候,可以绘制出分组情况下的棒棒图。

方式一:ggplot绘制

data2 <- data2%>% 
mutate(Group = rep(c('F','M'),13))

data2$Group <- factor(data2$Group)
ggplot(data2,aes(x= x, y=y),) +
geom_segment( aes(x=x, xend=x, y=0, yend=y,color = Group),size=1, linetype="dotdash" )+ 
geom_point(aes(color = Group), size=5)+ 
scale_color_manual(values = c('gold','pink'))+
theme_light() +
# coord_flip() + 控制图形是否水平放置
theme(
panel.grid.major.x = element_blank(),
panel.border = element_blank(),
axis.ticks.x = element_blank()
) +
xlab("") +
ylab("Value of Y")

image

也可采用分面形式呈现,代码添加facet_wrap(~Group,ncol = 2,scales = 'free_x')
[图片上传失败...(image-f6b491-1603677926805)]

方式二: ggpubr包

ggpubr包中有现成的函数ggdotchart绘制棒棒糖图

 library(ggpubr)
  ggdotchart(data2, x="x", y="y", color = "Group",          
             palette = c("gold","pink"), # 配色
             sorting = "ascending",    # 排序     
             add = "segments", #添加棒棒
             # rotate = TRUE,  改为垂直
             ggtheme = theme_pubr()) #主题

image

多值情况

当我们遇到每个分类变量对应俩个值的情况时候,棒棒糖图也是非常合适的。对于每个分类变量,用不同的颜色为每个值绘制一个点。然后使用片段突出显示它们的差异。这种类型的可视化也称为Clevenland dot plots (克利夫兰点图)。

加载包及数据处理

# 加载包
library(ggplot2)
library(dplyr)
library(hrbrthemes)

# 创造数据
value1 <- abs(rnorm(26))*2
data <- data.frame(
  x=LETTERS[1:26], 
  value1=value1, 
  value2=value1+1+rnorm(26, sd=1) 
)
head(data)
  x    value1    value2
1 A 0.8301565 0.1326605
2 B 6.7433156 7.8045654
3 C 1.0231795 1.1628583
4 D 0.1416095 1.3683347
5 E 1.1354025 2.7985499
6 F 0.7394701 2.6515638

## 数据处理计算出差值
data2 <- data %>% 
  group_by(x) %>% 
  mutate( mymean = mean(c(value1,value2) )) %>%  # 添加value1与value2的均值
  arrange(mymean) %>% 
  mutate(x=factor(x, x))
head(data2)

  x     value1 value2 mymean
  <fct>  <dbl>  <dbl>  <dbl>
1 A     0.830   0.133  0.481
2 T     0.0898  1.03   0.559
3 S     0.688   0.529  0.609
4 D     0.142   1.37   0.755
5 M     0.621   1.24   0.931
6 Q     0.144   1.87   1.00 

作图

ggplot(data2) +
  geom_segment( aes(x=x, xend=x, y=value1, yend=value2), color="grey") +
  geom_point( aes(x=x, y=value1), color='pink', size=3 ) +
  geom_point( aes(x=x, y=value2), color='gold', size=3 ) +
  coord_flip()+
  theme_ipsum() +
  theme(
    legend.position = "none",
  ) +
  xlab("") +
  ylab("Value of Y")

image

作者:凯凯何_Boy
链接:https://www.jianshu.com/p/e602b9340119
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容