R语言绘图-3-Circular-barplot图

2023-09-18 11:14:44

0. 参考:

https://r-graph-gallery.com/web-circular-barplot-with-R-and-ggplot2.html

1. 说明:

利用 ggplot 绘制 环状的条形图 (circular barplot),并且每个条带按照数值大小进行排列。

2 绘图代码:

注意:绘图代码中的字体为 “Times New Roman”,如果没有这个字体的话,可以更换为其他字体,或者用下面代码加载改字体:

## 加载字体
library(extrafont)
font_import(pattern = "Times New Roman")
loadfonts()
## 绘图
library(stringr)
library(dplyr)
library(geomtextpath)
library(ggplot2)

## 加载原始数据集
hike_data <- readr::read_rds(url('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-11-24/hike_data.rds')) ## 如果不能加载数据,就通过链接把 hike_data.rds 下载下来,然后再通过 readr::read_rds() 加载数据
#hike_data <- readr::read_rds("/Users/zhiyuanzhang/Downloads/hike_data.rds")
hike_data$region <- as.factor(word(hike_data$location, 1, sep = " -- "))

## 分组统计 region 的数目
plot_df <- hike_data %>%
  group_by(region) %>%
  summarise(n = n())

## 新增一列 location,将其转化为 factor,顺序为region数目生序排列
plot_df$location = factor(plot_df$region, levels = c(levels(reorder(plot_df$region, plot_df$n))))

## 绘图
ggplot(plot_df) +
  ## 绘制横线
  geom_hline(
    aes(yintercept = y), 
    data.frame(y = c(0,1,3.5) * 100), ## 根据 location 数目的最大值设定范围(可理解为 y 的范围)
    color = "lightgrey",
  ) +
  ## 绘制条形图
  geom_col(
    aes(
      x = reorder(location, n),
      y = n,
      fill = location
    ),
    position = "dodge2",
    show.legend = FALSE, ## 不显示图例
    alpha = .9
  ) +
  
  ## 自定义每个条形图的填充色
  scale_fill_manual(
    values=c("red", "orange", "yellow", "green", "cyan", "blue", "purple", "brown", "gray", "pink", "darkgreen"), 
    labels=c(levels(plot_df$location)),
    name="Location") + ## 有图例的话,图例的名称为 Location

  ## 绘制线段
  geom_segment(
    aes(
      x = reorder(location, n),
      y = 0,
      xend = reorder(location, n),
      yend = 350 ## 和上面一样,根据数目进行调整
    ),
    linetype = "dashed",
    color = "gray"
  ) +

  ## 变成环形图
  coord_polar() +
  
  ## 添加文本注释,同时保证文本的方向是和环的方向一致的
  geom_textpath(aes(x = location, y=n, label = n), hjust=0.5, vjust=1, colour = "Black",
                family="Times New Roman", size=5) +
  ## 添加文本注释,代替坐标轴中文本
  geom_textpath(aes(x = location, y=350, label = location), hjust=0.5, vjust=2, colour = "Black",
                family="Times New Roman", size=6) + ## y 指定文本位置
  
  ## 构造一个内环
  scale_y_continuous(
    limits = c(-50, 350),
    expand = c(0, 0)
  ) +
  
  ## 添加标题
  labs(title = "Example of circular barplot") +

  ## 修改主题
  theme(
    ## 设置全部文本的字体
    text = element_text(family = "Times New Roman", face="bold"),
    
    ## 设置标题的字体
    plot.title = element_text(size = 25, hjust = 0.5),
    
    ## 将画布背景设置为白色,并去掉画布的线
    panel.background = element_rect(fill = "white", color = "white"),
    panel.grid = element_blank(),
    panel.grid.major.x = element_blank(),
    
    ## 设置坐标轴
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    axis.text.y = element_blank(),
    
    axis.text.x = element_blank(), ## 将 x 轴文本设为空,用上面 geom_textpath 添加的文本做替换
    
    ## 设置图例(如果有的话,因为上面设置了 show.legend = FALSE,所以不会显示图例)
    legend.title = element_blank(),
    legend.text = element_text(size=12),
    legend.position = "right"
  )

