MATLAB | 19a到22a之间都更新了哪些绘图新特性?

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 19a到22a之间都更新了哪些绘图新特性?相关的知识,希望对你有一定的参考价值。

本期主要讲解一下从R2019a到R2022a版本MATLAB在绘图方面有了哪些实用的功能?

R2019a

19a.1 十六进制颜色可用

之前的版本中MATLAB的图形对象只能使用0-1范围内的RGB用于给图形对象赋予颜色,但自19a开始可以使用十六进制码对颜色进行赋值,例如:

t=linspace(0,4*pi,500);
y1=cos(t).^2;
y2=sin(t).^2./t;

hold on
area(t,y1,'FaceColor','#A94047','FaceAlpha',.6);
area(t,y2,'FaceColor','#004073','FaceAlpha',.6)

19a.2 图形导出空白更少

使用坐标区工具栏导出裁剪更精确的坐标区
点击或轻按坐标区工具栏中的导出按钮,将坐标区保存为图像或 PDF 文件。保存的内容会围绕坐标区精确裁剪,尽可能减少留白。

如同所示,若将XTick\\YTick设置为[],将XColor\\YColor设置为none则导出区域更小,只有图示矩形区域。

19a.3 可交互平行坐标图

更新了一个新的绘图函数parallelplot,用于绘制可交互的平行坐标图(parallel coordinates plot):

outages=readtable('outages.csv');

coordvars=[1 3 4 6];
p=parallelplot(outages,'CoordinateVariables',coordvars,'GroupVariable','Cause');

19a.4 实时编辑器控件

我在不得不知道的小技巧第二期提到过这玩意,在这再重述一遍叭:

这是一个更方便调整参数的模块。点击图示按钮即可插入各种类型的控件:

插入之后双击控件即可设置其属性:

举几个简单的例子(因为推送显示不了控件,因此给出的代码为无控件版本,请自行添加控件):

蝴蝶线

a=3.5;
clc;cla;clf
x=linspace(0,2*pi,500);
hdl=polarplot(x,sin(x)+sin(a.*x).^3,'LineWidth',1.5);
ax=gca;ax.RTick=[];

变色玫瑰花

