MATLAB | 怎样绘制这样的环形柱状图

news2025/2/4 17:55:10

Hey, 各位又是好久不见,最近忙到后台消息都有些来不及看,非常抱歉,今天带来一个环形柱状图绘制的简易小代码,绘制效果如下:


下面直接给出完整代码,替换一下数据即可,代码都有注释的:

完整代码

环形柱状图

% author : slandarer

% 生成随机数据
rng(13)
Data = randi([1,100], [6,1]);

% 数据名称
% 'Class-1','Class-2',... ...,'Class-6'
Name  = compose('Class-%d', 1:6);

% 配色
% 更多配色详见 Zhaoxu Liu / slandarer (2024). 
% 2000 palettes (https://www.mathworks.com/matlabcentral/fileexchange/126969-2000-palettes), 
% MATLAB Central File Exchange.
CList = [0.8941    0.8706    0.8078
    0.9255    0.7412    0.5843
    0.6078    0.6941    0.7333
    0.4745    0.6745    0.7412
    0.2039    0.3961    0.4588
    0.0431    0.2588    0.1294];
% CList = colorDemo(11)

% 数据展示范围及刻度
YLim = [0,100];
YTick = [];

% =========================================================================
% 开始绘图
if isempty(YLim) || isempty(YTick)
    tFig = figure('Visible', 'off');
    tAx = axes('Parent',tFig);
    tAx.NextPlot = 'add';
    bar(tAx, Data)
    if isempty(YLim), YLim = tAx.YLim; else, tAx.YLim = YLim; end
    if isempty(YTick), YTick = tAx.YTick; end
    close(tFig)
end
% 创建图窗
fig = figure('Units','normalized', 'Position',[.2,.1,.5,.8]);
ax = axes('Parent',fig, 'Position',[0,0,1,1]);
ax.NextPlot = 'add';
ax.XColor = 'none';
ax.YColor = 'none';
ax.DataAspectRatio = [1,1,1];
% 绘制坐标轴和刻度线
TLim = [pi/2, -pi - pi/6];
t01 = linspace(0, 1, 80);
N = length(Data);
tT = t01.*diff(TLim) + TLim(1);
tX = cos(tT).*(N + N/2 + 1);
tY = sin(tT).*(N + N/2 + 1);
plot(ax, tX, tY, 'LineWidth',.8, 'Color','k')
ax.XLim = [-1,1].*(N + N/2 + 2);
ax.YLim = [-1,1].*(N + N/2 + 2);
tT = (YTick - YLim(1))./diff(YLim).*diff(TLim) + TLim(1);
tX = [cos(tT).*(N + N/2 + 1); cos(tT).*(N + N/2 + 1 + N/50); tT.*nan];
tY = [sin(tT).*(N + N/2 + 1); sin(tT).*(N + N/2 + 1 + N/50); tT.*nan];
plot(ax, tX(:), tY(:), 'LineWidth',.8, 'Color','k')
for i = 1:length(YTick)
    iT = tT(i); iR = iT/pi*180;
    YTickHdl = text(ax, tX(2,i), tY(2,i),...
        num2str(YTick(i)), 'FontName','Times New Roman', 'FontSize',13, 'HorizontalAlignment','center');
    if mod(iR, 360) > 180 && mod(iR, 360) < 360
        YTickHdl.Rotation = iR + 90;
        YTickHdl.VerticalAlignment = 'top';
    else
        YTickHdl.Rotation = iR - 90;
        YTickHdl.VerticalAlignment = 'bottom';
    end
end
% 绘制柱状图
for i = 1:N
    tR = [(N + N/2 + 1 - i - .4).*ones(1, 80), (N + N/2 + 1 - i + .4).*ones(1, 80)];
    tT = t01.*(Data(i) - YLim(1))./diff(YLim).*diff(TLim) + TLim(1);
    tX = cos([tT, tT(end:-1:1)]).*tR;
    tY = sin([tT, tT(end:-1:1)]).*tR;
    fill(ax, tX, tY, CList(i,:), 'LineWidth',1, 'EdgeColor','k')
end
% 绘制数据名称
for i = 1:N
    text(ax, 0, N + N/2 + 1 - i, [Name{i},'  '], 'FontName','Times New Roman',...
        'FontSize',16, 'HorizontalAlignment','right');
end

堆叠环形柱状图

clc; clear
% author : slandarer

% 生成随机数据
rng(6)
Data = randi([1,100], [6,5]);

% 数据名称
% 'Class-1','Class-2',... ...,'Class-6'
Name1 = compose('Class-%d', 1:6);
Name2 = compose('Prop-%d', 1:5);

% 配色
% 更多配色详见 Zhaoxu Liu / slandarer (2024). 
% 2000 palettes (https://www.mathworks.com/matlabcentral/fileexchange/126969-2000-palettes), 
% MATLAB Central File Exchange.
CList = [0.8941    0.8706    0.8078
    0.9255    0.7412    0.5843
    0.6078    0.6941    0.7333
    0.4745    0.6745    0.7412
    0.2039    0.3961    0.4588
    0.0431    0.2588    0.1294];
% CList = colorDemo(11)

% 数据展示范围及刻度
YLim = [];
YTick = [];

% =========================================================================
% 开始绘图
if isempty(YLim) || isempty(YTick)
    tFig = figure('Visible', 'off');
    tAx = axes('Parent',tFig);
    tAx.NextPlot = 'add';
    bar(tAx, Data, 'stacked')
    if isempty(YLim), YLim = tAx.YLim; else, tAx.YLim = YLim; end
    if isempty(YTick), YTick = tAx.YTick; end
    close(tFig)
end
% 创建图窗
fig = figure('Units','normalized', 'Position',[.2,.1,.5,.8]);
ax = axes('Parent',fig, 'Position',[0,0,1,1]);
ax.NextPlot = 'add';
ax.XColor = 'none';
ax.YColor = 'none';
ax.DataAspectRatio = [1,1,1];
% 绘制坐标轴和刻度线
TLim = [pi/2, -pi - pi/6];
t01 = linspace(0, 1, 80);
N = size(Data, 1);
tT = t01.*diff(TLim) + TLim(1);
tX = cos(tT).*(N + N/2 + 1);
tY = sin(tT).*(N + N/2 + 1);
plot(ax, tX, tY, 'LineWidth',.8, 'Color','k')
ax.XLim = [-1,1].*(N + N/2 + 2);
ax.YLim = [-1,1].*(N + N/2 + 2);
tT = (YTick - YLim(1))./diff(YLim).*diff(TLim) + TLim(1);
tX = [cos(tT).*(N + N/2 + 1); cos(tT).*(N + N/2 + 1 + N/50); tT.*nan];
tY = [sin(tT).*(N + N/2 + 1); sin(tT).*(N + N/2 + 1 + N/50); tT.*nan];
plot(ax, tX(:), tY(:), 'LineWidth',.8, 'Color','k')
for i = 1:length(YTick)
    iT = tT(i); iR = iT/pi*180;
    YTickHdl = text(ax, tX(2,i), tY(2,i),...
        num2str(YTick(i)), 'FontName','Times New Roman', 'FontSize',13, 'HorizontalAlignment','center');
    if mod(iR, 360) > 180 && mod(iR, 360) < 360
        YTickHdl.Rotation = iR + 90;
        YTickHdl.VerticalAlignment = 'top';
    else
        YTickHdl.Rotation = iR - 90;
        YTickHdl.VerticalAlignment = 'bottom';
    end
end

Data = cumsum([zeros(N, 1), Data], 2);
% 绘制柱状图
for i = 1:N
    for j = 1:(size(Data, 2) - 1)
        tR = [(N + N/2 + 1 - i - .4).*ones(1, 80), (N + N/2 + 1 - i + .4).*ones(1, 80)];
        tT = (t01.*(Data(i, j + 1) - Data(i, j)) + Data(i, j) - YLim(1))./diff(YLim).*diff(TLim) + TLim(1);
        tX = cos([tT, tT(end:-1:1)]).*tR;
        tY = sin([tT, tT(end:-1:1)]).*tR;
        tHdl = fill(ax, tX, tY, CList(j,:), 'LineWidth',1, 'EdgeColor','k');
        if i == 1
            lgdHdl(j) = tHdl;
        end
    end
end
% 绘制数据名称
for i = 1:N
    text(ax, 0, N + N/2 + 1 - i, [Name1{i},'  '], 'FontName','Times New Roman',...
        'FontSize',16, 'HorizontalAlignment','right');
end
% 绘制图例
legend(lgdHdl, Name2, 'FontName','Times New Roman',...
    'FontSize',16, 'Box','off', 'Location','best',...
    'Position',[.22, .93 - .04*(size(Data, 2) - 1), .1, .04*(size(Data, 2) - 1)]);

更多配色

更多配色可以前往以下fileexchange或者gitee仓库获取:

fileexchange

  • Zhaoxu Liu / slandarer (2024). 2000 palettes (https://www.mathworks.com/matlabcentral/fileexchange/126969-2000-palettes), MATLAB Central File Exchange. Retrieved June 22, 2024.

gitee

  • https://gitee.com/slandarer/slanColor

当然若是懒得去下载,这里也准备了一系列配色数据,复制使用即可:

function CList = colorDemo(N)
% color demos
C{1} = [
    0.8627    0.7608    0.4784
    0.6902    0.7255    0.7451
    0.3882    0.3765    0.3725
    0.5961    0.3686    0.3608
    0.6824    0.7490    0.6588
    0.9451    0.6078    0.2039
];
C{2} = [
    0.1098    0.2000    0.2000
    0.1333    0.3765    0.3765
    0.3882    0.6118    0.6431
    0.8235    0.6784    0.4863
    0.7451    0.4471    0.2706
    0.2745    0.1294    0.1098 
];
C{3} = [
    0.0314    0.0902    0.2275
    0.0039    0.1843    0.3255
    0.0039    0.4275    0.5137
    0.0078    0.6275    0.6353
    0.6745    0.5882    0.4745
    0.9137    0.8706    0.7059
];
C{4} = [
    0.0235    0.5529    0.6157
    0.3961    0.6588    0.6706
    0.5490    0.7412    0.7373
    0.6784    0.7255    0.6314
    0.7373    0.7608    0.6471
    0.8157    0.6863    0.5176
];
C{5} = [
    0.8627    0.6549    0.3804
    0.7765    0.7569    0.4275
    0.5451    0.6118    0.5804
    0.3843    0.5490    0.6471
    0.3529    0.4235    0.4784
    0.3176    0.3098    0.3608
];
C{6} = [
    0.3490    0.3490    0.3608
    0.4510    0.6196    0.6706
    0.1725    0.2118    0.2235
    0.2118    0.3333    0.3686
    0.9765    0.6196    0.5765
    0.7686    0.2392    0.1922
];
C{7} = [
    0.8588    0.7569    0.5922
    0.2157    0.1765    0.1843
    0.3569    0.4863    0.6549
    0.8588    0.6000    0.2588
    0.5529    0.6824    0.5294
    0.5961    0.3529    0.4431
];
C{8} = [
    0.8353    0.6824    0.3882
    0.4314    0.4235    0.5059
    0.9686    0.9255    0.8471
    0.2471    0.2235    0.2235
    0.5765    0.6784    0.5647
    0.7882    0.7176    0.5765
];
C{9} = [
    0.5176    0.4863    0.6392
    0.8941    0.3529    0.3529
    0.9569    0.6510    0.3686
    0.5020    0.4745    0.1686
    0.9490    0.8353    0.4353
    0.1020    0.0706    0.2157
];
C{10} = [
    0.4314    0.4863    0.7255
    0.4824    0.7373    0.8353
    0.8157    0.8863    0.6863
    0.9608    0.8588    0.6000
    0.9098    0.6118    0.5059
    0.8235    0.5176    0.5529
];
C{11} = [
    0.8353    0.4784    0.4275
    0.9098    0.7176    0.3843
    0.6118    0.8039    0.8745
    0.3216    0.3137    0.3216
    0.9020    0.8078    0.6863
    0.7294    0.5843    0.4392
];
C{12} = [
    0.8510    0.3373    0.3608
    0.9490    0.5412    0.5412
    0.9294    0.6627    0.6706
    0.1059    0.7137    0.6863
    0.0314    0.5451    0.7451
    0.0902    0.1569    0.4118
];
CList = C{N};
end




以上已经是完整代码,若懒得复制可去以下gitee仓库获取完整文件夹:

  • https://gitee.com/slandarer/spdraw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis—SortedSet数据类型及其常用命令详解

文章目录 一、Redis概述SortedSet类型1 ZADD&#xff1a;向有序集合添加成员2 ZREM&#xff1a;从有序集合中移除一个或多个成员3 ZSCORE : 获取sorted set中的指定元素的score值4 ZRANK&#xff1a;获取sorted set 中的指定元素的排名5 ZCARD&#xff1a;获取sorted set中的元…

库卡机器人减速机维修齿轮磨损故障

一、KUKA机器人减速器齿轮磨损故障的原因 1. 润滑不足&#xff1a;润滑油不足或质量不佳可能导致齿轮磨损。 2. 负载过重&#xff1a;超过库卡机械臂减速器额定负载可能导致齿轮磨损。 3. 操作不当&#xff1a;未按照说明书操作可能导致KUKA机器人减速器齿轮磨损。 4. 维护不足…

Unity Apple Vision Pro 开发(三):visionOS 应用形态

文章目录 &#x1f4d5;教程说明&#x1f4d5;常用名词解释&#x1f4d5;visionOS 空间类型⭐Shared Space 共享空间⭐Full Space/Immersive Space 独占空间 &#x1f4d5;visionOS 渲染框架&#x1f4d5;Unity 开发 visionOS 应用的不同模式⭐**窗口模式**⭐VR 模式⭐MR 模式 …

关于edge浏览器注册Kaggle不显示验证部分的问题

使用edge注册kaggle没有显示验证的部分导致无法完成注册 法一 谷歌大法好&#xff0c;使用谷歌注册就么有问题&#xff0c;然鹅需要魔法上网。 法二 使用 edge的Header Editor的插件 收到邮件后填写即可 参考博客&#xff1a; Kaggle平台注册弹不出验证码怎么办&#…

【C++LeetCode】【热题100】最长连续序列【中等】-不同效率的题解【5】

题目&#xff1a; 暴力方法&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {int maxlen1;//定义最长连续序列if(nums.size()<1){//特殊情况的长度 等于序列长度return nums.size();}std::unordered_set<int> uniqu…

内容安全复习 8 - 视觉内容伪造与检测

文章目录 研究背景内容伪造方法虚假人脸生成人脸替换属性编辑表情重演跨模态人脸编辑 伪造检测方法眨眼检测交互式人脸活体检测一些了解方法挑战 研究背景 图像内容篡改造成新闻报道的偏颇易导致社会和公共秩序的不安&#xff0c;对公共安全产生不良影响。 造成的影响&#x…

数据结构经典面试之列表——C#和C++篇

文章目录 1. 数据结构概述2. 列表&#xff08;List&#xff09;的基本概念与操作3. 列表的具体实现方式3.1 数组实现3.2 链表实现 4. 列表在C#和C中的使用示例4.1 C#中的列表使用示例4.2 C中的列表使用示例 5. 总结 数据结构是计算机科学中非常重要的一个领域&#xff0c;它主要…

vue-cli 根据文字生成pdf格式文件 jsPDF

1.安装jspdf npm install jspdf --save 2.下载ttf格式文件 也可以用C:\Windows\Fonts下的字体文件&#xff0c;反正调一个需要的ttf字体文件就行&#xff0c;但有的字体存在部分字体乱码现象 微软雅黑ttf下载地址&#xff1a; FontsMarket.com - Download Microsoft YaHei …

一种基于稀疏学习的旋转机械故障诊断方法(MATLAB)

稀疏表示方法是一种利用最少原子在过完备字典上表示或逼近信号的方法&#xff0c;该方法具有信号表示的高分辨率、稀疏性、强抗干扰能力和自适应性等优点。稀疏表示聚焦于设计合适的稀疏表示字典和挖掘有用的稀疏先验信息&#xff0c;其核心思想是将故障特征信息近似表示为字典…

数据挖掘与分析——数据预处理

数据探索 波士顿房价数据集&#xff1a;卡内基梅隆大学收集&#xff0c;StatLib库&#xff0c;1978年&#xff0c;涵盖了麻省波士顿的506个不同郊区的房屋数据。 一共含有506条数据。每条数据14个字段&#xff0c;包含13个属性&#xff0c;和一个房价的平均值。 数据读取方法…

Ubuntu安装Vins-Fusion(1) —— Ubuntu18.04安装vins-fusion

目录 前言 1、准备1.1 安装ROS1.2 安装 Ceres Solver 2、安装 VINS-Fusion3、测试&#xff08;EuRoC MAV 数据集&#xff09;3.1、下载数据集3.2 Monocualr camera IMU3.3 Stereo cameras IMU3.4 Stereo cameras 参考 前言 VINS-Fusion 是一种基于优化的多传感器状态估计器&…

华为RH2288 V3安装 Linux 系统,安装过程心得

带着U盘&#xff0c;怀着激动的心情进入机房安装操作系统&#xff0c;结果没有显示器和键盘鼠标&#xff0c;傻眼了。 作为过来人&#xff0c;温馨提醒&#xff0c;进入机房前记得先打听&#xff0c;准备好这些&#xff1a;机房房间号、机柜编号、物理机编号、键盘、鼠标、显示…

C#调用OpenCvSharp计算并显示带掩膜的图像直方图

之前的文章简要测试了调用OpenCvSharp的Cv2.CalcHist函数计算直方图的用法&#xff0c;不过使用过程中参数mask的值始终为null&#xff0c;也就是计算的整幅图像的直方图&#xff0c;如果mask不为空&#xff0c;则可以计算图像指定区域的直方图&#xff0c;本文学习掩膜的创建方…

一键部署开源PaaS服务Dokploy,代替Vercel, Netlify 以及 Heroku

前言 Vercel, Netlify 以及 Heroku都是知名的PaaS&#xff08;Platform as a Service|平台即服务&#xff09;服务商&#xff0c;利用这些平台我们可以方便快捷的进行项目部署。尤其是各家生态完善&#xff0c;是很多独立开发者的首选之地。 但是随之而来的就是另外的隐患了&…

如何用Spring使用Redis作为消息订阅?

目录 一、Spring 框架介绍二、Redis 框架介绍三、什么是消息订阅四、如何用Spring使用Redis作为消息订阅 一、Spring 框架介绍 Spring 框架是一个开源的 Java 平台&#xff0c;它提供了全面的基础设施支持&#xff0c;以便您可以更容易地开发 Java 应用程序。Spring 处理了基础…

全局唯一ID生成

全局ID生成器&#xff0c;是一种在分布式系统下用来生成全局唯一ID的工具需满足以下特性&#xff1a; 唯一性、递增性、安全性、高可用、高性能 生成在所有库或表中都满足唯一得ID 实现&#xff1a; 利用Redis的自增功能 INCRBY key increment (INCRBY | Docs)&#xff0c;并在…

mysql 某个时间字段取值时间标识的字符串的值

SELECT STR_TO_DATE(substr(out_trade_no, 1,14), %Y-%m-%d %H:%i:%s) FROM o_order WHERE id 364457; UPDATE o_order SET created_time DATE_FORMAT(STR_TO_DATE(substr(out_trade_no, 1,14), %Y%m%d %H%i%s), %Y-%m-%d %H:%i:%s) WHERE id 364457; 举例&#xff1a; 1…

第9章 EM算法:例题及课后习题

1 概要 1&#xff0e;EM算法是含有隐变量的概率模型极大似然估计或极大后验概率估计的迭代算法。含有隐变量的概率模型的数据表示为 P ( Y , Z ∣ θ ) P(Y,Z|\theta) P(Y,Z∣θ)。这里&#xff0c; Y Y Y是观测变量的数据&#xff0c; Z Z Z是隐变量的数据&#xff0c; θ \t…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch4 值迭代 与 策略迭代 【动态规划 model-based】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、过 电子书 补充 【下载&#xff1a; 本章 PDF 电子书 GitHub】 [又看了一遍视频。原来第一次跳过了好多内容。。。] 3、总体 MOOC 过一遍 习题 学堂在线 课程页面链接 中国大学MOOC 课程页面链…