比较(六)利用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扩展,文件压缩,多线程下载…...
告别网络烦恼:Stanza 1.5.1英文语言模型离线安装保姆级教程(Anaconda环境专用)
深度解析Stanza 1.5.1英文语言模型离线部署:Anaconda环境全流程实战 在企业内网或学术研究环境中,我们常常面临无法直接访问外部资源的情况。这时,掌握关键工具的离线部署能力就显得尤为重要。今天我们将全面剖析自然语言处理工具Stanza在受限…...
DanKoe 视频笔记:一人企业构建指南:从零到百万美元的教育业务(每日工作2-4小时)
在本课程中,我们将学习如何构建一个单人教育业务,实现从零到年收入百万美元的目标,同时将每日工作时间控制在2-4小时。我们将探讨其核心理念、实施步骤以及背后的进化逻辑。 概述 传统的创业路径往往伴随着高风险、高投入和漫长的工作时间。…...
open_clip多模态模型实战指南:从技术原理到产业落地
open_clip多模态模型实战指南:从技术原理到产业落地 【免费下载链接】open_clip An open source implementation of CLIP. 项目地址: https://gitcode.com/GitHub_Trending/op/open_clip 核心价值:为什么选择open_clip? 在当今AI应用…...
EfficientNet实战:如何在移动端部署B0-B7模型(附显存优化技巧)
EfficientNet移动端部署实战:从模型选型到显存优化全解析 在移动端和边缘计算场景中部署深度学习模型,就像给一辆跑车装上节能引擎——既要保持性能,又要极致压缩资源消耗。EfficientNet系列模型正是这种平衡艺术的代表作,但当开发…...
安装claude code,开始学习强大的AI编程助手
1.首先检查是否安装node.js(版本尽量大于22) window端输入winr -> cmd 打开终端查看node版本 可以使用nvm去管理nodejs版本,安装方式见 https://blog.csdn.net/m0_56820004/article/details/159585001?spm1011.2415.3001.10575…...
构建智能游戏AI的理想训练场:腾讯王者荣耀AI开放环境全解析
构建智能游戏AI的理想训练场:腾讯王者荣耀AI开放环境全解析 【免费下载链接】hok_env Honor of Kings AI Open Environment of Tencent 项目地址: https://gitcode.com/gh_mirrors/ho/hok_env 强化学习研究如何突破理论到实践的鸿沟?如何在真实游…...
推荐系统优化秘籍:如何用Metric Learning解决冷启动问题?
推荐系统优化秘籍:如何用Metric Learning解决冷启动问题? 在推荐系统领域,冷启动问题一直是困扰算法工程师和产品经理的核心挑战之一。新用户缺乏历史行为数据,新商品没有足够的曝光记录,传统协同过滤方法在这些场景下…...
网易云音乐无损解析:打造个人高品质音乐库的终极指南
网易云音乐无损解析:打造个人高品质音乐库的终极指南 【免费下载链接】Netease_url 网易云无损解析 项目地址: https://gitcode.com/gh_mirrors/ne/Netease_url 还在为网易云音乐无法下载无损音质而烦恼吗?想要建立属于自己的高品质音乐收藏库吗&…...
GoAccess源码深度解析:从main函数到核心模块调用链的完整指南
GoAccess源码深度解析:从main函数到核心模块调用链的完整指南 【免费下载链接】goaccess allinurl/goaccess: 是一个开源的 Web 日志分析工具,用于分析访问日志并生成报告。它可以帮助开发者快速了解网站流量、访问者等信息,优化网站性能。特…...
leetcode 1540. K次操作转变字符串-耗时95-Can Convert String in K Moves
Problem: 1540. Can Convert String in K Moves 耗时95%,统计差值的余数的频次,相同余数满足等差数列,若不满足【余数 26 * ( 频次 - 1 ) < k】则返回false 最后返回true Code class Solution { public:bool canConvertString(string …...
