MATLAB环形柱状图与核密度面积图组合可视化教程
1. 环形柱状图与核密度面积图的组合应用场景在科研数据可视化领域环形柱状图Donut Bar Chart与核密度面积图Kernel Density Area Plot的组合使用正逐渐成为一种趋势。这种组合图表特别适合展示两类数据的关联性一类是离散的分类数据用环形柱状图表示另一类是连续的分布数据用核密度面积图表示。我最近在分析一组消费者行为数据时就采用了这种组合图表。环形部分展示了不同年龄段消费者的购买频次占比而中间的核密度图则显示了消费金额的分布情况。这种组合方式让读者能够一眼看出谁买得多和花多少钱两个维度的信息。2. MATLAB环境准备与基础设置2.1 版本兼容性检查在开始绘图前首先要确认你的MATLAB版本支持所需函数。我推荐使用R2020b及以上版本因为这些版本对图形渲染引擎进行了优化特别是在处理环形图表和透明度设置时表现更稳定。可以通过以下命令检查版本ver(MATLAB)如果使用的是较旧版本如R2016b可能需要额外安装Statistics and Machine Learning Toolbox来获取核密度估计函数。2.2 必要工具箱确认执行以下命令检查是否安装了必需的工具箱% 检查统计和机器学习工具箱 if ~license(test, Statistics_Toolbox) error(需要安装Statistics and Machine Learning Toolbox) end % 检查图形处理工具箱 if ~license(test, Image_Toolbox) warning(建议安装Image Processing Toolbox以获得更好的图形输出质量) end3. 环形柱状图的实现步骤3.1 数据准备与参数计算假设我们有5个类别的数据要展示categories {A, B, C, D, E}; values [15, 23, 18, 32, 12]; colors [0.2 0.4 0.6; 0.3 0.5 0.7; 0.4 0.6 0.8; 0.5 0.7 0.9; 0.6 0.8 1.0];环形图的关键参数计算total sum(values); percentages values / total * 100; angles cumsum([0, percentages]) * 3.6; % 转换为角度 radius_inner 0.6; % 内半径控制环的宽度 radius_outer 1.0; % 外半径3.2 绘制环形柱状图使用polarplot函数创建基础环形图figure(Position, [100 100 800 600]) hold on for i 1:length(values) theta linspace(angles(i), angles(i1), 100); rho_inner ones(size(theta)) * radius_inner; rho_outer ones(size(theta)) * radius_outer; % 绘制扇形区域 patch([rho_inner.*cosd(theta) fliplr(rho_outer.*cosd(theta))], ... [rho_inner.*sind(theta) fliplr(rho_outer.*sind(theta))], ... colors(i,:), EdgeColor, none) end % 添加中心空白区域使成为环形 rectangle(Position, [-radius_inner, -radius_inner, 2*radius_inner, 2*radius_inner], ... Curvature, [1 1], FaceColor, w, EdgeColor, none)3.3 添加标签与修饰优化环形图的可读性% 添加类别标签 for i 1:length(values) mid_angle (angles(i) angles(i1)) / 2; text(radius_outer*1.1*cosd(mid_angle), radius_outer*1.1*sind(mid_angle), ... sprintf(%s\n%.1f%%, categories{i}, percentages(i)), ... HorizontalAlignment, center, FontSize, 10) end % 设置极坐标属性 set(gca, Color, none, XTick, [], YTick, []) axis equal title(环形柱状图示例, FontSize, 14)4. 核密度面积图的实现4.1 核密度估计计算生成模拟数据并计算核密度% 生成随机数据实际应用中替换为你的数据 rng(42); % 设置随机种子保证可重复性 data [randn(100,1)*0.51; randn(80,1)*0.72; randn(120,1)*0.63]; % 计算核密度估计 [pdf_values, xi] ksdensity(data, Bandwidth, 0.3, NumPoints, 200); % 归一化处理以适应环形图内部空间 max_pdf max(pdf_values); scaled_pdf pdf_values / max_pdf * radius_inner * 0.9; % 缩放因子0.9留出边距4.2 绘制核密度面积图在环形图中心区域添加核密度图% 创建极坐标下的核密度图 theta_kde linspace(0, 360, length(xi)); rho_kde scaled_pdf; % 填充面积图 patch([rho_kde.*cosd(theta_kde), fliplr(zeros(size(theta_kde)))], ... [rho_kde.*sind(theta_kde), fliplr(zeros(size(theta_kde)))], ... [0.8 0.2 0.2], FaceAlpha, 0.6, EdgeColor, none) % 添加中心参考线 plot([0 0], [-radius_inner*0.1 radius_inner*0.1], k-, LineWidth, 1) plot([-radius_inner*0.1 radius_inner*0.1], [0 0], k-, LineWidth, 1)4.3 添加分布特征标记标注数据分布的关键特征点% 计算并标记中位数和均值 median_val median(data); mean_val mean(data); [~, median_idx] min(abs(xi - median_val)); [~, mean_idx] min(abs(xi - mean_val)); % 标记中位数 plot(scaled_pdf(median_idx)*cosd(theta_kde(median_idx)), ... scaled_pdf(median_idx)*sind(theta_kde(median_idx)), ... ko, MarkerFaceColor, w, MarkerSize, 8) text(scaled_pdf(median_idx)*1.2*cosd(theta_kde(median_idx)), ... scaled_pdf(median_idx)*1.2*sind(theta_kde(median_idx)), ... Median, FontSize, 9) % 标记均值 plot(scaled_pdf(mean_idx)*cosd(theta_kde(mean_idx)), ... scaled_pdf(mean_idx)*sind(theta_kde(mean_idx)), ... k^, MarkerFaceColor, w, MarkerSize, 8) text(scaled_pdf(mean_idx)*1.2*cosd(theta_kde(mean_idx)), ... scaled_pdf(mean_idx)*1.2*sind(theta_kde(mean_idx)), ... Mean, FontSize, 9)5. 组合图表的优化技巧5.1 视觉平衡调整组合图表时常见的挑战是保持视觉平衡环形图与核密度图的比例关系内半径(radius_inner)建议设置在0.5-0.7之间这样核密度图有足够展示空间颜色搭配环形图使用冷色调核密度图使用暖色调形成视觉对比透明度设置核密度图的FaceAlpha建议0.5-0.7既能展示下层信息又不喧宾夺主5.2 交互功能添加提升图表交互性的方法% 启用数据光标 dcm datacursormode(gcf); set(dcm, UpdateFcn, myupdatefcn) function output_txt myupdatefcn(~, event_obj) pos get(event_obj, Position); if norm(pos) radius_inner % 环形图区域提示 output_txt sprintf(类别: %s\n值: %.1f, categories{...}, values{...}); else % 核密度区域提示 [~, idx] min(abs(xi - ...)); output_txt sprintf(密度值: %.3f\n数据点: %.2f, pdf_values(idx), xi(idx)); end end5.3 导出高质量图像确保出版质量的导出设置% 矢量图导出推荐EPS或PDF print -depsc2 -r600 -painters combined_chart.eps % 位图导出高分辨率PNG print -dpng -r300 combined_chart.png % 使用exportgraphics函数R2020b exportgraphics(gcf, combined_chart.pdf, ContentType, vector, BackgroundColor, none)6. 实际应用案例解析6.1 市场调研数据分析在某电子产品市场调研中我们使用这种组合图表展示了环形图不同年龄段消费者的购买比例核密度图每个年龄段的消费金额分布通过这种可视化客户一眼就能看出25-34岁群体占比最大环形图面积最大55岁以上群体虽然占比小但消费金额分布更靠右核密度图右偏6.2 学术论文中的使用在一篇关于城市气候研究的论文中我们使用这种图表展示环形图不同季节的天数占比核密度图各季节温度值的分布这种呈现方式比传统的分面图facet plot更节省空间同时保持了数据之间的关联性。7. 常见问题与解决方案7.1 核密度估计的带宽选择带宽(bandwidth)参数对核密度估计结果影响很大。经过多次实践我总结出以下经验对于样本量100的数据使用Silvermans rule of thumbbw 0.9 * min(std(data), iqr(data)/1.34) * length(data)^(-1/5);对于多峰分布数据可以尝试较小的带宽如默认值的0.5倍使用交叉验证法确定最优带宽[~,~,bw] ksdensity(data, Bandwidth, [], Function, pdf, Kernel, normal);7.2 环形图的标签重叠问题当类别较多或某些类别占比较小时标签容易重叠。解决方法包括使用引导线连接标签和扇形% 在标签绘制代码中添加 line([radius_outer*cosd(mid_angle), radius_outer*1.1*cosd(mid_angle)], ... [radius_outer*sind(mid_angle), radius_outer*1.1*sind(mid_angle)], ... Color, [0.5 0.5 0.5], LineStyle, --)将小比例类别合并为其他类别使用交互式图表鼠标悬停时显示详细信息7.3 颜色映射的一致性确保颜色在不同图表元素间的一致性使用MATLAB内置的颜色映射colors parula(length(categories)); % 适用于环形图 kde_color winter(1); % 适用于核密度图创建自定义颜色主题并贯穿整个图表theme struct(); theme.ring_colors [0.2 0.4 0.6; 0.3 0.5 0.7; ...]; theme.kde_color [0.8 0.2 0.2];8. 高级扩展技巧8.1 动态数据更新创建可动态更新数据的图表% 创建持久化图形对象句柄 h_ring gobjects(length(categories), 1); h_kde gobjects(1); % 初始化图表后更新函数可以这样写 function updateChart(new_values, new_data) % 更新环形图 new_percentages new_values / sum(new_values) * 100; new_angles cumsum([0, new_percentages]) * 3.6; for i 1:length(new_values) theta linspace(new_angles(i), new_angles(i1), 100); set(h_ring(i), XData, [radius_inner*cosd(theta), fliplr(radius_outer*cosd(theta))], ... YData, [radius_inner*sind(theta), fliplr(radius_outer*sind(theta))]) end % 更新核密度图 [new_pdf, new_xi] ksdensity(new_data); new_scaled_pdf new_pdf / max(new_pdf) * radius_inner * 0.9; theta_kde linspace(0, 360, length(new_xi)); set(h_kde, XData, [new_scaled_pdf.*cosd(theta_kde), fliplr(zeros(size(theta_kde)))], ... YData, [new_scaled_pdf.*sind(theta_kde), fliplr(zeros(size(theta_kde)))]) end8.2 3D效果增强为图表添加伪3D效果% 为环形图添加阴影效果 for i 1:length(values) % 主扇形区域 patch([rho_inner.*cosd(theta) fliplr(rho_outer.*cosd(theta))], ... [rho_inner.*sind(theta) fliplr(rho_outer.*sind(theta))], ... colors(i,:), EdgeColor, none, FaceLighting, gouraud) % 添加侧面阴影 patch([rho_outer.*cosd(theta(1:10:end)); (rho_outer0.05).*cosd(theta(1:10:end))], ... [rho_outer.*sind(theta(1:10:end)); (rho_outer0.05).*sind(theta(1:10:end))], ... 0.7*colors(i,:), EdgeColor, none, FaceAlpha, 0.3) end % 为核密度图添加光照效果 light(Position,[1 1 1],Style,infinite) material dull8.3 多数据集对比在同一个环形图中嵌入多个核密度图进行对比% 假设有两组数据data1和data2 [pdf1, xi1] ksdensity(data1); [pdf2, xi2] ksdensity(data2); % 绘制第一个核密度图下半圆 theta1 linspace(180, 360, length(xi1)); rho1 pdf1/max(pdf1)*radius_inner*0.8; patch([rho1.*cosd(theta1), fliplr(zeros(size(theta1)))], ... [rho1.*sind(theta1), fliplr(zeros(size(theta1)))], ... [0.8 0.2 0.2], FaceAlpha, 0.6, EdgeColor, none) % 绘制第二个核密度图上半圆 theta2 linspace(0, 180, length(xi2)); rho2 pdf2/max(pdf2)*radius_inner*0.8; patch([rho2.*cosd(theta2), fliplr(zeros(size(theta2)))], ... [rho2.*sind(theta2), fliplr(zeros(size(theta2)))], ... [0.2 0.2 0.8], FaceAlpha, 0.6, EdgeColor, none) % 添加分隔线 plot([-radius_inner radius_inner], [0 0], k-, LineWidth, 1)