3. 结果:

在这里插入图片描述

更多推荐

RS485以及MODBUS学习

学习目的:1、什么是485?2、485如何通信?3、如何使用熟能生巧?RS485是一种四总线通信,分别是VCC、GND、485_A、485_B。两根负责通信,两根负责进行供电。RS485通信硬件层:解决的是数据传输问题,也就是如何将“0”和“1”传输到另外一端设备。软件层:ModBus协议则是解决数据传输的含义和意义那

云原生架构

云原生架构一、Docker1.1镜像仓库dockerhub1.2镜像操作下载:dockerpull镜像(nginx、redis)直接下载是该工具的最新版本,可以指定通过镜像名:版本来指定版本。删除:dockerrmi镜像名:版本号(默认lastest)/镜像id1.3容器操作1.3.1运行镜像:dockerrun[op

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

Linux内核顶层Makefile的make过程总结

一.Linux内核源码的make编译本文对Linux内核源码的make时,顶层Makefile所做的事进行总结。即总结一下Linux内核源码的make过程。本文续上一篇文章,地址如下:Linux内核顶层Makefile的make过程说明二_凌肖战的博客-CSDN博客二.Linux的make过程总结之前几篇文章,分析了L

Pikachu Burte Force(暴力破解)

一、BurteForce(暴力破解)概述​“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。​理论上来说,大多数系统都是可以被暴力破解的,只要

【Vue】快速入门和生命周期

目录前言一、vue的介绍1.Vue.js是什么?2.库和框架的区别3.基本概念和用法:二、MVVM的介绍1.什么是MVVM?2.MVVM的组成部分3.MVVM的工作流程4.MVVM的优势5.MVVM的应用场景三、vue实例1.模板语法:2.双向数据绑定3.虚拟dom实例四、vue生命周期钩子总结前言Vue.js是一款流

数据在C++中的大小(占用内存)

C++中的大小(占用内存)摘要正文获取数据类型的大小注意结论摘要在C++中,了解数据类型的大小及其在内存中的占用情况对于编写高效的代码至关重要。本文将介绍C++中不同数据类型的大小以及如何计算它们所占用的内存空间。正文在C++中,每个数据类型都有不同的字节大小,这取决于编译器和操作系统的实现。下面是一些常见的数据类型及

fastjson反序列化漏洞(CVE-2017-18349)

文章目录fastjson序列化FastJson序列化操作反序列化漏洞原理漏洞复现(CVE-2017-18349)fastjsonfastjson是阿里巴巴开发的java语言编写的高性能JSON库,用于将数据在Json和JavaObject之间相互转换。它没有用java的序列化机制,而是自定义了一套序列化机制。提供两个主

Open Interpreter,一个让ChatGPT入驻你的电脑并获得联网能力成为贾维斯!

OpenInterpreter,一个让ChatGPT入驻你的电脑并获得联网能力成为贾维斯!介绍安装使用介绍最近看了Github最近大火的程序员终端大升级,发现了openinterpreter这个可以部署到本地命令行的对话AI,其依赖ChatGPT,可以使用联网功能和本地模型,很好地拓展了原有的功能并且能结合物理设备软硬

勇立潮头!高品质SFT语音数据实现Zero-Shot语音复刻大模型

文本到语音合成(TexttoSpeech,TTS)作为生成式人工智能(GenerativeAI或AIGC)的重要课题,在近年来取得了飞速发展。为了实现高效合成既自然又高质量的人类语音,有不少机构及企业都进行了相关项目的研究,包括微软亚洲研究院机器学习组和微软Azure语音团队去年推出的NaturalSpeech(htt

企业微信 API 接口调用教程:图文详解企业微信 API 的使用方法

本文通过access_token凭证的方式来讲解怎么调用企业微信API,并一步步介绍如何获取企业微信API的corpsecret、corpid、access_token凭证以及怎么向企业微信的应用发送消息。企业微信API在线地址为:概述-企业微信API,这个在线地址的项目你可以克隆到Apifox,以方便调试。话不多说,

热文推荐