MATLAB | 透明度渐变颜色条

hey 各位好久不见,今天提供一段有趣的小代码,之前刷到公众号闻道研学的一篇推送MATLAB绘图技巧 | 设置颜色条的透明度(附完整代码)(https://mp.weixin.qq.com/s/bVx8AVL9jGlatja51v4H0A),文章希望绘图不但有颜色映射而且希望有透明度映射,同时希望颜色条也能体现透明度的变化,但是文章仅成功实现了颜色条透明度设置,这让我有了尝试的兴趣。

尝试的效果如下:

左侧为原始绘图效果,右侧为加入透明度变化。

1 一个接近答案的尝试

其实按照闻道研学上的思路再多走两步,看似就能解决问题:

data = rand(12,12); 
% 透明度范围 0 - 1 这里为了好看设置为 .3 - 1
AData = rescale(data, .3, 1);% 绘制由数值控制 colormap 和 透明度 的imagesc
imagesc(data, 'AlphaData',AData);
colormap(jet); % 坐标区域修饰
ax = gca;
ax.DataAspectRatio = [1,1,1];  % X-Y轴1:1
ax.TickDir = 'out';            % 刻度朝外
ax.Box = 'off';% 获取colorbar句柄
CBarHdl = colorbar;
% 句柄隐藏子对象生成需要时间因此pause一下
pause(1e-16)
% 修改colorbar透明度
CData = CBarHdl.Face.Texture.CData;
ALim = [min(min(AData)), max(max(AData))];
CData(4,:) = uint8(255.*rescale(1:size(CData, 2), ALim(1), ALim(2)));
CBarHdl.Face.Texture.ColorType = 'TrueColorAlpha';
CBarHdl.Face.Texture.CData = CData;

但是我发现在比较新的版本里,无论怎么保存图片都是无法保存下来右侧colorbar的透明度渐变的:

原因似乎是在存储为图片的时候,MATLAB会自动调整一次colorbar的大小,顺带着把Texture这个玩意刷新了,那么有没有没刷新的东西呢,我发现可以直接修改Face

2 关于渐变colorbar的实现

我去年的时候回答过知乎的一个问题:如何在matlab里设置一个从透明到红色的colorbar?

  • https://www.zhihu.com/question/631811249/answer/3307539169

当时给出的代码如下:

[X,Y] = meshgrid(-5:.1:5);
Z = Y.*sin(X) - X.*cos(Y);
% 绘制曲面,设置为纯红色,并设置根据Z数值调整透明度
s = surface(X,Y,Z,'EdgeColor','none','FaceColor',[1,0,0],...'FaceAlpha','flat','AlphaData',Z);
view(3)% 获取colorbar句柄
CBarHdl=colorbar;
% 句柄隐藏子对象生成需要时间因此pause一下
pause(1e-16)
% 每一列代表一个RGBA颜色
% 前三行每一列的[255; 0; 0]代表红色
% 最后一行0和255代表透明度
colorData = uint8([255, 255, 255, 255; ... 0,   0,   0,   0; ...0,   0,   0,   0; ...0,   0, 255, 255]);
% 设置隐藏Face子对象颜色映射模式为真实值RGBA,并修改颜色矩阵
set(CBarHdl.Face, 'ColorType','truecoloralpha', 'ColorData',colorData)

但是这仅仅是两个颜色的渐变,colorbar更加表层的Face对象一般只存储了四个顶点的颜色,我们怎么把他变到十几种甚至上百种颜色呢,此时又想起我写的的一篇关于MATLAB一些基础对象的属性的博客:

  • https://www.mathworks.com/matlabcentral/discussions/tips/844281-how-to-customize-legends-semitransparent-rounded-rectangle-legend

我在其中讲了一些基础对象的用法:

因此我们原本colorbar内部的Face对象只是一个四边形,我们将其改成超级多小四边形,并为每一个小四边形赋予颜色和透明度:

data = rand(12,12); 
% 透明度范围 0 - 1 这里为了好看设置为 .3 - 1
AData = rescale(data, .3, 1);% 绘制由数值控制 colormap 和 透明度 的surf
imagesc(data, 'AlphaData',AData);
colormap(jet); % 坐标区域修饰
ax = gca;
ax.DataAspectRatio = [1,1,1];  % X-Y轴1:1
ax.TickDir = 'out';            % 刻度朝外
ax.Box = 'off';% 获取colorbar句柄
CBarHdl = colorbar;
% 句柄隐藏子对象生成需要时间因此pause一下
pause(1e-16)
% 修改colorbar透明度
CData = CBarHdl.Face.Texture.CData;
ALim = [min(min(AData)), max(max(AData))];
CData(4,:) = uint8(255.*rescale(1:size(CData, 2), ALim(1), ALim(2)));warning off
CBarHdl.Face.ColorType = 'TrueColorAlpha';
VertexData = CBarHdl.Face.VertexData;
tY = repmat((1:size(CData,2))./size(CData,2), [4,1]);
tY1 = tY(:).'; tY2 = tY  - tY(1,1); tY2(3:4,:) = 0; tY2 = tY2(:).';
tM1 = [tY1.*0 + 1; tY1; tY1.*0 + 1];
tM2 = [tY1.*0; tY2; tY1.*0];
CBarHdl.Face.VertexData = repmat(VertexData, [1,size(CData,2)]).*tM1 + tM2;
CBarHdl.Face.ColorData = reshape(repmat(CData, [4,1]), 4, []);

完美解决:

3 更多特殊情况

数值越高透明度越透明

data = rand(12,12); 
% 透明度范围 0 - 1 这里为了好看设置为 .3 - 1
AData = rescale(- data, .3, 1);% 绘制由数值控制 colormap 和 透明度 的imagesc
imagesc(data, 'AlphaData',AData);
colormap(jet); % 坐标区域修饰
ax = gca;
ax.DataAspectRatio = [1,1,1];  % X-Y轴1:1
ax.TickDir = 'out';            % 刻度朝外
ax.Box = 'off';% 获取colorbar句柄
CBarHdl = colorbar;
% 句柄隐藏子对象生成需要时间因此pause一下
pause(1e-16)
% 修改colorbar透明度
CData = CBarHdl.Face.Texture.CData;
ALim = [min(min(AData)), max(max(AData))];
CData(4,:) = uint8(255.*rescale(size(CData, 2):-1:1, ALim(1), ALim(2)));warning off
CBarHdl.Face.ColorType = 'TrueColorAlpha';
VertexData = CBarHdl.Face.VertexData;
tY = repmat((1:size(CData,2))./size(CData,2), [4,1]);
tY1 = tY(:).'; tY2 = tY  - tY(1,1); tY2(3:4,:) = 0; tY2 = tY2(:).';
tM1 = [tY1.*0 + 1; tY1; tY1.*0 + 1];
tM2 = [tY1.*0; tY2; tY1.*0];
CBarHdl.Face.VertexData = repmat(VertexData, [1,size(CData,2)]).*tM1 + tM2;
CBarHdl.Face.ColorData = reshape(repmat(CData, [4,1]), 4, []);

中间更透明

data = rand(12,12) - .5; 
AData = rescale(abs(data), .1, .9);% 绘制由数值控制 colormap 和 透明度 的imagesc
imagesc(data, 'AlphaData',AData);
colormap(jet); % 坐标区域修饰
ax = gca;
ax.DataAspectRatio = [1,1,1];  % X-Y轴1:1
ax.TickDir = 'out';            % 刻度朝外
ax.Box = 'off';% 获取colorbar句柄
CBarHdl = colorbar;
% 句柄隐藏子对象生成需要时间因此pause一下
pause(1e-16)
% 修改colorbar透明度
CData = CBarHdl.Face.Texture.CData;
ALim = [min(min(AData)), max(max(AData))];
CData(4,:) = uint8(255.*rescale(abs((1:size(CData, 2)) - (1 + size(CData, 2))/2), ALim(1), ALim(2)));warning off
CBarHdl.Face.ColorType = 'TrueColorAlpha';
VertexData = CBarHdl.Face.VertexData;
tY = repmat((1:size(CData,2))./size(CData,2), [4,1]);
tY1 = tY(:).'; tY2 = tY  - tY(1,1); tY2(3:4,:) = 0; tY2 = tY2(:).';
tM1 = [tY1.*0 + 1; tY1; tY1.*0 + 1];
tM2 = [tY1.*0; tY2; tY1.*0];
CBarHdl.Face.VertexData = repmat(VertexData, [1,size(CData,2)]).*tM1 + tM2;
CBarHdl.Face.ColorData = reshape(repmat(CData, [4,1]), 4, []);


其他绘图

其他绘图只要具有AlphaData属性理论上都可以适用:

data = peaks(30);
AData = rescale(data, .2, 1);% 绘制由数值控制 colormap 和 透明度 的surf
surface(data, 'FaceAlpha','flat','AlphaData',AData);
colormap(jet(100)); % 坐标区域修饰
ax = gca;
ax.DataAspectRatio = [1,1,1];  % X-Y轴1:1
ax.TickDir = 'out';            % 刻度朝外
ax.Box = 'off';
view(3)% 获取colorbar句柄
CBarHdl = colorbar;
% 句柄隐藏子对象生成需要时间因此pause一下
pause(1e-16)
% 修改colorbar透明度
CData = CBarHdl.Face.Texture.CData;
ALim = [min(min(AData)), max(max(AData))];
CData(4,:) = uint8(255.*rescale(1:size(CData, 2), ALim(1), ALim(2)));warning off
CBarHdl.Face.ColorType = 'TrueColorAlpha';
VertexData = CBarHdl.Face.VertexData;
tY = repmat((1:size(CData,2))./size(CData,2), [4,1]);
tY1 = tY(:).'; tY2 = tY  - tY(1,1); tY2(3:4,:) = 0; tY2 = tY2(:).';
tM1 = [tY1.*0 + 1; tY1; tY1.*0 + 1];
tM2 = [tY1.*0; tY2; tY1.*0];
CBarHdl.Face.VertexData = repmat(VertexData, [1,size(CData,2)]).*tM1 + tM2;
CBarHdl.Face.ColorData = reshape(repmat(CData, [4,1]), 4, []);

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

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

相关文章

机器学习周记(第四十二周:AT-LSTM)2024.6.3~2024.6.9

目录 摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 LSTM3.2 注意力机制概述3.3 AT-LSTM3.4 数据预处理 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 训练参数4.3.2 数据集4.3.3 实验设置4.3.4 实验结果 5. 基于pytorch的transformer 摘要 本周阅读…

免费,C++蓝桥杯等级考试真题--第11级(含答案解析和代码)

C蓝桥杯等级考试真题--第11级 答案:D 解析: A. a b; b a; 这种方式会导致a和b最终都等于b原来的值,因为a的原始值在被b覆盖前没有保存。 B. swap(a,b); 如果没有自定义swap函数或者没有包含相应的库,这个选项会编…

【C++题解】1389 - 数据分析

问题:1389 - 数据分析 类型:简单循环 题目描述: 该方法的操作方式为,如果要传递 2 个数字信息给友军,会直接传递给友军一个整数 n(n 是一个 10 位以内的整数),该整数的长度代表要传…

汇编语言LDS指令

在8086架构的实模式下,LDS指令(Load Pointer Using DS)用于从内存中加载一个32位的指针到指定寄存器和DS寄存器。我们来详细解释一下这条指令为什么会修改DS段寄存器。 LDS指令的功能 LDS指令格式如下: LDS destination, sourc…

程序猿大战Python——运算符

常见的运算符 目标:了解Python中常见的运算符有哪些? 运算符是用于执行程序代码的操作运算。常见的运算符有: (1)算术运算符:、-、*、/、//、% 、**; (2)赋值运算符&am…

macOS - 终端快捷键

本文转自 Mac 上“终端”中的键盘快捷键 https://support.apple.com/zh-cn/guide/terminal/trmlshtcts/mac 以下基于系统版本 macOS Sonoma 14 文章目录 Mac 上“终端”中的键盘快捷键1、使用“终端”窗口和标签页2、编辑命令行3、在“终端”窗口中选择和查找文本4、使用标记和…

【Uniapp】uniapp微信小程序定义图片地址全局变量

错误写法: main.js Vue.prototype.$imgUrl 图片地址这么写之后 就发现压根不起作用;获取到的是undefined 正确写法: 返回函数,后面可以拼上OSS图片完整路径 Vue.prototype.$imgUrl (url) > {return ("https://地址…

Android——热点开关(优化中)

SoftAP打开与关闭 目录 1.三个名词的解释以及关系 Tethering——网络共享,WiFi热点、蓝牙、USB SoftAp——热点(无线接入点),临时接入点 Hostapd——Hostapd是用于Linux系统的软件,,支持多种无线认证和加密协议,将任…

LabVIEW进行图像拼接的实现方法与优化

在工业检测和科研应用中,对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具,能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…

c++引用的本质(反汇编角度分析)

目录 一、引用基础理论 二、 引用的本质 三、从反汇编角度进行分析 1.变量赋值 2.引用和指针初始化 3.通过引用和指针赋值 4.eaxd的作用 一、引用基础理论 在c中我们都知道,引用(&)就是变量的一个别名,它允许我们为已存…

Python魔法之旅专栏(导航)

目录 推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、博客个人主页 首先,感谢老铁们一直以来对我的支持与厚爱,让我能坚持把Python魔法方法专栏更新完毕! 其次,为了方便大家查阅,我将此专栏…

C#操作MySQL从入门到精通(21)——删除数据

前言: 谈到数据库,大家最容易脱口而出的就是增删改查,本文就是来详细介绍如何删除数据。 本文测试使用的数据库如下: 1、删除部分数据 使用delete 关键字,并且搭配where条件使用,否则会导致表中数据全部被删除 string sql = string.Empty;if (radioButton_DeletePart…

保存图片奇怪的bug

今天发现一个奇怪的bug 这个的dpi是100de ,但是我取完切片之后,发现这个结果就变了

Vivado时序报告之Datasheet详解

目录 一、前言 二、Datasheet配置选项说明 2.1 Options 2.2 Groups 2.3 Timer Settings 2.4 Common Options 三、Datasheet报告 3.1 General Information 3.2 Input Ports Setup/Hold 3.3 Output Ports Clock-to-out 3.4 Setup between Clocks 3.5 Combinational…

保姆级讲解 Linux下FTP服务器的搭建、配置与管理

本来目录很长的 因为感觉不太美观 所以小标题都删掉了 本文介绍了 本地用户的FTP服务器搭建实例匿名用户的FTP服务器搭建实例虚拟用户的FTP服务器搭建实例企业常见类型搭建实验 配置与管理FTP服务器 配置与管理FTP服务器一、FTP相关知识二、项目设计与准备三、项目实施四、认识…

【最新鸿蒙应用开发】——ArkUI两种开发范式

在进行鸿蒙应用开发,openHarmony提供了一种页面开发框架叫做ArkUI方舟框架来进行页面布局的开发。 ArkUI方舟UI框架 针对不同的应用场景及技术背景,方舟UI框架提供了两种开发范式,分别是基于ArkTS的声明式开发范式(简称“声明式…

[书生·浦语大模型实战营]——LMDeploy 量化部署 LLM 实践

1.基础作业 1.1配置 LMDeploy 运行环境 创建开发机 创建新的开发机,选择镜像Cuda12.2-conda;选择10% A100*1GPU;点击“立即创建”。注意请不要选择Cuda11.7-conda的镜像,新版本的lmdeploy会出现兼容性问题。其他和之前一样&…

转型AI产品经理(6):“ 序列位置效应”如何应用在Chatbot产品中

序列位置效应是心理学中的一个记忆现象,指的是人们对一系列信息的记忆效果受到信息在序列中位置的影响。具体来说,人们通常更容易记住列表的开头和结尾部分的项目,而对中间部分的项目记忆较差。这个效应可以进一步分为“首因效应”和“近因效…

VSCode超过390万下载的请求插件

Thunder Client 是一款在 VSCode(Visual Studio Code)中非常受欢迎的 REST API 客户端插件,由Ranga Vadhineni开发,现在已经有超过390万的下载量。它允许开发者直接在编辑器内发送 HTTP 请求,查看响应。Thunder Client…