【MATLAB学习笔记】绘图——分割绘图背景并填充不同的颜色

news2024/9/22 16:12:33

目录

  • 前言
  • 分割背景函数
  • 示例
    • 基本绘图
    • 分割背景函数的使用
    • 保存图片
  • 总代码
  • 总结

前言

  在MATLAB中,使用窗口对象的Color属性可以轻松地设置不同的背景颜色,但是只能设置一种单一颜色。若需要将绘图背景设置成多种颜色,比如左右两边不同的颜色,MATLAB中是不支持直接设置的。文章提供了一个分割背景并可以填充颜色的函数splitBackground,还提供了该函数的使用示例。

分割背景函数

  分割背景的函数splitBackground如下,该函数必须输入一个窗口对象ax,ax通常可以赋值为gca;nx和ny表示水平方向和竖直方向的分割数量;colors表示填充的颜色,顺序为从下到上,从左到右;biasx和biasy可以设置水平方向和竖直方向分割的位置,默认为均分。

function splitBackground(ax,nx,ny,colors,biasx,biasy)
% 分割绘图背景, 并填充颜色
% ax        窗口对象,一般设置为ax = gca
% nx        水平方向的分割数量  默认:1
% ny        竖直方向的分割数量  默认:1
% colors    指定颜色(GRB数组),顺序:从左到右,从下到上  默认:jet
% biasx     水平方向的分割位置(0-1,最后一个位置需为1),数组大小为nx  默认:均分    
% biasy     竖直方向的分割位置(0-1,最后一个位置需为1),数组大小为ny  默认:均分 

if nargin < 2, nx = 1; end
if nargin < 3, ny = 1; end
if nargin < 4, colors = jet(nx*ny); end
if nargin < 5, biasx = cumsum(ones(nx,1)/nx); end
if nargin < 6, biasy = cumsum(ones(ny,1)/ny); end

Po = get(ax,'Position');    % 当前图窗位置坐标
set(ax,'color','none')      % 设置绘图区背景为透明色

k = 0;  % 记录背景数量
for i = 1:nx
    for j = 1:ny
        k = k + 1;

        Pon = Po;   % 拷贝位置坐标

        % 计算水平方向的位置
        if i > 1
            Pon(1) = Pon(1) + Pon(3)*biasx(i-1);
            Pon(3) = Pon(3)*(biasx(i)-biasx(i-1));
        else
            Pon(3) = Pon(3)*biasx(i);
        end

        % 计算竖直方向的位置
        if j > 1
            Pon(2) = Pon(2) + Pon(4)*biasy(j-1);
            Pon(4) = Pon(4)*(biasy(j)-biasy(j-1));
        else
            Pon(4) = Pon(4)*biasy(j);
        end

        % 设置背景
        axbg = axes('Position',Pon,'Color',colors(k,:),'XColor','none','YColor','none');
        set(axbg,'XTick', [],'YTick', []);   % 去掉xy轴刻度

        % 背景置底
        uistack(axbg,'bottom')   % 设置新绘图区位于最底层

    end
end


end

示例

基本绘图

  下面这是基本的绘图代码,具体细节可以参考前面的文章(点击转跳)。

clc;clear;close all
set(0,'defaultfigurecolor','w');

%% 数据
x = 0:0.01:1;   % 产生0到1, 步长为0.01的序列
y = 2*x + 1;    % y为x一次函数
rng(100)    % 随机数种子,使每次随机数都是一样的
r = (rand(1,length(x)) - 0.5) * 2;  %产生-1到1的随机数
y1 = y + r*0.5; %对y施加扰动(为了模拟数据)

%% 绘图
f = figure(1);
ax = gca;   % 将当前坐标区实例化
plot(x,y,'-k',x,y1,'ok','LineWidth',1.3)

hold on

set(gca,'FontName','Times New Roman','FontSize',13)
xlabel('\fontname{宋体} 位移\fontname{Times New Roman} \it x/\rm mm')
ylabel('\fontname{宋体} 力\fontname{Times New Roman} \it y/\rm N')

% 图例
le = legend('拟合数据','原始数据','FontName','宋体','Location','northwest');
% legend('boxoff')    %取消图例边框
le.EdgeColor = 'none';
le.Color = 'none';
le.LineWidth = 1.3;

% 设置次刻度线
set(gca,'XMinorTick',true)
set(gca,'YMinorTick',true)

% 去除上边框、右边框刻度线
box off     % 取消边框
ax1 = axes('Position',get(ax,'Position'),'XAxisLocation','top',...
    'YAxisLocation','right','Color','none','XColor','k','YColor','k');  % 设置坐标区
