使用 Matlab 绘制带有纹理的柱状图

以下是效果

1. 在 Matlab 里安装两个额外的库: hatchfill2 和 legendflex。

(1)搜索并安装 hatchfill2,用来画纹理

(2) 搜索并安装 legendflex,用来画自定义的图例

2. 代码(说明见注释)

data = rand(8, 5);% 图例文本,因为这个例子是 stacked bar chart, data 数组的每一行是一根柱子,每一列是其中的
% 一段,所以一共有 8 条柱子,每条都被分为了 5 段,每一段是一个 category.
legendData = {'Category 1', 'Category 2', 'Category 3', 'Category 4', 'Category 5'};% 颜色数组,可以设置为任何喜欢的颜色,hex2rgb 会把 16 进制的颜色数据转化为 rgb 数组
color_vec = [hex2rgb("#005C53");hex2rgb("#9FC131");hex2rgb("#DBF227");hex2rgb("#D6D58E");
];% 预定义的纹理组合,尽量让 texture_types 的数目和 color_vec 互质,这样轮询起来
% 可以得到的组合更多
texture_types = {struct('HatchStyle', 'single', 'HatchAngle', 45, 'HatchDensity', 20, 'HatchColor', 'black', 'HatchLineWidth', 0.5);struct('HatchStyle', 'single', 'HatchAngle', -45, 'HatchDensity', 20, 'HatchColor', 'black', 'HatchLineWidth', 0.5);struct('HatchStyle', 'single', 'HatchAngle', 90, 'HatchDensity', 20, 'HatchColor', 'black', 'HatchLineWidth', 0.5);struct('HatchStyle', 'single', 'HatchAngle', 0, 'HatchDensity', 20, 'HatchColor', 'w', 'HatchLineWidth', 0.5);struct('HatchStyle', 'cross', 'HatchAngle', 30, 'HatchDensity', 15, 'HatchColor', 'black', 'HatchLineWidth', 0.5);
};% 创建图形并调整大小
figure('Position', [100, 100, 800, 600]);
hold on;% 初始化柱状图对象单元数组
bars = cell(size(data, 1), 1);% 绘制堆叠的柱状图并设置底色和纹理填充
for i = 1:size(data, 1)% 如果把'stacked'去掉,就会得到分组的柱状图b = bar(i, data(i, :), 'stacked', 'FaceColor', 'flat');bars{i} = b; % 存储主 bar 对象for j = 1:size(data, 2)color_idx = mod(j - 1, size(color_vec, 1)) + 1;texture_idx = mod(j - 1, length(texture_types)) + 1;b(j).FaceColor = color_vec(color_idx, :);% 应用纹理组合tex = texture_types{texture_idx};hatchfill2(b(j), tex);end
end% 将 bars 转换为矩阵以用于 legendflex
barsMatrix = [bars{:}];% 调整坐标轴的位置以给图例腾出空间,如果不设置,图例肯能会画到外面,只显示
% 一部分
pos1 = get(gca, 'Position');
set(gca, 'Position', [pos1(1), pos1(2), pos1(3) * 0.75, pos1(4)]);% 创建自定义图例并设置位置
[legend_h, object_h, plot_h, text_str] = legendflex(barsMatrix, legendData, ...'FontSize', 14, 'ref', gca, 'anchor', [4 8], 'buffer', [10 0]);% 为图例中的柱状图添加纹理填充
numPatches = numel(object_h) - numel(legendData); % 计算图例中需要添加纹理的补丁数量
for k = 1:numPatchestexture_idx = mod(k - 1, length(texture_types)) + 1;tex = texture_types{texture_idx};hatchfill2(object_h(numel(legendData) + k), tex);
end% 设置坐标轴属性
set(gca, 'FontSize', 14);
grid on;
% set(gca, 'XMinorTick', 'on', 'XMinorGrid', 'on', 'YMinorTick', 'on', 'YMinorGrid', 'on');% 设置 x 轴和 y 轴范围
xlim([0, size(data, 1) + 1]);
ylim([0, max(sum(data, 2)) * 1.1]);% 设置 x 轴刻度标签
set(gca, 'XTick', 1:size(data, 1), 'XTickLabel', arrayfun(@(x) sprintf('Group %d', x), 1:size(data, 1), 'UniformOutput', false));% 显示图形
hold off;% hex2rgb 函数
function rgb = hex2rgb(hex)hex = char(hex);assert(size(hex, 2) == 7 && hex(1) == '#', 'Input must be a char array of the form "#RRGGBB"');rgb = reshape(sscanf(hex(2:end), '%2x') / 255, 1, 3);
end

