前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[会员专享] ggplot2绘制环状正负堆砌条形图

[会员专享] ggplot2绘制环状正负堆砌条形图

作者头像
R语言数据分析指南
发布2022-09-23 14:10:39
5590
发布2022-09-23 14:10:39
举报
文章被收录于专栏:R语言数据分析指南

「今天VIP群里有观众老爷询问如何绘制环状堆砌条形图」例图如下所示,既然观众老爷们有需求,那小编就来简单写篇文档进行介绍;下面来看具体案例「数据代码已经上传VIP群,请自行下载」

例图

图形解读

❝可以看到就是一张普通的堆砌条形图只不过改为了圆形展示,通过图形我们可以看到数据分为两组,并且每一个样本数值有正负之分,因此与常见的条形图绘制方法无二,只是在于构建极坐标并合理的添加文本;由于小编手里没有合适的数据因此使用R内置数据集来进行展示,下面来看具体细节 ❞

加载R包

代码语言:javascript
复制
library(tidyverse)

构建数据

❝由于例图有正负之分,「mtcars」数据集没有,因此我们人为构建一份数据 ❞

代码语言:javascript
复制
data1 <- mtcars %>% head(6) %>% 
  mutate_if(is.numeric, function(x) x+10) %>% 
  log10() %>% as.data.frame() %>% 
  rownames_to_column("type") %>%
  pivot_longer(-type) %>%
  mutate(type=factor(type)) %>% arrange(type)
 
# 添加负值 
data1<- data1 %>% bind_rows(data1 %>% mutate(value=-value))

计算标签角度

代码语言:javascript
复制
empty_bar <- 0
data1$id <- seq(1,nrow(data1))
label_data <- data1
number_of_bar <- nrow(label_data)
angle <-  90 - 360 * (label_data$id-0.5) /number_of_bar    
label_data$hjust<-ifelse( angle < -90, 1, 0)
label_data$angle<-ifelse(angle < -90, angle+180, angle)

定义颜色

代码语言:javascript
复制
colors <-c("#FED439FF","#709AE1FF",
           "#D5E4A2FF","#197EC0FF","#F05C3BFF","#46732EFF",
           "#71D0F5FF","#370335FF","#075149FF","#C80813FF","#91331FFF",
           "#1A9993FF","#FD8CC1FF")

数据可视化

代码语言:javascript
复制
ggplot(data1,aes(id,value,fill=name))+
  geom_bar(stat="identity",alpha=0.8)+
  scale_fill_manual(values = colors)+
  labs(x=NULL,y=NULL)+
  ylim(-7,10)+
  coord_polar(start =0)+
  theme_void()+
  theme(
    legend.text = element_text(color="black"),
    legend.title=element_blank(),
    legend.spacing.x=unit(0.2,'cm'),
    legend.key=element_blank(),
    legend.key.width=unit(0.3,'cm'),
    legend.key.height=unit(0.3,'cm'),
    legend.position=c(0.5,0.5))+
  # 添加标签
  geom_text(data=label_data,aes(x=id, y=value+1,label=type,hjust=hjust,color=name),
            fontface="plain",size=2.5,show.legend = F,
            angle= label_data$angle,inherit.aes = FALSE)+
  scale_color_manual(values = colors)+
  # 添加标签,若要给标签分配颜色只需要将color写进aes内给定分组映射即可
  geom_text(data=label_data,aes(x=id, y=value+1,label=type,hjust=hjust),
            fontface="plain",size=2.5,show.legend = F,color="black",
            angle= label_data$angle,inherit.aes = FALSE)+
  scale_color_manual(values = colors)+
  # 添加外圈
  geom_segment(aes(x=0, y=8,xend=66.5,yend =8),size=1.5,color="#3B9AB2",
               arrow = arrow(length = unit(0, "npc"),type="closed"))+
  geom_segment(aes(x=0, y=-0.1,xend=66.5,yend =-0.1),size=0.3,color="grey80",
               arrow = arrow(length = unit(0, "npc"),type="closed"))

❝可以看到整个过程还是很简单的,喜欢的观众老爷欢迎分享转发

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言数据分析指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例图
  • 图形解读
  • 加载R包
  • 构建数据
  • 计算标签角度
  • 定义颜色
  • 数据可视化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档