clc;cla;clf
CMAP="parula";
[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*(x.^2-x).^2.*sin(p);
r=u.*(x.*sin(p)+y.*cos(p));
h=u.*(x.*cos(p)-y.*sin(p));
surface(r.*cos(t),r.*sin(t),h,'EdgeAlpha',0.1,...
    'EdgeColor',[0 0 0],'FaceColor','interp')
colormap(CMAP)
grid on
view(45,45)

旋转多边形

lenRatio=0.19;
numEdge=7;
numPolygon=14;

clc;cla;clf
theta=linspace(0,2*pi,numEdge+1);
X=cos(theta);X(end)=[];
Y=sin(theta);Y(end)=[];

fill(X,Y,[0,0,0],'FaceColor','none');
hold on;
axis equal
axis([-1,1,-1,1])

for i=1:numPolygon
    tX=[X(2:end),X(1)];
    tY=[Y(2:end),Y(1)];
    X=(tX-X).*lenRatio+X;
    Y=(tY-Y).*lenRatio+Y;
    fill(X,Y,[0,0,0],'FaceColor','none');
end
hold off

R2019b

19b.1 自定义的图类

MATLAB很早之前就可以自定义类来绘图,不过这次开放功能后能够通过.运算更容易的修改属性和实时更新图形,官网给出一个例子:

classdef SmoothPlot < matlab.graphics.chartcontainer.ChartContainer
    properties
        XData (1,:) double = NaN
        YData (1,:) double = NaN
        SmoothColor (1,3) double mustBeGreaterThanOrEqual(SmoothColor,0),...
            mustBeLessThanOrEqual(SmoothColor,1) = [0.9290 0.6940 0.1250]
        SmoothWidth (1,1) double = 2
    end
    properties(Access = private,Transient,NonCopyable)
        OriginalLine (1,1) matlab.graphics.chart.primitive.Line
        SmoothLine (1,1) matlab.graphics.chart.primitive.Line
    end
    
    methods(Access = protected)
        function setup(obj)
            % Get the axes
            ax = getAxes(obj);
            
            % Create the orginal and smooth lines
            obj.OriginalLine = plot(ax,obj.XData,obj.YData,'LineStyle',':');
            hold(ax,'on')
            obj.SmoothLine = plot(ax,NaN,NaN,'LineStyle','-',...
                'Color',obj.SmoothColor,'LineWidth',obj.SmoothWidth);
            hold(ax,'off')
        end
        function update(obj)
            % Update line data
            obj.OriginalLine.XData = obj.XData;
            obj.OriginalLine.YData = obj.YData;
            obj.SmoothLine.XData = obj.XData;
            obj.SmoothLine.YData = createSmoothData(obj);
            
            % Update line color and width
            obj.SmoothLine.Color = obj.SmoothColor;
            obj.SmoothLine.LineWidth = obj.SmoothWidth;
        end
        function sm = createSmoothData(obj)
            % Calculate smoothed data
            v = ones(1,10)*0.1;
            sm = conv(obj.YData,v,'same');
        end
    end
end

绘图:

x = 1:1:100;
y = 10*sin(x./5) + 8*sin(10.*x + 0.5);
c = SmoothPlot('XData',x,'YData',y);

快速属性设置示例一:

c.YData=c.YData./x;

快速属性设置示例二:

c.SmoothColor=[1,0,0];

19b.2 更详细的子图布局

tiledlayout 和 nexttile 将会变为 subplot替代品,这个函数我也讲过了,在这篇推送中:https://mp.weixin.qq.com/s/oN0Dckn1k4Y5lha2iYH2Ng

使用该函数可以轻松搞定截断坐标轴、共用colorbar、取消子图空隙等一系列subplot难以做到的事情,以下给出基本代码,详细信息查看上述推送:

取消子图空隙

tl=tiledlayout(2,2);
tl.TileSpacing='none';
tl.Padding='none';

[X,Y,Z]=peaks;

% 坐标区域块 1
nexttile
surf(X,Y,Z)

% 坐标区域块 2
nexttile
contour(X,Y,Z,20)
grid on

% 坐标区域块 3
nexttile
imagesc(Z)

% 坐标区域块 4
nexttile
plot3(X,Y,Z)
grid on

title(tl,'[surf] [contour] [imagesc] [plot3] chart of peaks')

共用colorbar

tl=tiledlayout(2,1);
tl.TileSpacing='tight';
tl.Padding='tight';

Z1=peaks;
Z2=membrane;

% 坐标区域块 1
nexttile
contourf(Z1,15)

% 坐标区域块 2
nexttile
contourf(Z2,10)

cb=colorbar;
cb.Layout.Tile='east';

多个colorbar

% 随便生成点数据
x=1:15;
n=70*randn(1,15)+50;
y1=n+x.^2; 
y2=n-linspace(1,225,15);
sz1=rand(1,15);
sz2=rand(1,15);
c=linspace(1,10,15);

% 创建冬天风格色带的气泡图
t=tiledlayout(1,1);
ax1=axes(t); 
bubblechart(ax1,x,y1,sz1,c)
colormap(ax1,'winter')

% 创建秋天风格色带的气泡图
ax2=axes(t);
bubblechart(ax2,x,y2,sz2,c)
colormap(ax2,'autumn')
ax2.Visible='off'; % 隐藏第二个坐标区域好让俩气泡图显示在一起

% 让两个气泡图的坐标范围相同完美融合
linkaxes(t.Children)

% 创建俩colorbar
cb1=colorbar(ax1);
cb1.Layout.Tile = 'east';
cb1.Label.String = 'Time (s)';

cb2=colorbar(ax2);
cb2.Layout.Tile='east';
cb2.Label.String='Concentration (M)';

截断坐标轴

% 绘制最底下的坐标区域
t=tiledlayout(1,2,'TileSpacing','compact');
bgAx=axes(t,'XTick',[],'YTick',[],'Box','off');
bgAx.Layout.TileSpan = [1 2];

% 生成数据
x=0:0.1:60;
y=4.*cos(x)./(x+2);

% 绘制[0,15]范围坐标区域
ax1=axes(t);
plot(ax1,x,y,'LineWidth',2)
xline(ax1,15,':');
ax1.Box='off';
xlim(ax1,[0 15])
xlabel(ax1,'First Interval')

% 绘制[45 60]范围坐标区域
ax2=axes(t);
ax2.Layout.Tile=2;
plot(ax2,x,y,'LineWidth',2)
xline(ax2,45,':');
ax2.YAxis.Visible='off';
ax2.Box='off';
xlim(ax2,[45 60])
xlabel(ax2,'Second Interval')

% 同步y轴坐标范围
linkaxes([ax1 ax2], 'y')

19b.3 ColorOrder立刻生效

即使画完图后修改ColorOrder也会立刻生效:

x = linspace(-2*pi,2*pi);
y1 = sin(x);
y2 = cos(x);

hold on
plot(x,y1,'LineWidth',2)
plot(x,y2,'LineWidth',2)
set(gca,'ColorOrder',[0,0,0;.3,.3,.4])

19b.4 堆叠条组负条形

堆叠条组在零的下方显示负的条形,而不是重叠它们:

y = [2 -2 3; 2 5 -6; -2 8 -9; -2 11 12];
bar(y,'stacked')


R2020a

20a.1 箱线图归并

之前只有下载了Statistics and Machine Learning Toolbox工具箱才能使用箱线图boxplot,归并后无需额外下载工具箱即可使用箱线图boxchart

X1=[1:2:7,13];
Y1=randn(100,5)+sin(X1);

boxchart(Y1) 

tbl = readtable('TemperatureData.csv');
monthOrder = 'January','February','March','April','May','June','July', ...
    'August','September','October','November','December';
tbl.Month = categorical(tbl.Month,monthOrder);
boxchart(tbl.Month,tbl.TemperatureF,'GroupByColor',tbl.Year)
ylabel('Temperature (F)')
legend

制作插画的软件都有哪些?

MATLAB 简易JK裙绘制器

荐读 | 凯迪克金奖绘本《小猫咪追月亮》

如何及时重绘画布?

Vue和React组件diff更新影响范围对比

为啥不更新重绘场景?