3. 图例位置调整

参考 legendflex的文档,anchor 参数里设两个数字,表示图片的哪个锚点和图例的哪个锚点对齐,例如,上述例子中 [4 8], 4 表示图片的 east 锚点,8表示图例的 west 锚点。这一步让图例的左侧紧贴图片的右侧。buffer 参数定义图例的偏移量,[10 0]表示让图例向右偏移10个单位。

  • 1 ('nw'): 西北角
  • 2 ('n'): 北边中心
  • 3 ('ne'): 东北角
  • 4 ('e'): 东边中心
  • 5 ('se'): 东南角
  • 6 ('s'): 南边中心
  • 7 ('sw'): 西南角
  • 8 ('w'): 西边中心

如果图例显示不全,可以用 set(gca, 'Position', ...) 调整位置,给图例腾出空间。

参考

  • Hatchfill2: https://www.mathworks.com/matlabcentral/fileexchange/53593-hatchfill2
  • legendflex: https://www.mathworks.com/matlabcentral/fileexchange/31092-legendflex-m-a-more-flexible-customizable-legend
  • Simeon 的回答:https://www.mathworks.com/matlabcentral/answers/478956-getting-hatchfill-to-properly-display-a-patch-legend#answer_920769

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

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

相关文章

排序算法辨析(快速记忆版)(冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序)保研面经

选择排序:摸到一叠牌,每次选择出最小的放在合适的位置(第一次放在第一张,第二次放在第二张),实现排序 最好最坏都是 O(n^2) 插入排序:摸牌的时候一张一张摸,每…

每日Attention学习14——Efficient Self-Attention

模块出处 [MICCAI 22] [link] [code] Lesion-aware Dynamic Kernel for Polyp Segmentation 模块名称 Efficient Self-Attention (ESA) 模块作用 高效自注意力 模块结构 模块思想 Self Attention操作在具有优秀的长距离建模能力的同时,也有着较高的计算与内存成…

【DevOps工具链】DevOps工具链的基本组成与功能

DevOps工具链 DevOps工具链的基本组成与功能 目录 引言DevOps概述DevOps工具链组成 版本控制持续集成持续交付与部署配置管理监控与日志管理 典型DevOps工具介绍 GitJenkinsDockerKubernetesAnsiblePrometheus和Grafana DevOps工具链的最佳实践结论 引言 在现代软件开发中&…

缓存策略自定义:Laravel应用性能优化秘籍

缓存策略自定义:Laravel应用性能优化秘籍 在现代Web应用中,缓存是一种提高应用性能和响应速度的有效手段。Laravel框架提供了强大的缓存机制,支持多种缓存驱动,如文件、数据库、Redis等。然而,在某些情况下&#xff0…

Vue 3 状态管理 Pinia 详解

引言 随着 Vue 3 的推出,Pinia 成为了 Vue 社区中一个备受瞩目的状态管理库。它简洁而强大,旨在替代 Vuex,为开发者提供更加灵活的状态管理解决方案。本文将详细介绍 Pinia 的核心概念、安装方法、使用技巧以及如何在 Vue 3 项目中集成 Pini…

学习ruixingkafei过程

一、抓包 手机安装证书,开启VPN抓包,电脑上打开花瓶,在同一个局域网内抓包,这些老一套没什么可说的。 看看我们的抓包结果是不是很美丽,请求内容加密,返回内容也加密,猜测加密方式aes&#xff0…

JWT (JSON Web Token)

🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…

AI绘画3分钟解决英文恐惧症,comfyui汉化插件

前言 全面解析:Comfy UI汉化插件的安装与配置指南 本文涉及的工作流和插件,需要的朋友请扫描免费获取哦 引言 本文图片来源网络,侵权联删除。 在全球化的今天,软件界面的本地化是提升用户体验的重要一环。对于许多非英语母语的…

Java面试题基础

