服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 详解Matlab如何绘制圆角半透明图例

详解Matlab如何绘制圆角半透明图例

2022-12-07 12:00slandarer C/C++

目前MATLAB的legend图例是不支持圆角和半透明的,所以本文将自制实现圆角半透明图例。文中的示例代码讲解详细,需要的可以参考一下

目前MATLAB的legend图例是不支持圆角和半透明的,欸,不能咱就自己画,就是把原始图例隐藏后不断追踪其位置绘制半透明的圆角矩形嘛,这有任何难度吗???完全没有!!因此就有了这篇推送(目前不支持三维绘图):

基本使用

继续假设我们编写了如下代码:

t=0:0.35:3*pi;
plot(t,sin(t),'Marker','d','LineWidth',2,'Color',[102,194,166]./255)
hold on
plot(t,cos(t./2),'Marker','o','LineWidth',2,'Color',[252,140,97]./255)
plot(t,t,'Marker','^','LineWidth',2,'Color',[140,161,204]./255)

lgd=legend('y=sin(t)','y=cos(t/2)','y=t');
lgd.Location='northwest';
lgd.FontSize=13;
title(lgd,'Func','FontSize',14)

绘图结果如下:

详解Matlab如何绘制圆角半透明图例

在代码最后加上一行:

prettyLegend()

详解Matlab如何绘制圆角半透明图例

不过这样只体现了圆角的性质,并没有体现其半透明,要体现其半透明的性质坐标区域最好不是白色的,哎我们直接和上一篇一结合不就好了(Matlab绘制酷炫坐标区域的方法详解)

例如最后加上两行(注意请将图例修饰加在坐标区域修饰后面):

prettyAxes().dark2()

prettyLegend()

详解Matlab如何绘制圆角半透明图例

prettyAxes().dark()

prettyLegend()

详解Matlab如何绘制圆角半透明图例

 

使用说明

当拖拽图例到其他位置,图例框会跟随:

详解Matlab如何绘制圆角半透明图例

当调整图窗大小导致图例框大小异常时,在图例附近晃动鼠标即可修复大小:

详解Matlab如何绘制圆角半透明图例

 

完整代码

function legendBox=prettyLegend(ax)
if nargin<1
  ax=gca;
end
hold on
legendTitleColor=[0,0,0];
if mean(ax.Color)<0.5
  legendTitleColor=[1,1,1];
  ax.Legend.TextColor=[1,1,1];
end

ax.Legend.AutoUpdate='on';
% ax.Legend.FontSize=11;
% ax.Legend.Title.FontSize=14;
ax.Legend.AutoUpdate='off';