相关新闻

Matplotlib与LaTeX深度集成:实现出版级图表字体与公式统一

Matplotlib与LaTeX深度集成:实现出版级图表字体与公式统一

1. 项目概述:为什么要把Matplotlib和LaTeX绑在一起?如果你经常用Python的Matplotlib画图,然后需要把图放进论文、报告或者幻灯片里,大概率遇到过这种尴尬:图里的字体和正文对不上。正文用的是优雅的Times New Roman或者…

2026/8/1 3:00:53 阅读更多 →
别再用Excel记进度了!AI学习者必须掌握的3层动态追踪架构:数据层/认知层/动机层(含TensorFlow Lite轻量部署方案)

别再用Excel记进度了!AI学习者必须掌握的3层动态追踪架构:数据层/认知层/动机层(含TensorFlow Lite轻量部署方案)

更多请点击: https://intelliparadigm.com 第一章:AI 学习进度跟踪 在AI学习过程中,持续、可量化的进度跟踪是避免知识断层与目标偏移的关键。不同于传统课程的线性考核,AI学习路径具有高度个性化和实践驱动特征,需结…

2026/8/1 3:00:53 阅读更多 →
高效时间管理:构建2026年2月28日周六的规划系统

高效时间管理:构建2026年2月28日周六的规划系统

