我有20-40个离散数字可以在Matlab程序中创建和保存。我正在尝试创建一个函数,它允许我输入元素(图像,线条,向量等)并通过将每个元素传递给for循环中的plot()来创建分层图:
function [ ] = constructFigs( figTitle, backgroundClass, varargin )
fig = figure('visible', 'off');
if strcmp(backgroundClass, 'plot') == 1
plot(varargin{1});
elseif strcmp(backgroundClass, 'image') == 1
imshow(varargin{1});
end
for i = 1:length(varargin)
hold on
if ndims(varargin{i}) == 2
plot(varargin{i}(:, 1), varargin{i}(:, 2))
else
plot(varargin{i});
end
end
saveas(fig, figTitle);
close(fig);
end
此功能有效但在绘制的内容方面非常有限;您无法执行某些类型的绘图操作(例如叠加图像),也无法将可选参数传递给plot()。我想要做的是传递要绘制的元素结构,然后将这些结构元素作为参数传递给plot()。例如(简化和语法错误):
toBePlotted = struct('arg1', {image}, 'arg2', {vector1, vector2, 'o'})
plot(toBePlotted.arg1)
plot(toBePlotted.arg2)
我能够以编程方式构造具有参数名称的结构,但是我无法以图表将接受它们作为参数的方式从结构中提取元素。
非常感谢任何帮助
答案 0 :(得分:1)
对于您的用例,您需要使用单元格展开{:}
来填充输出以进行绘图
plot(toBePlotted.arg1{:})
plot(toBePlotted.arg2{:})
这会将单元格数组toBePlotted.arg1
中包含的元素扩展为plot
的单独输入参数。
另一种选择是使用line
而不是plot
(较低级别的图形对象)并将构造函数传递给一个更易理解的结构,其中包含您要用于该结构的所有参数曲线图。
s = struct('XData', [1,2,3], 'YData', [4,5,6], 'Marker', 'o', 'LineStyle', 'none');
line(s)
老实说,在程序中进行绘图可能要容易得多,而不是单独使用函数,因为函数中没有使用很多自定义参数。
如果您真的想要一些简化的绘图,那么可以做这样的事情:
function plotMyStuff(varargin)
fig = figure();
hold on;
for k = 1:numel(varargin)
params = rmfield(varargin{k}, 'type');
switch lower(varargin{k}.type)
case 'line'
line(params);
case 'image'
imagesc(params);
otherwise
disp('Not supported')
return
end
end
saveas(fig);
delete(fig);
end
plotMyStuff(struct('XData', [1,2], 'YData', [2,3], 'type', 'line'), ...
struct('CData', rand(10), 'type', 'image'));