set(ax1,'XTick', [],'YTick', []);   % 去掉xy轴刻度
hold off

运行代码后得到下面的结果图。
在这里插入图片描述

分割背景函数的使用

  可以通过colors自定义颜色,注意只能输入RGB颜色数组。接着调用分割背景函数splitBackground,注意ax在前面已经赋值了,见上一个代码块。

  • 将绘图背景按水平方向分割为两区域。
colors = [1,0.81,0.81;
          0.79,0.81,1;
          0.8,1,0.79;
          1,0.99,0.79];
splitBackground(ax,2,1,colors)

将上面的代码放在第一个代码块的末尾,运行后即可得到下面的结果图。
在这里插入图片描述

  • 将绘图背景按竖直方向分割为两区域。
splitBackground(ax,1,2,colors)

在这里插入图片描述

  • 将绘图背景按水平方向分割为两区域,并设置分割位置为0.7。
splitBackground(ax,2,1,colors,[0.7,1])

在这里插入图片描述

  • 将绘图背景按水平方向和竖直方向分割为四个区域,并设置分割位置为0.7和0.6。
splitBackground(ax,2,2,colors,[0.7,1],[0.6,1])

在这里插入图片描述

保存图片

  使用了分割背景函数splitBackground后,通过代码保存图片的方式(比如print、exportgraphics和saveas等)出现了一些问题(具体原因未知,可能是bug),会导致背景颜色缺失或者出现白边的情况,而通过手动保存可以避免这些问题。

  • 首先点击“文件”。
    在这里插入图片描述
  • 接着点击“导出设置”。
    在这里插入图片描述
  • 点击“导出”。

在这里插入图片描述

  • 设置“保存类型”以及“文件名”,点击确定即可。

在这里插入图片描述

总代码

  总代码如下,后续还会继续更新一些MATLAB绘图的技巧和细节,制作不易,别忘了关注和点赞喔

clc;clear;close all
set(0,'defaultfigurecolor','w');

%% 数据
x = 0:0.01:1;   % 产生0到1, 步长为0.01的序列
y = 2*x + 1;    % y为x一次函数
rng(100)    % 随机数种子,使每次随机数都是一样的
r = (rand(1,length(x)) - 0.5) * 2;  %产生-1到1的随机数
y1 = y + r*0.5; %对y施加扰动(为了模拟数据)

%% 绘图
f = figure(1);
ax = gca;   % 将当前坐标区实例化
plot(x,y,'-k',x,y1,'ok','LineWidth',1.3)

hold on

set(gca,'FontName','Times New Roman','FontSize',13)
xlabel('\fontname{宋体} 位移\fontname{Times New Roman} \it x/\rm mm')
ylabel('\fontname{宋体} 力\fontname{Times New Roman} \it y/\rm N')

% 图例
le = legend('拟合数据','原始数据','FontName','宋体','Location','northwest');
% legend('boxoff')    %取消图例边框
le.EdgeColor = 'none';
le.Color = 'none';
le.LineWidth = 1.3;

% 设置次刻度线
set(gca,'XMinorTick',true)
set(gca,'YMinorTick',true)

% 去除上边框、右边框刻度线
box off     % 取消边框
ax1 = axes('Position',get(ax,'Position'),'XAxisLocation','top',...
    'YAxisLocation','right','Color','none','XColor','k','YColor','k');  % 设置坐标区
set(ax1,'XTick', [],'YTick', []);   % 去掉xy轴刻度
hold off

% 分割背景并填充颜色
% 颜色
colors = [1,0.81,0.81;
          0.79,0.81,1;
          0.8,1,0.79;
          1,0.99,0.79];

% 将绘图背景按水平方向分割为两区域 
% splitBackground(ax,2,1,colors)

% 将绘图背景按竖直方向分割为两区域
% splitBackground(ax,1,2,colors)

% 将绘图背景按水平方向分割为两区域,并设置分割位置为0.7
% splitBackground(ax,2,1,colors,[0.7,1])

% 将绘图背景按水平和竖直方向分割为两区域,并设置分割位置为0.7和0.6
splitBackground(ax,2,2,colors,[0.7,1],[0.6,1])

function splitBackground(ax,nx,ny,colors,biasx,biasy)
% 分割绘图背景, 并填充颜色
% ax        窗口对象,一般设置为ax = gca
% nx        水平方向的分割数量  默认:1
% ny        竖直方向的分割数量  默认:1
% colors    指定颜色(GRB数组),顺序:从左到右,从下到上  默认:jet
% biasx     水平方向的分割位置(0-1,最后一个位置需为1),数组大小为nx  默认:均分    
% biasy     竖直方向的分割位置(0-1,最后一个位置需为1),数组大小为ny  默认:均分 

