在不影响y轴值的情况下,在开放的Matlab图形中移动x轴值需要哪些命令? (如下图所示)
到目前为止,我最好的猜测是:
LineH = get(gca, 'Children');
x = get(LineH, 'XData');
y = get(LineH, 'YData');
offset=20;
nx = numel(x);
for i=1:nx
x_shifted{i} = x{i} + offset;
end
set(LineH,'XData',x_shifted')
这给了我错误:
Error using matlab.graphics.chart.primitive.Line/set
While setting the 'XData' property of Line:
Value must be a vector of numeric type
谢谢!
答案 0 :(得分:3)
显然,您无法使用单元格数组同时设置所有行的'XData'
属性。
编辑它可以完成;见@gnovice's answer。
您可以做的只是将set
语句移动到循环中:
LineH = get(gca, 'Children');
x = get(LineH, 'XData');
y = get(LineH, 'YData');
offset=20;
nx = numel(x);
for i=1:nx
x_shifted{i} = x{i} + offset;
set(LineH(i),'XData',x_shifted{i}); % set statement with index i
end
答案 1 :(得分:3)
您必须在单元格中封装'XData'
property名称,以便一次更新多个绘图对象。来自set
文档:
set(H,NameArray,ValueArray)
使用单元格数组NameArray
和ValueArray
指定多个属性值。要在每个n
图形对象上设置m
属性值,请将ValueArray
指定为m
- by -n
单元格数组,其中m = length(H)
n
等于NameArray
中包含的属性名称数。
因此,要修复错误,您只需将最后一行更改为:
set(LineH, {'XData'}, x_shifted');
如果您对此感兴趣,请使用cellfun
代替循环的解决方案:
hLines = get(gca, 'Children');
xData = get(hLines, 'XData');
offset = 20;
set(hLines, {'XData'}, cellfun(@(c) {c+offset}, xData));