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

目录
  • 基本使用
  • 使用说明
  • 完整代码

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

(0)

相关推荐

  • 如何利用Matlab绘制出好看的火山图

    这里画了一个示例: 数据来源 绘制效果: 代码及说明: 使用代码时只需要改一开始导入的数据,和代码提示中X坐标区域范围和Y坐标区域范围,完整代码如下所示: % 读取数据 data=readmatrix('volcano.txt'); logFC=data(:,2); padj=data(:,3); DB_not=(padj>0.5)|(logFC<0.5&logFC>-0.5); DB_up=padj<=0.05&logFC>=0.5; DB_down=pad

  • 详解Matlab如何绘制小提琴图

    目录 1使用示例 基础使用,Y为矩阵 基础使用,Y为向量,X为标签 基础使用多个图像绘制,并添加图例 2完整代码 写了个matlab绘制小提琴图的函数: 1.图中小提琴状区域为核密度曲线 2.白色方块为25%,75%分位数 3.中间横线为中位数 4.白色点为离群值点 5.竖着的黑线是去掉离群值点后点的上下限 1使用示例 基础使用,Y为矩阵 X=1:5; Y=randn(100,5); Hdl1=violinChart(gca,X,Y,[0 0.447 0.741],0.6); X:横坐标 Y:数

  • Matlab实现生成箭头坐标轴详解

    目录 demo1基础使用 demo2轴方向 demo3轴的其他属性 后言 属实是写工具函数写上瘾了,又写了一个一行代码将坐标轴变为箭头坐标轴的函数,而且可以对其进行随意拖动和缩放(拖动需要先点击那个像手掌的符号): 功能函数的引用非常简单,就只是在最后面加上一行: arrowAxes()或者arrowAxes(ax) 即可,以下给出几个例子: demo1 基础使用 就像上面说的一样,编写好代码后在最后面引用一下工具函数即可: % arrow axes demo1 % @author:slanda

  • Matlab绘制酷炫坐标区域的方法详解

    目录 使用方式 其他炫酷的背景 注意事项 代码展示及mat文件获取 写了一个能让坐标区域变得很炫酷的修饰函数: 同时想到了一个很有意思的把函数存储进mat文件的方法,方法就不细讲了,大家自行点开.mat文件能够很轻松的理解原理(大概), 使用方式 首先说明一下函数咋用:假设编写了如下函数: 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

  • 详解Matlab如何绘制桑基图

    目录 详细用法 1使用示例 2输入参数 3输出 函数完整代码 使用示例代码 这次主要是分享自己写的一个函数,用来绘制桑基图,效果大概是下面这样子: 先说明函数(sankey2)怎么用,函数完整代码放在博客最后 详细用法 1 使用示例 新建一个m文件,运行如下代码 List={'a1',1,'A'; 'a2',1,'A'; 'a3',1,'A'; 'a3',0.5,'C'; 'b1',1,'B'; 'b2',1,'B'; 'b3',1,'B'; 'c1',1,'C'; 'c2',1,'C'; 'c

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

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

  • 详解Matlab绘制3D玫瑰花的方法(内附旋转版本)

    目录 1.玫瑰花绘制 绘制效果 完整代码 2.月季花绘制 绘制效果 完整代码 3.玫瑰配色 4.旋转版本 1.玫瑰花绘制 绘制效果 完整代码 function drawrose grid on [x,t]=meshgrid((0:24)./24,(0:0.5:575)./575.*20.*pi+4*pi); p=(pi/2)*exp(-t./(8*pi)); change=sin(15*t)/150; u=1-(1-mod(3.6*t,2*pi)./pi).^4./2+change; y=2*(

  • 详解Matlab实现动态表白图的绘制

    目录 1.幸福和快乐的哲学追问 2.提前祝女朋友节日快乐 2.1 展现 2.2 代码 1.幸福和快乐的哲学追问 在过去的500年间,我们见证了一连串令人惊叹的革命.地球在生态和历史上都已经整合成一个单一的领域.经济呈现指数增长,今日人类所享有的财富在过去只有可能出现在童话里.而科学和工业革命也带给我们超人类的力量,以及几乎可以说无限的能源.不仅社会秩序完全改变,政治.日常生活和人类心理也彻底改观. 只不过,我们真的更快乐了吗?人类在过去5世纪间积蓄的财富,是不是真的让我们找到了新的满足感?有了取

  • 详解Python+Turtle绘制奥运标志的实现

    目录 1. 画圆 2. 画奥运标识 3. 重构代码 4. 美化标识 5. 总结 最近了解了Python Turtle,非常简单有趣.为了培养小朋友兴趣,写个turtle画奥运标志程序. 1. 画圆 turtle属于内置包,无需安装.只要导入即可以画图,下面先写几行代码画圆. import turtle t = turtle.Pen() t.circle(50) t.getscreen()._root.mainloop() 导入turtle之后,创建Pen画笔t,避免后续代码.circle方法是画

  • 详解JavaScript+Canvas绘制环形进度条

    目录 效果图 思考 实现思路 具体代码实现 效果图 思考 移动端的场景里经常会出现环形进度条的功能,在实现这个功能前,我预想的解决方案大致有: echarts.antv.canvas.svg 前面两种第三方提供的解决方案当然是简单,拿到案例修整一下即可,但是需要下载依赖,而且代码量不小.有没有不需要依赖第三方包,采用原生的写法,独立封装成一个组件,降低耦合,而且性能优越? 当然,那就主要介绍canvas的使用 实现思路 可以展示整个圆.半圆以及任意角度弧形(左右对称)的进度条.整体思路如下: 1

  • 详解Flutter如何绘制曲线,折线图及波浪动效

    目录 正弦曲线绘制 波浪动效 曲线绘制 折线图 其他说明 总结 简介 上一篇用 Flutter 的 Canvas 画点有趣的图形我们介绍了使用 CustomPaint 绘制自定义形状,可以看到有了图形的平面绘制数学计算方法,我们可以画出所需的形状.本篇我们来介绍线条类图形的绘制,并且结合 Animation 实现了常见的波浪动效.通过本篇,你可以了解到: 正弦曲线的绘制 利用两条正弦曲线加上 Animation 实现波浪动效 曲线的一般绘制方法 折线图绘制 下面是最终实现的效果图,接下来我们一项

  • 详解Matlab中自带的Java操作合集

    目录 1 获取鼠标在全屏位置 2 获取当前剪切板内容 3 内容复制到剪切板 4 获取鼠标处像素颜色 5 获取屏幕截图 6 创建java窗口(并使其永远在最上方) 7 透明窗口 1 获取鼠标在全屏位置 屏幕左上角为坐标原点,获取鼠标位置和获取鼠标像素颜色建议和while循环或者timer函数结合使用: import java.awt.MouseInfo; mousepoint=MouseInfo.getPointerInfo().getLocation(); mousepoint=[mousepo

  • 详解Python+Matplotlib绘制面积图&热力图

    目录 1.绘制面积图 2.绘制热力图 1.绘制面积图 面积图常用于描述某指标随时间的变化程度.其面积也通常可以有一定的含义. 绘制面积图使用的是plt.stackplot()方法. 以小学时期学的 常见的追击相遇问题中的速度时间图像为例,下边绘制出一幅简单的v-t图像. 全局字体设为默认的黑体,时间为从第0秒到第10秒,描述的是甲乙两个物体的速度.显然,面积则表示位移. 标题部分字体使用楷体(将系统中的TTF字体文件"STKAITI.TTF"复制到了当前目录下). import mat

随机推荐