if nargin < 2, nx = 1; end
if nargin < 3, ny = 1; end
if nargin < 4, colors = jet(nx*ny); end
if nargin < 5, biasx = cumsum(ones(nx,1)/nx); end
if nargin < 6, biasy = cumsum(ones(ny,1)/ny); end

Po = get(ax,'Position');    % 当前图窗位置坐标
set(ax,'color','none')      % 设置绘图区背景为透明色

k = 0;  % 记录背景数量
for i = 1:nx
    for j = 1:ny
        k = k + 1;

        Pon = Po;   % 拷贝位置坐标

        % 计算水平方向的位置
        if i > 1
            Pon(1) = Pon(1) + Pon(3)*biasx(i-1);
            Pon(3) = Pon(3)*(biasx(i)-biasx(i-1));
        else
            Pon(3) = Pon(3)*biasx(i);
        end

        % 计算竖直方向的位置
        if j > 1
            Pon(2) = Pon(2) + Pon(4)*biasy(j-1);
            Pon(4) = Pon(4)*(biasy(j)-biasy(j-1));
        else
            Pon(4) = Pon(4)*biasy(j);
        end

        % 设置背景
        axbg = axes('Position',Pon,'Color',colors(k,:),'XColor','none','YColor','none');
        set(axbg,'XTick', [],'YTick', []);   % 去掉xy轴刻度

        % 背景置底
        uistack(axbg,'bottom')   % 设置新绘图区位于最底层

    end
end

end

总结

  这只是一个基础的示例,实际中还会有更具体的、更细致的要求,这就需要再做额外调整;另外本人也仍在学习中,这只是个人的学习笔记,可能还有一些不足之处,欢迎指正。

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

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

相关文章

Gradio.NET支持 .NET 8 简化 Web 应用开发

目录 前言 Gradio.NET Gradio.NET 使用 1、创建项目 2、安装 Gradio.Net 3、示例代码 Gradio.NET 示例 1、Layout 2、Form 3、Media 4、Chatbot 5、Progress Gradio.NET 应用 项目地址 总结 最后 前言 Gradio.NET 是 Gradio 在 .NET 平台上的移植版本。Gradio …

内容为王:数字化营销的致胜法宝

​在当今数字化时代&#xff0c;营销环境发生了巨大变化。消费者被海量信息包围&#xff0c;注意力成为必争资源。在这种情况下&#xff0c;“内容为王” 的理念愈发凸显其重要性&#xff0c;成为数字化营销的致胜法宝。 1. 吸引用户注意力 高质量、有价值的内容能够在众多信息…

推荐好古文《马说》

韩愈 世有伯乐&#xff0c;然后有千里马。千里马常有&#xff0c;而伯乐不常有。故虽有名马&#xff0c;只辱于奴隶人之手&#xff0c;骈死于槽枥之间&#xff0c;不以千里称也。 马之千里者&#xff0c;一食或尽粟一石。食马者不知其能千里而食也。是马也&#xff0c;虽有千…

【Python最全系统学习路线】:千万不要盲目自学Python,顺序真的很重要!

如果你一直想学Python&#xff0c;但是不知道如何入手&#xff0c;那就别犹豫了。这篇文章就是为你写的。 根据我自己的经验来说&#xff0c;想从零开始学Python&#xff0c;以后也确实想找相关的工作&#xff0c;基本是下边这三种方式&#xff1a; 继续上学。报个这方面的专业…

WiFi的IP和电脑IP一样吗?怎么更改wifi的ip地址

在数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。无论是通过手机、电脑还是其他智能设备接入互联网&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;很多用户对于WiFi的IP地址与电脑&#xff08;或…

Linux权限维持实战

目录 介绍步骤 介绍 攻击者在获取服务器权限后&#xff0c;会通过一些技巧来隐藏自己的踪迹和后门文件 查看/tmp目录下的flag文件 查看/root目录下具有特殊文件属性的文件 操作机中共有几个SUID文件 操作机中共有几个SGID文件 查看操作机中ssh公私钥免密登陆 查看strace后门 …

机器视觉学习笔记和过程记录:下载安装OpenCv

下载安装opencv 1、本机已经安装了anaconda&#xff0c;打开对应的环境下的命令行窗口&#xff0c;输入python后回车&#xff0c;会显示python版本&#xff0c;本机是3.8.3&#xff1a; 2、打开链接&#xff1a;Links for opencv-python &#xff0c;在网页中查找与python版本…