基础总结 Java Java 平台无关性 主要通过三个方面实现. Java 语言规范: 通过规定 Java 语言中基本数据类型的取值范围和行为,比如 int 长度为 4 字节,这是固定的。Class 文件: 所有 Java 文件要通过 javac 或者其他一些 java 编…

EasyExcel入门

目录 一、文章简介 二、概念 1.EasyExcel是什么? 2.EasyExcel 能用在哪里? 3.为什么要选用EasyExcel解析excel? 4.如何使用EasyExcel? 三、EasyExcel快速入门 1.环境搭建 2.简单写excel 代码示例 TestFileUtil Employe…

iPhone最全隐藏功能

让你的iphone没有白买!一定要学会以下三十个iphone技巧: 一、正品苹果手机输入“苹果”会出现图标,山寨或其他机型只能打出红色的 二、长按图片中的人像不松,可以自动抠图。 三、Siri换男生,设置-Siri与搜索- Siri声音…

关于ollama+open webui无法局域网访问的解决办法

ollama api本地默认地址:http://127.0.0.1:11434 open webui的默认地址:http://127.0.0.1:3000 如果是本机访问,ollama默认允许本机跨域访问(哈里是看ollama的日志都是OPTIONS请求,bing后发现的)&#xf…

TensorFlow 可用的人脸识别的模型有哪些,各有什么优缺点

在使用TensorFlow进行人脸识别时,有多种可用的模型,每种模型在性能和应用场景方面各有不同。以下是一些常用的人脸识别模型及其优缺点: 1. FaceNet 优点: 高准确性:FaceNet通过计算脸部特征向量并进行向量比较,具有较高的识别准确性。通用性强:生成128维特征向量,可以…

Mysql:删除库下面所有表

Mysql删除库下面所有表 方法一 1、删除数据库: DROP DATABASE your_database_name;2、重新创建数据库: CREATE DATABASE your_database_name;方法二 1、生成删除表语句 SET FOREIGN_KEY_CHECKS 0;SELECT Concat(DROP TABLE IF EXISTS , table_nam…

Linux的NTP配置

一、监控时间: watch date 二、NTP配置 1、查看时间 ntpdate -q 192.168.192.3 ntpdate 192.168.192.3 2、配置时间服务器 vi /etc/ntp.conf server 192.168.192.3 iburst 3、设置时间不允许回调 vi /etc/sysconfig/ntpd OPTIONS"-u ntp:ntp -p /va…

什么时候使用auto

合理使用auto&#xff0c;可以让程序员从复杂的类型编码中解放出来&#xff0c;合理使用auto&#xff0c;可以让程序员从复杂的类型编码中解放出来。 那么什么时候使用auto呢&#xff1f; 1&#xff0e;当一眼就能看出声明变量的初始化类型的时候可以使用auto。 std::map<…

心灵调整:音乐之美

音乐每天都在不同的空间和复杂的形式影响着人们。从电梯音乐削减尴尬的沉默,到家庭交通堵塞。音乐增强了人们所爱的人与人之间的瞬间,并帮助他们度过艰难时期。音乐被用于世界各地几代人的各种形式的治疗。本文进一步阐述了它如何在几种类型的心理健康状况中得到应用。 什么是音…

【SOC 芯片设计 DFT 学习专栏 -- DFT DRC规则检查】

请阅读【嵌入式及芯片开发学必备专栏】 请阅读【芯片设计 DFT 学习系列 】 如有侵权&#xff0c;请联系删除 转自&#xff1a; 芯爵ChipLord 2024年07月10日 12:00 浙江 文章目录 概述DRC的概念Tessent DRC检查的概述时钟相关检查扫描相关检查BIST规则检查预DFT时钟规则检查 …

typescript 其他数据类型说明

/* any、unknown、never类型的区别相同&#xff1a;都是可以赋值任何类型 不同&#xff1a;any可以再赋任何值。unknown二次赋值只能再给any&#xff5c;unknown&#xff0c;不能时其他类型。never绝不能赋值&#xff0c;包括初始化赋值。*/let value1: any "123";…

SQL优化(一)基础概念

基数&#xff08;cardinality&#xff09; 表中某个列的唯一键的数量叫做基数&#xff0c;主键列的基数就是表中数据的总行数。 可以用select count(distinct 列名) from 表名来计算基数。 基数的高低影像列的数据分布。 例如&#xff1a;先用Scott账户创建一个测试表test …