1. 项目背景与核心价值2026年2月28日周六这个看似简单的日期标记,实际上蕴含着时间管理、日程规划和个人效率提升的系统方法论。作为连续七年使用时间块管理法的实践者,我发现在数字化时代,人们越来越需要建立与时间的深度连接。这个日期背后…

2026/8/1 2:59:53 阅读更多 →

最新新闻

第2章 新篇08 莹姐申请转岗2

第2章 新篇08 莹姐申请转岗2

接上周,本周按约定莹姐1对1谈话。一、莹姐觉得不公平:原本觉得工作没有高低贵贱之分,但现在发现绩效总是集中在做“重点项目”的人身上,其他人也付出了很多,绩效却不够好。运维做得好,也应该是一种能力的体…

2026/8/1 3:41:09 阅读更多 →
基于 Free Pascal 从零编写裸机操作系统(一)

基于 Free Pascal 从零编写裸机操作系统(一)

前言 绝大多数入门操作系统教程都会选用 C 语言,很少有人尝试用 Pascal 开发裸内核。OSDev 官网提供了一套完整的 Free Pascal Bare Bones 最小操作系统示例,无需依赖 DOS、Linux、Windows 标准库,完全运行在 32 位保护模式下,兼…

2026/8/1 3:41:09 阅读更多 →
【方达炬治学】方达炬:在地球表面设置22°气温生命环境线,作为生命宜居带,确立生命活动周期同太阳活动相适应、及应对太阳工程日光威胁。