【计算机组成原理】三、存储系统:5.页式存储、虚拟存储

9.页式存储器 文章目录 9.页式存储器9.1页表9.2地址变换过程9.3快表TLB 10.虚拟存储器10.1页式虚拟存储器10.2段式虚拟存储器10.3段页式虚拟存储器 详见 操作系统 3.内存管理 存储器管理 分页存储管理 因为实际连续存放一段程序是不现实的&#xff0c;那样会使得利用率极低。所…

探索人工智能领域:从探索到战略整合

我们正站在商业和技术新时代的风口浪尖。人工智能已经成为一股变革力量&#xff0c;有望彻底改变行业并重新定义我们的工作方式。然而&#xff0c;从最初的人工智能探索到全面整合&#xff0c;这条路并不平坦。 全球各地的组织都在努力解决如何充分利用人工智能潜力的复杂问题&…

TXT文件转换pdf格式的java方法

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version> </dependency>接下来&#xff0c;编写一个方法来执行文件转换&#xff1a; import com.itextpdf.text.Document…

文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手需要什么(四)⓵

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

一文彻底搞懂CNN - 模型架构(Model Architecture)

CNN Model Architecture CNN&#xff08;卷积神经网络&#xff09;的模型架构由输入层、卷积层、池化层以及全连接层组成&#xff0c;通过卷积操作提取图像特征&#xff0c;并通过池化减少参数数量&#xff0c;最终通过全连接层进行分类或回归。 输入层&#xff1a;接收原始图…

​14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

BoosterX:Windows 游戏玩家都爱的电脑优化工具箱

《黑神话&#xff1a;悟空》、《艾尔登法环&#xff1a;黄金树幽影》、暴雪「全家桶」回归……今年&#xff0c;我们将迎来一场豪华的游戏大餐&#xff01; 想要畅玩游戏&#xff0c;除了要准备好给力的硬件设备&#xff0c;系统优化当然也不能落下&#xff01;BoosterX 正是一…

IO进程(8)

目录 1.信号灯集 1.1概念 1.2操作步骤 1.3函数接口 1.3.1创建信号灯集 1.3.2初始化或删除信号灯集 ​​​​​​​​​​​​​​1.3.3pv操作 ​​​​​​​​​​​​​​1.4操作命令 2.消息队列 2.1特点 ​​​​​​​​​​​​​​2.2步骤 ​​​​​​​2.3函数接口 2.3…

如何选择适合自己的开放式耳机?五款实力出众爆款安利!

开放式耳机以其不侵入耳道的设计&#xff0c;为耳朵提供了更轻的负担&#xff0c;同时保护了耳道健康&#xff0c;这与传统的头戴式或入耳式耳机相比&#xff0c;在长时间佩戴时更能减少不适感。市场上的开放式耳机种类繁多&#xff0c;要找到一款真正满意的产品可能有些困难。…

使用kubeadm快速部署一套K8S集群

一、Kubernetes概述 1.1 Kubernetes是什么 Kubernetes是Google在2014年开源的一个容器集群管理系统&#xff0c;Kubernetes简称K8S。 K8S用于容器化应用程序的部署&#xff0c;扩展和管理。 K8S提供了容器编排&#xff0c;资源调度&#xff0c;弹性伸缩&#xff0c;部署管理…

Meta被曝取消了自己的“Vision Pro计划”内部代号La Jolla

据媒体周五报道&#xff0c;美国科技巨头Meta已经取消了原定于2027年推出高端混合现实头显的计划&#xff0c;Meta原本计划利用这款设备与苹果的Vision Pro一较高下。据Meta的两名员工声称&#xff0c;在本周的一次产品审查会议后&#xff0c;公司管理层突然要求Reality Labs部…

【数据结构】动态顺序表的实现

1.什么是数据结构 数据结构就是把数据元素按照一定的关系组织起来的集合&#xff0c;用来组织和存储数据。通过数据结构&#xff0c;能够有效的将数据组织和管理在一起&#xff0c;按照我们的方式任意对数据进行增删查改等操作。 2.数据结构的分类 数据结构大概可分为逻辑结构…

拆分因子+减枝

前言&#xff1a;一开始看到数据量这么大&#xff0c;我怎么拆分出因子&#xff0c;看了题解才发现要大减枝&#xff0c;但是如何拆分因数我还是要好好学一下 1 0 18 10^{18} 1018 的拆分因子有 1 0 5 10^5 105 的复杂度&#xff0c;再乘以 1 0 3 10^3 103 的数量&#xff0c…