利用R作圆环条形图

从理念上看,本质就是增加了圆环弧度的条形图。如上图2。

需要以下步骤:

数据处理,将EXCEL中的数据做成3*N的表格导入系统,代码如下:library(tidyverse)

复制代码
library(stringr)library(ggplot2)library(viridis)
stuper <- read.csv("C:/Users/user1/Desktop/20230828/huanbar1.csv")> head(stuper)  group   individual    value id1     A       勐海茶 90.14129  12     A 西双版纳香蕉 32.59547  23     A 西双版纳菠萝 23.19559  34     A   易武正山茶 14.17019  45     A   勐海结良茶 13.01186  56     B       保山猪 48.85315  6

将数据预处理为环形图能够识别的格式,代码如下:

复制代码
empty_bar <- 3to_add <- data.frame(matrix(NA, empty_bar*nlevels(stuper$group), ncol(stuper)))to_add$group <- rep(levels(stuper$group), each=empty_bar)#为数据表添加分组变量stuper <- rbind(stuper, to_add) # 合并两个数据stuper <- stuper %>% arrange(group) # 将数据根据分组进行排序stuper$id <- seq(1, nrow(stuper))# 获取每个样本的名称在y轴的位置和倾斜角度label_data <- stupernumber_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) ## 标签倾斜角度## 为数据准备基础弧线的数据base_data <- stuper %>% group_by(group) %>%   summarize(start=min(id), end=max(id) - empty_bar) %>%   rowwise() %>% mutate(title=mean(c(start, end)))# 为网格标尺准备数据grid_data <- base_datagrid_data$end <- grid_data$end[c(nrow(grid_data), 1:nrow(grid_data)-1)] + 1grid_data$start <- grid_data$start - 1grid_data <- grid_data[-1,]

数据梳理清楚后,就可以直接画图:

复制代码
p1 <- ggplot(stuper)+  ## 添加条形图  geom_bar(aes(x=as.factor(id), y=value, fill=group),stat="identity",           alpha=0.8) +  ##为条形图添加一些划分等级的线(20/40/60/80)(按比例添加是因为知道满分100)  geom_segment(data=grid_data, aes(x = end, y = 80, xend = start, yend = 80),               colour = "orange", alpha=0.5, linewidth=0.5 ,inherit.aes = FALSE)+  geom_segment(data=grid_data, aes(x = end, y = 60, xend = start, yend = 60),               colour = "orange", alpha=0.5, linewidth=0.5 ,inherit.aes = FALSE )+  geom_segment(data=grid_data, aes(x = end, y = 40, xend = start, yend = 40),               colour = "orange", alpha=0.5, linewidth=0.5 , inherit.aes = FALSE )+  geom_segment(data=grid_data, aes(x = end, y = 20, xend = start, yend = 20),               colour = "orange", alpha=0.5, linewidth=0.5 , inherit.aes = FALSE )+  # 添加文本表示(20/40/60/80)表示每条线的大小  annotate("text", x = rep(max(stuper$id),4), y = c(20, 40, 60, 80),            label = c("20", "40", "60", "80") , color="black", size=3,           angle=0, hjust=1) +  ylim(-100,120) + ## 设置y轴坐标表的取值范围,可流出更大的圆心空白  ## 设置使用的主题并使用极坐标系可视化条形图  theme_minimal() +  theme(legend.position = "none", # 不要图例        axis.text = element_blank(),# 不要x轴的标签        axis.title = element_blank(), # 不要坐标系的名称        panel.grid = element_blank(), # 不要网格线        plot.margin = unit(rep(-1,4), "cm"))+ ## 整个图与周围的边距  coord_polar() + ## 极坐标系  ## 为条形图添加文本  geom_text(data=label_data,             aes(x=id, y=value+5, label=individual,hjust=hjust),            color="black",fontface="bold",alpha=0.8, size=2.5,             angle= label_data$angle, inherit.aes = FALSE) +  # 为图像添加基础线的信息  geom_segment(data=base_data, aes(x = start, y = -5, xend = end, yend = -5),               colour = "black", alpha=0.8, size=0.6 , inherit.aes = FALSE )+  ## 添加分组文本信息  geom_text(data=base_data, aes(x = title, y = -18, label=group),alpha=0.8,            colour = "black", size=4,fontface="bold", inherit.aes = FALSE)p1

加上汉字的正常显示:

复制代码
library(showtext)## 使用Windows自带字体font_add("heiti", "simhei.ttf")font_add("constan", "constan.ttf", italic = "constani.ttf"
相关推荐
昵称画2 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
“AI国潮设计-小江”3 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
Linux_cy3 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12033 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami3 小时前
【无标题】
开发语言·python
缓慢更新3 小时前
审批的加签与会签:多人意见怎么合
android·java·数据库·低代码·rxjava
CodeGL4 小时前
10、Python基础之进程和线程
开发语言·python
跨境联盟4 小时前
大健康实体如何搭建产品差异化:对比普通营养品与合规跨境膳食补充剂服务模式
数据库·ai·健康医疗·健康管理·精准营养
有想法的py工程师4 小时前
PostgreSQL EXPLAIN中的Cost模型分析(random_page_cost参数):优化器眼中的代价世界与执行计划生成
数据库·postgresql
前进的李工4 小时前
飞书企业知识库设计+后端高频八股
数据库·redis·后端·mysql·性能优化·飞书·rag