【方达炬治学】方达炬:在地球表面设置22°气温生命环境线,作为生命宜居带,确立生命活动周期同太阳活动相适应、及应对太阳工程日光威胁。

【方达炬治学】方达炬:在地球表面设置22气温生命环境线,作为生命宜居带,确立生命活动周期同太阳活动相适应、及应对太阳工程日光威胁。

2026/8/1 3:41:09 阅读更多 →
应届生注意:别浪费在校时间,AI能力将成为求职分水岭

应届生注意:别浪费在校时间,AI能力将成为求职分水岭

2026届全国普通高校毕业生规模达1270万人,同比增加48万,再创历史新高。 几乎同一时间,国家发改委在2026世界人工智能大会上公布:重点行业人工智能整体渗透率突破80%,今年相关产业增速预计超30%;工信部同步披…

2026/8/1 3:41:09 阅读更多 →
从“对话“到“执行“:MCP协议如何统一AI Agent与真实世界的连接方式?

从“对话“到“执行“:MCP协议如何统一AI Agent与真实世界的连接方式?

从"对话"到"执行":MCP协议如何统一AI Agent与真实世界的连接方式?当AI Agent只会"纸上谈兵"的时代终结,MCP协议正在成为连接认知与行动的统一桥梁。本文深入解析MCP的核心架构、无状态化演进,以及它…

2026/8/1 3:41:09 阅读更多 →
STM32阻塞与非阻塞延时:从系统卡死到高效多任务编程

STM32阻塞与非阻塞延时:从系统卡死到高效多任务编程

1. 从一次“卡死”的调试经历说起那天下午,我正在调试一个基于STM32的智能小车项目。小车的核心逻辑很简单:主循环里,超声波传感器测距,然后根据距离控制电机和舵机。我信心满满地烧录了代码,结果小车启动后&#xff0…

2026/8/1 3:40:09 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →