




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第详解Matlab如何绘制圆角半透明图例目录基本使用使用说明完整代码目前MATLAB的legend图例是不支持圆角和半透明的,欸,不能咱就自己画,就是把原始图例隐藏后不断追踪其位置绘制半透明的圆角矩形嘛,这有任何难度吗???完全没有!!因此就有了这篇推送(目前不支持三维绘图):
基本使用
继续假设我们编写了如下代码:
t=0:0.35:3*pi;
plot(t,sin(t),'Marker','d','LineWidth',2,'Color',[102,194,166]./255)
holdon
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()
使用说明
当拖拽图例到其他位置,图例框会跟随:
当调整图窗大小导致图例框大小异常时,在图例附近晃动鼠标即可修复大小:
完整代码
functionlegendBox=prettyLegend(ax)
ifnargin1
ax=gca;
holdon
legendTitleColor=[0,0,0];
ifmean(ax.Color)0.5
legendTitleColor=[1,1,1];
ax.Legend.TextColor=[1,1,1];
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);
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.390.410.39],'FaceColor',[111.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);
%返回值
legendBox.Title=ax.Legend.UserData.NewTitle;
legendBox.Box=ax.Legend.UserData.NewBkg;
oriFunc=ax.Parent.WindowButtonMotionFcn;
set(ax.Parent,'WindowButtonMotionFcn',@bt_move);%设置鼠标移动回调
functionbt_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))
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论