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

news2024/9/9 0:45:27

以下是效果

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:numPatches
    texture_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.coloradmin.cn/o/1958635.html

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

相关文章

Centos 7系统(最小化安装)安装Git 、git-man帮助、补全git命令-详细文章

安装之前由于是最小化安装centos7安装一些开发环境和工具包 文章使用国内阿里源 cd /etc/yum.repos.d/ && mkdir myrepo && mv * myrepo&&lscurl -O https://mirrors.aliyun.com/repo/epel-7.repo;curl -O https://mirrors.aliyun.com/repo/Centos-7…

docker安装phpMyAdmin

直接安装phpMyAdmin需要有php环境,比较麻烦,总结了使用docker安装方法,并提供docker镜像。 1.docker镜像 见我上传的docker镜像:https://download.csdn.net/download/taotao_guiwang/89595177 2.安装 1).加载镜像 docker load …

(leetcode学习)24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出:[2,1,4…

Sonatype Nexus Repository搭建与使用(详细教程3.70.1)

目录 一. 环境准备 二. 安装jdk 三. 搭建Nexus存储库 四. 使用介绍 一. 环境准备 主机名IP系统软件版本配置信息nexus192.168.226.26Rocky_linux9.4 Nexus Repository 3.70.1 MySQL8.0 jdk-11.0.23 2核2G,磁盘20G 进行时间同步,关闭防火墙和selinux…

秋招突击——7/29——操作系统——网络IO

文章目录 引言基础知识零拷贝传统文件读取传统文件传输零拷贝mmap writesendifle 网络通信IO模型阻塞IO非阻塞IO IO多路复用模型selectpollselect和poll的总结epoll边缘触发ET和水平触发LT 信号驱动IO模型异步IO 面试题库1、说一下Linux五种IO模型2、阻塞IO和非阻塞IO应用场景…

可视化目标检测算法推理部署(一)Gradio的UI设计

引言 在先前RT-DETR模型的学习过程中,博主自己使用Flask框架搭建了一个用于模型推理的小案例: FlaskRT-DETR模型推理 在这个过程中,博主需要学习Flask、HTML等相关内容,并且博主做出的页面还很丑,那么,是…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十六章 电容屏触摸驱动实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

1.5 1.6 操作系统引导 虚拟机

操作系统引导 操作系统引导的概念 操作系统引导是指计算机利用CPU运行特定程序,通过程序识别硬盘,识别硬盘分区,识别硬盘分区上的操作系统,最后通过程序启动操作系统,一环扣一环地完成上述过程 操作系统引导的过程 …

分布式锁 Redis+RedisSon

文章目录 1.什么是分布式锁2.分布式锁应该具备哪些条件3.分布式锁主流的实现方案4.未添加分布式锁存在的问题4.1测试未添加分布式锁的代码通过jmeter发送请求4.2 添加线程同步锁集群部署配置nginx修改jmeter端口号4.3 使用redis的setnx命令实现分布式锁解决办法4.4 使用try、fi…

【2025留学】德国留学真的很难毕业吗?为什么大家不来德国留学?

大家好!我是德国Viviane,一句话讲自己的背景:本科211,硕士在德国读的电子信息工程。 之前网上一句热梗:“德国留学三年将是你人生五年中最难忘的七年。”确实,德国大学的宽进严出机制,延毕、休…

【日常设计案例分享】通道对账

今天跟同事们讨论一个通道对账需求的技术设计。鉴于公司业务线有好几个,为避免不久的将来各业务线都重复竖烟囱,因此,我们打算将通道对账做成系统通用服务,以降低各业务线的开发成本。 以下文稿(草图)&…

正点原子imx6ull-mini-Linux设备树下的LED驱动实验(4)

1&#xff1a;修改设备树文件 在根节点“/”下创建一个名为“alphaled”的子节点&#xff0c;打开 imx6ull-alientek-emmc.dts 文件&#xff0c; 在根节点“/”最后面输入如下所示内容 alphaled {#address-cells <1>;#size-cells <1>;compatible "atkalp…

昇思25天学习打卡营第1天|快速入门实操教程

昇思25天学习打卡营第1天|快速入门实操教程 目录 昇思25天学习打卡营第1天|快速入门实操教程 一、MindSpore内容简介 主要特点&#xff1a; MindSpore的组成部分&#xff1a; 二、入门实操步骤 1. 安装必要的依赖包 2. 下载并处理数据集 3. 构建网络模型 4. 训练模型…

WIN下的文件病毒

文件病毒 一.windows下知识句柄禁用某些警告MAX_PATH_WIN32_FIND_DATAWFindFirstFileW注册到服务代码&#xff08;自启动&#xff09;隐藏窗口 二.客户端代码三.服务端代码 一.windows下知识 句柄 相当于指针&#xff0c;用来表示windows下的一些对象&#xff1b; 禁用某些警…

vue3中使用ant-design-vue

ant-design-vue官网&#xff1a;Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.jsAn enterprise-class UI components based on Ant Design and Vuehttps://www.antdv.com/components/overview-cn/ 安装 npm i -S ant-design-vue 引入 …

前端实现【 批量任务调度管理器 】demo优化

一、前提介绍 我在前文实现过一个【批量任务调度管理器】的 demo&#xff0c;能实现简单的任务批量并发分组&#xff0c;过滤等操作。但是还有很多优化空间&#xff0c;所以查找一些优化的库&#xff0c; 主要想优化两个方面&#xff0c; 上篇提到的&#xff1a; 针对 3&…

“数说”巴黎奥运会上的“中国智造”成果

引言&#xff1a;随着“中国智造”在欧洲杯上方兴未艾&#xff0c;在巴黎奥运会上&#xff0c;中国智造继续以多种形式和领域展现了其强大的实力和创新能力。以格力公开表示将为巴黎奥运村提供345台格力空调&#xff0c;为中国制造的清凉送至巴黎事件拉开中国制造闪亮巴黎奥运会…

CTF Web SQL注入 10000字详解

这里写目录标题 涉及的数据库知识unionorder bydatabase()information_schemalimit--空格注释replaceinto outfilelikeGROUP BYHAVINGGROUP BY、HAVING、WHERE之间的关系regexp 原理信息收集操作系统数据库判断注入点注入点类型POST注入数字型注入字符型注入搜索型注入Insert/u…

Debian12 安装Docker 用 Docker Compose 部署WordPress

服务器准备&#xff1a; 以root账号登录&#xff0c;如果不是root&#xff0c;后面指令需要加sudo apt update apt install apt-transport-https ca-certificates curl gnupg lsb-release添加GPG密钥&#xff0c;推荐国内源 curl -fsSL https://mirrors.aliyun.com/docker…

ArchLinux部署waydroid

在Arch Linux系统上部署Waydroid运行Android APP 文章目录 在Arch Linux系统上部署Waydroid运行Android APP1. 安装要求2. 本机环境3. 安装 Waydroid4. 网络配置5.注册Google设备6. 运行效果图 Waydroid是Anbox配合Haliun技术开发的LXC Android容器&#xff0c;可在GUN/Linux系…