当前位置: 首页 > news >正文

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

目录

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

前言

  在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); endPo = get(ax,'Position');    % 当前图窗位置坐标
set(ax,'color','none')      % 设置绘图区背景为透明色k = 0;  % 记录背景数量
for i = 1:nxfor j = 1:nyk = k + 1;Pon = Po;   % 拷贝位置坐标% 计算水平方向的位置if i > 1Pon(1) = Pon(1) + Pon(3)*biasx(i-1);Pon(3) = Pon(3)*(biasx(i)-biasx(i-1));elsePon(3) = Pon(3)*biasx(i);end% 计算竖直方向的位置if j > 1Pon(2) = Pon(2) + Pon(4)*biasy(j-1);Pon(4) = Pon(4)*(biasy(j)-biasy(j-1));elsePon(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
endend

示例

基本绘图

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

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 onset(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 onset(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); endPo = get(ax,'Position');    % 当前图窗位置坐标
set(ax,'color','none')      % 设置绘图区背景为透明色k = 0;  % 记录背景数量
for i = 1:nxfor j = 1:nyk = k + 1;Pon = Po;   % 拷贝位置坐标% 计算水平方向的位置if i > 1Pon(1) = Pon(1) + Pon(3)*biasx(i-1);Pon(3) = Pon(3)*(biasx(i)-biasx(i-1));elsePon(3) = Pon(3)*biasx(i);end% 计算竖直方向的位置if j > 1Pon(2) = Pon(2) + Pon(4)*biasy(j-1);Pon(4) = Pon(4)*(biasy(j)-biasy(j-1));elsePon(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
endend

总结

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 三级_网络技术_50_综合题(报文)
  • Webpack中的自定义 loader 的简单实现
  • C#面:ASP.NET MVC 中如何用表单认证?
  • 二叉树高频题目-上-不含树型dp
  • 认知杂谈25
  • Vue3+Ts封装input组件时遇到的问题
  • C#高级进阶---关于插件开发(初版)
  • 在Ubuntu 16.04上安装MongoDB的方法
  • MySQL多表查询,找出包含全部标签的邮件,包含任意标签的邮件
  • 【Go - 特殊导入包方式 . 和 _】
  • mybatis-plus中Swagger 模式和Kotlin 模式是什么?
  • matlab 计算矩阵元素的标准差
  • 条件拼接 - 根据入参生成where条件
  • 15 种高级 RAG 技术 ——从预检索到生成
  • zabbix对接Grafana
  • ES6指北【2】—— 箭头函数
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • js 实现textarea输入字数提示
  • 安卓应用性能调试和优化经验分享
  • 关于extract.autodesk.io的一些说明
  • 学习使用ExpressJS 4.0中的新Router
  • 因为阿里,他们成了“杭漂”
  • 主流的CSS水平和垂直居中技术大全
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #在 README.md 中生成项目目录结构
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • ()、[]、{}、(())、[[]]命令替换
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (k8s中)docker netty OOM问题记录
  • (二)PySpark3:SparkSQL编程
  • (汇总)os模块以及shutil模块对文件的操作
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (算法)求1到1亿间的质数或素数
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *1 计算机基础和操作系统基础及几大协议
  • .ai域名是什么后缀?
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net FrameWork简介,数组,枚举
  • .NET 材料检测系统崩溃分析
  • .net中调用windows performance记录性能信息
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @Autowired多个相同类型bean装配问题
  • @Autowired注解的实现原理
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [2021 蓝帽杯] One Pointer PHP
  • [android] 切换界面的通用处理
  • [APIO2012] 派遣 dispatching
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标