R可视化学习(4) -- 棒棒糖图

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

49c9b45b72ca4d03b18d7c93ec19ed1.png

基础棒棒糖图

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

# 加载包
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

479b9b00f11bb378f17e2d29067365a.png

自定义点与线条

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

a438654525ab09a2c2c982d2199ef62.png

我们也利用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")

c863c6a3c87bf58e0c5c78b08cacd7f.png

另外,我们也可以很容易地更改图表的基线。如果您感兴趣的数据中某个特定的阈值时候,那么它将提供更深入的理解,我们只需更改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")

687639b599d199820991fc246d33ca4.png

高亮并添加注释

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)

1c4895d4f842d06197df71dd1f31007.png

其实之前介绍过一种高亮图形的包---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")

5eae6fd4faddcf56d38db09f1a0d26e.png

也可采用分面形式呈现,代码添加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()) #主题

7abb1f3b482ff3fdbd8efe002bcfab2.png

多值情况

当我们遇到每个分类变量对应俩个值的情况时候,棒棒糖图也是非常合适的。对于每个分类变量,用不同的颜色为每个值绘制一个点。然后使用片段突出显示它们的差异。这种类型的可视化也称为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")

ca602bd0c9a8056a84d0113fbc0e2b5.png

相关文章
|
6天前
|
并行计算 数据可视化 算法
CMplot & rMVP | 全基因组曼哈顿图和QQ图轻松可视化!
`CMplot`和`rMVP`是R语言中的两个包,用于全基因组关联分析(GWAS)的数据可视化。`CMplot`专注于曼哈顿图和QQ图的绘制,支持多种图表类型,如常见的SNP密度图、环状曼哈顿图、矩阵图、单条染色体图和多重曼哈顿图等。`rMVP`不仅包含了`CMplot`的功能,还支持更复杂的GWAS方法,如线性/混合线性模型和基因组选择算法,优化了内存管理和计算效率,特别适合大规模数据集。此外,它还提供PCA图和柱状图。两者都提供了丰富的参数定制图表。
16 1
CMplot & rMVP | 全基因组曼哈顿图和QQ图轻松可视化!
|
4月前
|
数据可视化
Tableau可视化设计案例-04标靶图、甘特图、瀑布图
Tableau可视化设计案例-04标靶图、甘特图、瀑布图
|
4月前
|
机器学习/深度学习
如何使用一行代码在一张图形上展示不同的模型
如何使用一行代码在一张图形上展示不同的模型
29 0
|
Web App开发 数据可视化 前端开发
前端数据可视化插件(四)关系图
前端数据可视化插件(四)关系图
前端数据可视化插件(四)关系图
|
10月前
|
数据可视化
R可视化学习(5) -- 脊线图
Ridgeline 图(脊线图),(有时称为Joyplot)可以同时显示几个组的数值分布情况,分布可以使用直方图或密度图来表示,它们都与相同的水平尺度对齐,并略有重叠。常常被用来可视化随时间或空间变化的多个分布/直方图变化。
172 0
R可视化学习(5) -- 脊线图
|
10月前
|
数据采集 数据可视化
|
10月前
|
移动开发 数据可视化 HTML5
R可视化学习—词云图
词云。又称文字云。“词云”就是通过形成“关键词云层”或“关键词渲染”,对网络文本中出现频率较高的“关键词”的视觉上的突出,它会过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。
106 0
|
10月前
|
数据可视化 Go 数据库
DiVenn一款用于比较基因列表的交互式Venn图绘制工具
Divenn一种基于网络的基于Web的工具 Divenn 可以将来自多个RNA-seq实验中的基因列表进行比较,并显示每个基因(集)的调控水平和整合到Kegg pathway和GO term的数据信息。我们通过该工具更加方便的了解重叠基因与其相关的pathway或Go terms之间的表达模式,十分有趣。
131 0
|
11月前
|
数据采集 数据可视化 算法
数据分析可视化常用图介绍以及相关代码实现(箱型图、Q-Q图、Kde图、线性回归图、热力图)
数据分析可视化常用图介绍以及相关代码实现(箱型图、Q-Q图、Kde图、线性回归图、热力图)
|
11月前
|
机器学习/深度学习 算法 数据可视化
可视化图布局算法浅析
图算法在前端领域考察的较少,一般除非是要写框架或者打包工具对依赖关系处理(DAG)会用到,前端对图算法的考察一般是比较少的,而对于可视化领域而言,图又是必不可少的一种展示方式,其中对于边和节点的展示布局方案结合美学效果会有不同的算法实现,本文旨在介绍一些常见的通用布局算法,其中的每个小的布局方案也会有不同的分支实现
317 0

热门文章

最新文章