在Matlab中,是否可以组合多个选项并传递给绘图函数?

4

我正在使用MATLAB绘制多个图形,并希望这些图形使用相同的绘图选项,它看起来像这样:

N = 20;
Fs = 200;
t = (0:N-1)/Fs;

x = sin(2*pi*10*t);
y = cos(2*pi*20*t);
z = x + y;

figure(1),clf;
subplot(311);
plot(t, x, 'bs-', 'MarkerFaceColor', 'b', 'LineWidth', 3);
grid on;
subplot(312);
plot(t, y, 'bs-', 'MarkerFaceColor', 'b', 'LineWidth', 3);
grid on;
subplot(313);
plot(t, z, 'bs-', 'MarkerFaceColor', 'b', 'LineWidth', 3);
grid on;

您可以看到这些绘图选项是完全相同的。如果我想要更改样式,我必须更改每个选项。 是否可能将它们组合在一起并传递给绘图函数? 我曾尝试将它们放入一个单元中,如下所示: plotOptions = {'bs-', 'MarkerFaceColor', 'b', 'LineWidth', 3}; 但它没有起作用。 原因可能是绘图函数会将plotOptions视为一个参数,并因此无法解析它

2
您可以根据指定的属性编写自己的函数,并使用不同的参数多次调用它。 - rozsasarpi
4个回答

10

使用带有选项的单元格已经是一个不错的方法。只需像下面这样使用{:}

opt = {'bs-', 'MarkerFaceColor', 'b', 'LineWidth', 3};
figure(1),clf;
subplot(311);
plot(t, x, opt{:});

那么,单元格中的每个元素将作为单个参数进行评估。

太棒了,这正是我想要的方式。非常感谢。 - shehperd

3

具有独特绘图功能的解决方案:

subplot(312);
myplot(t,y)

myplot函数保存为单独的m文件。

function myplot(t,x)
    plot(t, x, 'bs-', 'MarkerFaceColor', 'b', 'LineWidth', 3);
end

谢谢您的回复。是的,这也是一个不错的解决方案。特别是对于一些复杂的绘图,比如添加标签、网格、限制轴的范围等等,编写一个专门的函数来处理类似的绘图会更好。 - shehperd

2
单元格的答案很好,另一个选项是将arg值设置为变量:
faceColor = 'b';
lineWidth = 3;

figure(1),clf;
subplot(311);
plot(t, x, 'bs-', 'MarkerFaceColor', faceColor, 'LineWidth', lineWidth);
subplot(312);
plot(t, y, 'bs-', 'MarkerFaceColor', faceColor, 'LineWidth', lineWidth);
subplot(313);
plot(t, z, 'bs-', 'MarkerFaceColor', faceColor, 'LineWidth', lineWidth);

谢谢您的回复。是的,我同意您的观点,单元格答案对我的情况非常简单和有用。将特定的单元格作为变量对于每个图形样式不同的情况非常有帮助。 - shehperd

2
一个非常简洁的替代方法是尽可能保持plot命令的简单,然后在之后操纵句柄。
opts = {'Color','red','MarkerFaceColor', 'b', 'LineWidth',3};

h(1) = plot(t, x);
grid on;
subplot(312);
h(2) = plot(t, y);
grid on;
subplot(313);
h(3) = plot(t, z);
grid on;

arrayfun(@(x) set(x,opts{:}),h)

与Nemesis提出的确实整洁的方法相比,其优点在于,如果您有多组属性,例如:
opts.slimRed = {'Color','red','MarkerFaceColor', 'b', 'LineWidth',1};
opts.fatBlue = {'Color','blue','MarkerFaceColor', 'b', 'LineWidth',5};

如果您想要交换它们,您只需要修改一个变量。

arrayfun(@(x) set(x,opts.fatBlue{:}),h)

改变整个句柄集合 h 的外观。


我也喜欢这种方法。此外,arrayfun 看起来非常强大。 - shehperd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接