广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解Matlab如何绘制圆角半透明图例
  • 818
分享到

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

2024-04-02 19:04:59 818人浏览 薄情痞子
摘要

目录基本使用使用说明完整代码目前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)

绘图结果如下:

在代码最后加上一行:

prettyLegend()

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

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

prettyAxes().dark2()

prettyLegend()

prettyAxes().dark()

prettyLegend()

使用说明

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

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

完整代码

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圆角半透明图例内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Matlab如何绘制圆角半透明图例

本文链接: https://www.lsjlt.com/news/149271.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Matlab如何绘制圆角半透明图例
    目录基本使用使用说明完整代码目前MATLAB的legend图例是不支持圆角和半透明的,欸,不能咱就自己画,就是把原始图例隐藏后不断追踪其位置绘制半透明的圆角矩形嘛,这有任何难度吗??...
    99+
    2022-11-13
  • 详解Matlab如何绘制桑基图
    目录详细用法1使用示例2输入参数3输出函数完整代码使用示例代码这次主要是分享自己写的一个函数,用来绘制桑基图,效果大概是下面这样子: 先说明函数(sankey2)怎么用,函数完...
    99+
    2022-11-13
  • 详解Matlab如何绘制小提琴图
    目录1使用示例基础使用,Y为矩阵基础使用,Y为向量,X为标签基础使用多个图像绘制,并添加图例2完整代码写了个matlab绘制小提琴图的函数: 1.图中小提琴状区域为核密度曲线 2.白...
    99+
    2022-11-13
  • 详解如何基于Pyecharts绘制常见的直角坐标系图表
    目录1.直方图2.折线图3.箱形图4.散点图5.带涟漪效果散点图6.k线图7.热力图8.象型图9.层叠图总结1.直方图 # -*-coding:utf-8 -*- # @Time :...
    99+
    2022-11-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作