比较(六)利用python绘制径向柱图
比较(六)利用python绘制径向柱图
径向柱图(Circular Barplot)简介

径向柱图基于同心圆网格来绘制条形图,虽然不如普通条形图表达准确,但却有抓人眼球的效果。其衍生的南丁格尔玫瑰图则广为人知。
快速绘制
-
基于matplotlib
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cmnp.random.seed(0) # 设置随机种子为0# 自定义数据 df = pd.DataFrame({'Name': ['item ' + str(i) for i in list(range(1, 51)) ],'Value': np.random.randint(low=10, high=100, size=50)})# 初始化布局-极坐标图 plt.figure(figsize=(10,8)) ax = plt.subplot(111, polar=True)# 移除网格 plt.axis('off')# 坐标限制 upperLimit = 100 lowerLimit = 30# 计算极值 max_value = df['Value'].max()# 数据缩放 slope = (max_value - lowerLimit) / max_value heights = slope * df.Value + lowerLimit# 计算每个条形的宽度 width = 2*np.pi / len(df.index)# 计算角度 indexes = list(range(1, len(df.index)+1)) angles = [element * width for element in indexes] angles# 增加条形图 bars = ax.bar(x=angles, height=heights, width=width, bottom=lowerLimit,linewidth=2, edgecolor="white",color="#61a4b2",)
定制多样化的径向柱图
自定义径向柱图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
-
添加标签
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cmnp.random.seed(0) # 设置随机种子为0# 自定义数据 df = pd.DataFrame({'Name': ['item ' + str(i) for i in list(range(1, 51)) ],'Value': np.random.randint(low=10, high=100, size=50)})# 初始化布局-极坐标图 plt.figure(figsize=(10,8)) ax = plt.subplot(111, polar=True)# 移除网格 plt.axis('off')# 坐标限制 upperLimit = 100 lowerLimit = 30# 计算极值 max_value = df['Value'].max()# 数据缩放 slope = (max_value - lowerLimit) / max_value heights = slope * df.Value + lowerLimit# 计算每个条形的宽度 width = 2*np.pi / len(df.index)# 计算角度 indexes = list(range(1, len(df.index)+1)) angles = [element * width for element in indexes] angles# 添加条形图 bars = ax.bar(x=angles, height=heights, width=width, bottom=lowerLimit,linewidth=2, edgecolor="white",color="#61a4b2", )# 标签和bar的间距定义 labelPadding = 4# 添加标签 for bar, angle, height, label in zip(bars,angles, heights, df["Name"]):# 弧度转化:将弧度转为度,如np.pi/2->90rotation = np.rad2deg(angle)# 颠倒一部分标签,方便查看alignment = ""if angle >= np.pi/2 and angle < 3*np.pi/2:alignment = "right"rotation = rotation + 180else: alignment = "left"# 通过text函数添加标签ax.text(x=angle, y=lowerLimit + bar.get_height() + labelPadding, s=label, ha=alignment, va='center', rotation=rotation, rotation_mode="anchor")
-
引申-简单绘制南丁格尔玫瑰图
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cmnp.random.seed(0) # 设置随机种子为0# 自定义数据 df = pd.DataFrame({'Name': ['item ' + str(i) for i in list(range(1, 51)) ],'Value': np.random.randint(low=10, high=100, size=50)}) # 排序 df = df.sort_values(by=['Value'])# 初始化布局 plt.figure(figsize=(10,8)) ax = plt.subplot(111, polar=True) plt.axis('off')# 坐标限制 upperLimit = 100 lowerLimit = 30# 高度 heights = df.Value # 计算每个条形的宽度 width = 2*np.pi / len(df.index)# 颜色 cmap = cm.RdYlGn # 归一化 norm_heights = (heights - np.min(heights)) / (np.max(heights) - np.min(heights)) # 颜色映射到heights colors = cmap(norm_heights)# 计算角度 indexes = list(range(1, len(df.index)+1)) angles = [element * width + 0.5*np.pi for element in indexes] # 指定从0开始逆时针旋转# 添加条形图 bars = ax.bar(x=angles, height=heights, width=width, bottom=lowerLimit,linewidth=2, edgecolor="white",color=colors, )# 标签和bar的间距定义 labelPadding = 4# 添加标签 for bar, angle, height, label in zip(bars,angles, heights, df["Name"]):# 弧度转化:将弧度转为度,如np.pi/2->90rotation = np.rad2deg(angle)# 颠倒一部分标签,方便查看alignment = ""if angle >= np.pi/2 and angle < 3*np.pi/2:alignment = "right"rotation = rotation + 180else: alignment = "left"# 通过text函数添加标签ax.text(x=angle, y=lowerLimit + bar.get_height() + labelPadding, s=label, ha=alignment, va='center', rotation=rotation, rotation_mode="anchor")
-
分组径向柱图
import matplotlib.pyplot as plt import numpy as np import pandas as pdrng = np.random.default_rng(123) # 随机种子# 自定义数据 df = pd.DataFrame({"name": [f"item {i}" for i in range(1, 51)],"value": rng.integers(low=30, high=100, size=50),"group": ["A"] * 10 + ["B"] * 20 + ["C"] * 12 + ["D"] * 8 })# 自定义函数,将上述的弧度转换、添加标签抽象成函数 def get_label_rotation(angle, offset):'''输入弧度和偏移量,返回对应的角度rotation以及对齐方式alignment'''rotation = np.rad2deg(angle + offset)if angle <= np.pi:alignment = "right"rotation = rotation + 180else: alignment = "left"return rotation, alignmentdef add_labels(angles, values, labels, offset, ax):# 标签与bar的间距padding = 4# 迭代每个弧度、bar值和标签for angle, value, label, in zip(angles, values, labels):angle = angle# 获取角度和对齐方式rotation, alignment = get_label_rotation(angle, offset)# 添加文本标签ax.text(x=angle, y=value + padding, s=label, ha=alignment, va="center", rotation=rotation, rotation_mode="anchor")# 自定义基础变量 GROUP = df["group"].values # 分组 GROUPS_SIZE = [len(i[1]) for i in df.groupby("group")] # 每组的数量 COLORS = [f"C{i}" for i, size in enumerate(GROUPS_SIZE) for _ in range(size)] # 每组使用不同的颜色# bar的值与标签 VALUES = df["value"].values LABELS = df["name"].values# 偏移量:默认从0开始,指定成从90度位置开始 OFFSET = np.pi / 2# bar宽度、角度 PAD = 3 # 每组末尾添加3个空白bar ANGLES_N = len(VALUES) + PAD * len(np.unique(GROUP)) ANGLES = np.linspace(0, 2 * np.pi, num=ANGLES_N, endpoint=False) WIDTH = (2 * np.pi) / len(ANGLES) # 2pi/条形数量得到每个条形宽度# 获取索引 offset = 0 IDXS = [] for size in GROUPS_SIZE:IDXS += list(range(offset + PAD, offset + size + PAD))offset += size + PAD# 初始化极坐标图 fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={"projection": "polar"})# 指定偏移量 ax.set_theta_offset(OFFSET)# 设置范围 ax.set_ylim(-100, 100)# 移除边框 ax.set_frame_on(False)# 移除网格和轴刻度 ax.xaxis.grid(False) ax.yaxis.grid(False) ax.set_xticks([]) ax.set_yticks([])# 添加条形图 ax.bar(ANGLES[IDXS], VALUES, width=WIDTH, color=COLORS, edgecolor="white", linewidth=2 )# 添加标签 add_labels(ANGLES[IDXS], VALUES, LABELS, OFFSET, ax)# 额外添加分组标签 offset = 0 # 重置为0 for group, size in zip(["A", "B", "C", "D"], GROUPS_SIZE):# 在条形图下添加线条x1 = np.linspace(ANGLES[offset + PAD], ANGLES[offset + size + PAD - 1], num=50)ax.plot(x1, [-5] * 50, color="#333333")# 添加分组标签ax.text(np.mean(x1), -20, group, color="#333333", fontsize=14, fontweight="bold", ha="center", va="center")# 添加参考线:[20, 40, 60, 80]x2 = np.linspace(ANGLES[offset], ANGLES[offset + PAD - 1], num=50)ax.plot(x2, [20] * 50, color="#bebebe", lw=0.8)ax.plot(x2, [40] * 50, color="#bebebe", lw=0.8)ax.plot(x2, [60] * 50, color="#bebebe", lw=0.8)ax.plot(x2, [80] * 50, color="#bebebe", lw=0.8)offset += size + PAD
总结
以上通过matplotlib结合极坐标绘制基本的径向柱图,并结合相关绘图方法绘制南丁格尔玫瑰图和分组径向柱图。
共勉~
相关文章:
比较(六)利用python绘制径向柱图
比较(六)利用python绘制径向柱图 径向柱图(Circular Barplot)简介 径向柱图基于同心圆网格来绘制条形图,虽然不如普通条形图表达准确,但却有抓人眼球的效果。其衍生的南丁格尔玫瑰图则广为人知。 快速绘制…...
为什么需要重写equals和如何重写equals
首先先看Java中的 ,比较的两个对象的地址值。 如果是基本数据类型,那么就是比较的是值。 如果是引用数据类型,比较的就是地址. object类中的equals方法也是用的; 所以要比较两个对象的大小,去调用默认的equals方法…...
C#字符串操作:判断一个字符串是否存在于另一个字符串按特定字符分割后的子字符串中的几种方法
要判断一个字符串是否存在于另一个字符串按特定字符分割后的子字符串中,可以使用以下几种方法: 方法一:使用Split和Array.Exists 你可以使用 Split 方法将字符串分割成子字符串数组,然后使用 Exists方法检查目标字符串是否在数组…...
Hi3861 OpenHarmony嵌入式应用入门--MQTT
MQTT 是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输 协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、 高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器…...
[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪
Opencv_CUDA应用之 使用背景相减法进行对象跟踪 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程,它广泛应用于对象检测和跟踪应用中去除背景 背景相减法分四步进行:图像预处理 -> 背景建模 -> 检测前景 -> 数据验证 预处理去除噪声背景建模,以便与…...
Maven在Windows中的配置方法
本文介绍在Windows电脑中,下载、配置Maven工具的详细方法。 Maven是一个广泛使用的项目管理工具,主要针对Java项目,但也可以用于其他类型的项目;其由Apache软件基金会维护,旨在简化和标准化项目构建过程,依…...
一、redis-万字长文读懂redis
高性能分布式缓存Redis `第一篇章`1.1缓存发展史&缓存分类1.1.1 大型网站中缓存的使用带来的问题1.1.2 常见缓存的分类及对比与memcache对比1.2 数据类型选择&应用场景1.2.1 string1.2.2 hash1.2.3 链表1.2.4 set1.2.5 sortedset有序集合类型1.2.6 总结1.3 Redis高级应…...
搞清楚[继承],易如反掌
穷不失义,达不离道。——孔丘《论语》 继承 1、简单理解2、继承2、1、继承的概念2、2、继承定义2、3、基类和派生类对象赋值转换2、4、继承中的作用域2、5、派生类默认成员函数2、6、继承中的特点2、6、1、友元2、6、2、静态成员2、6、3、菱形继承及菱形虚拟继承 3、…...
Perl 语言入门学习指南:探索高效脚本编程的奥秘
引言 Perl,全称Practical Extraction and Report Language,是一种功能强大的编程语言,特别擅长于文本处理、报告生成以及系统自动化管理任务。自1987年诞生以来,Perl凭借其灵活性、强大的内置功能库和广泛的社区支持,…...
【HTML】-解决页面内容无法选择、复制问题
目录 1、网页内容无法选中 1.1、问题原因 1.2、解决脚本 1.2.1、开启控制台窗口 1.2.2、执行脚本命令 2、内容复制弹出阻止框 2.2、解决脚本 1、网页内容无法选中 1.1、问题原因 今天在访问某一网站平台,需要将内容进行选择、复制时发现不可使用。 在使用…...
C#中委托与事件
一、委托 在面向对象中,我们可以将任何数据类型作为参数传递给方法,能否将一个方法作为参数传递给另一个方法?C#中通过委托可以实现将方法作为参数进行传递。 1.1概念 委托是一种引用类型,它可以用于封装并传递方法作为参数。委…...
通用后台管理(二)——项目搭建
目录 前言 一、安装vue-cli依赖 1、使用yarn下载vue-cli 2、使用npm下载 3、检查一下是否下载成功 二、创建项目 1、创建项目,my-app是项目名称 2、 这里选择vue 2,蓝色表示选中的。 3、启动项目 三、下载项目依赖 四、配置项目 1、修改esli…...
多模态大模型之达摩院通义MPLUG
引言 随着人工智能技术的飞速发展,多模态技术逐渐成为研究的热点。它结合了文本、图像、声音等多种数据类型,为机器理解世界提供了更丰富的视角。本文根据严明老师的达摩院通义MPLUG多模态预训练技术分享,及其在电商等行业的应用实践&#x…...
文章翻译记录
以 PINN 为基础,我们开发了一个框架,用于在不同震源位置和速度模型下进行地震建模。本研究的显著贡献包括: 1. 为了提高网络对不同速度模型的泛化能力,必须将速度变量 vp 作为系统的输入参数。本研究从监督学习中汲取灵感…...
C++ 语法习题(2)
第三讲 循环语句 1.偶数 编写一个程序,输出 1 到 100之间(包括 1 和 100)的全部偶数。 输入格式 无输入。 输出格式 输出全部偶数,每个偶数占一行。 输入样例 No input输出样例 2 4 6 ... 100 参考代码: #include <i…...
使用Gstreamer时遇到WARNING: erroneous pipeline: no element “x264enc“(亲测有效)
WARNING: erroneous pipeline: no element “x264enc” 解决: 我下了gstreamer1.0-plugins-ugly包就解决了 sudo apt install -y gstreamer1.0-plugins-ugly...
SAP 新增移动类型简介
在SAP系统中新增移动类型的过程涉及多个步骤,包括复制现有的移动类型、调整科目设置以及进行必要的测试。以下是新增移动类型的一般步骤和关键点: 复制现有的移动类型: 使用事务代码OMJJ进入移动类型维护界面。 勾选移动类型 这里不填写移动类型,然后直接下…...
SQL性能优化策略
发现问题 通过业务监控发现慢SQL或接口响应延迟。利用性能分析工具定位问题。 定位SQL语句 使用监控工具确定影响性能的SQL语句和表。 SQL查询变慢原因 索引失效:查询未使用索引或索引效率低。多表连接:JOIN操作导致性能下降。查询字段过多…...
代码随想录第四十八天 | 198.打家劫舍, 213.打家劫舍II,337.打家劫舍III
198.打家劫舍 看完想法:这里的偷/不偷,和背包问题中的放/不放感觉是一个道理,所以在dp递推公式中仍旧使用max(dp[i-2] nums[i], dp[i-1]) int rob(vector<int>& nums) {vector<int> dp(nums.size()1,0);if(nums.size()0) …...
C#实用的工具类库
Masuit.Tools Masuit.Tools大都是静态类,加密解密,反射操作,树结构,文件探测,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