% 如果在图窗外则不设框
if ~isempty(regexpi(ax.Legend.Location,'out', 'once'))
  ax.Legend.Box='off';
  lgdPos=ax.Legend.Position;
  % 依据legend所处figure坐标和axes范围计算Legend坐标
  xyMin=[(lgdPos(1)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
      (lgdPos(2)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
  xyMax=[(lgdPos(1)+lgdPos(3)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
      (lgdPos(2)+lgdPos(4)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
  ax.Legend.UserData.NewBkg=[];
  % 隐藏原标题
  ax.Legend.Title.Visible='off';
  % 绘制新legend标题
  ax.Legend.UserData.NewTitle=text(ax,xyMin(1),xyMax(2),['  ',ax.Legend.Title.String],...
      'FontSize',ax.Legend.Title.FontSize,'VerticalAlignment','top','FontWeight','bold','Color',legendTitleColor);
else

  ax.Legend.Box='off';
  lgdPos=ax.Legend.Position;
  % 依据legend所处figure坐标和axes范围计算Legend坐标
  xyMin=[(lgdPos(1)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
      (lgdPos(2)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
  xyMax=[(lgdPos(1)+lgdPos(3)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
      (lgdPos(2)+lgdPos(4)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
  xDiff=(xyMax(1)-xyMin(1));
  yDiff=(xyMax(2)-xyMin(2));
  % 绘制圆角矩形作为新框
  ax.Legend.UserData.NewBkg=rectangle(ax,'Position',[xyMin,xDiff,yDiff],'Curvature',0.2,...
      'LineWidth',1.2,'EdgeColor',[0.39 0.41 0.39],'FaceColor',[1 1 1 .2]);
  %ax.Legend.Title.FontSize=14;
  % 隐藏原标题
  ax.Legend.Title.Visible='off';
  % 绘制新legend标题
  ax.Legend.UserData.NewTitle=text(ax,xyMin(1),xyMax(2),['  ',ax.Legend.Title.String],...
      'FontSize',ax.Legend.Title.FontSize,'VerticalAlignment','top','FontWeight','bold','Color',legendTitleColor);
end

% 返回值
legendBox.Title=ax.Legend.UserData.NewTitle;
legendBox.Box=ax.Legend.UserData.NewBkg;

oriFunc=ax.Parent.WindowButtonMotionFcn;
set(ax.Parent,'WindowButtonMotionFcn',@bt_move);% 设置鼠标移动回调
  function bt_move(~,~)
      oriFunc();
      if ~isempty(regexpi(ax.Legend.Location,'out', 'once'))
          lgdPos=ax.Legend.Position;
          % 依据legend所处figure坐标和axes范围计算Legend坐标
          xyMin=[(lgdPos(1)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
              (lgdPos(2)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
          xyMax=[(lgdPos(1)+lgdPos(3)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
              (lgdPos(2)+lgdPos(4)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
          xyMin(1)=max(xyMin(1),ax.XLim(1));
          xyMin(2)=max(xyMin(2),ax.YLim(1));
          xyMax(1)=min(xyMax(1),ax.XLim(2));
          xyMax(2)=min(xyMax(2),ax.YLim(2));
          % 重设位置属性
          ax.Legend.UserData.NewTitle.Position=[xyMin(1),xyMax(2)];
      else
          lgdPos=ax.Legend.Position;
          % 依据legend所处figure坐标和axes范围计算Legend坐标
          xyMin=[(lgdPos(1)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
              (lgdPos(2)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
          xyMax=[(lgdPos(1)+lgdPos(3)-ax.Position(1))/ax.Position(3)*(ax.XLim(2)-ax.XLim(1))+ax.XLim(1),...
              (lgdPos(2)+lgdPos(4)-ax.Position(2))/ax.Position(4)*(ax.YLim(2)-ax.YLim(1))+ax.YLim(1)];
          xyMin(1)=max(xyMin(1),ax.XLim(1));
          xyMin(2)=max(xyMin(2),ax.YLim(1));
          xyMax(1)=min(xyMax(1),ax.XLim(2));
          xyMax(2)=min(xyMax(2),ax.YLim(2));
          xDiff=(xyMax(1)-xyMin(1));
          yDiff=(xyMax(2)-xyMin(2));
          % 重设位置属性
          ax.Legend.UserData.NewBkg.Position=[xyMin,xDiff,yDiff];
          ax.Legend.UserData.NewTitle.Position=[xyMin(1),xyMax(2)];
      end
  end
end

到此这篇关于详解Matlab如何绘制圆角半透明图例的文章就介绍到这了,更多相关Matlab圆角半透明图例内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://mp.weixin.qq.com/s/UKpnuqYiIhjYVbh-Sxs8sA

延伸 · 阅读

精彩推荐
  • C/C++利用Matlab实现图像亮度分布统计图

    利用Matlab实现图像亮度分布统计图

    这篇文章主要介绍了如何利用Matlab实现图像亮度分布统计图的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,感兴趣的可以了解一下...

    slandarer3772022-12-05
  • C/C++C语言学生学籍管理系统课程设计

    C语言学生学籍管理系统课程设计

    这篇文章主要介绍了C语言学生学籍管理系统课程设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    lee3710424742021-06-18
  • C/C++C语言实现二叉链表存储

    C语言实现二叉链表存储

    这篇文章主要为大家详细介绍了C语言实现二叉链表存储的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    data_heng10762021-07-01
  • C/C++C/C++的内存管理你了解嘛

    C/C++的内存管理你了解嘛

    这篇文章主要为大家介绍了C/C++的内存管理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    Bitdancing10552022-09-03
  • C/C++C语言实现的顺序表功能完整实例

    C语言实现的顺序表功能完整实例

    这篇文章主要介绍了C语言实现的顺序表功能,结合完整实例形式分析了C语言顺序表的创建、添加、删除、排序、合并等相关操作技巧,需要的朋友可以参考下...

    Tom文星9622021-06-24
  • C/C++C/C++常用函数易错点分析

    C/C++常用函数易错点分析

    这篇文章主要介绍了C/C++常用函数易错点分析,包含了memset、sizeof、getchar三个常用函数的分析,需要的朋友可以参考下...

    C++教程网9082021-01-30
  • C/C++C++实现LeetCode(28.实现strStr()函数)

    C++实现LeetCode(28.实现strStr()函数)

    这篇文章主要介绍了C++实现LeetCode(28.实现strStr()函数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang11772021-11-25
  • C/C++八皇后问题实现代码分享

    八皇后问题实现代码分享

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例,这篇文章主要介绍了八皇后问题实现代码,需要的朋友可以参考下...

    C语言程序设计9472021-01-16