我可以使用以下方法在MATLAB中绘制多个断开的线段:
x1=[0 1 .2];
y1=[0 2 1];
x2=[1 .5 .8];
y2=[1 -1 -.5];
lh=line([ x1' x2' ]',[ y1' y2' ]');
此处x1
和y1
是起点的x坐标和y坐标的数组,以及终点的x2
和y2
。
lh
是创建的多行对象的处理程序:
但是,我无法使用传统的set
修改此对象的数据,而不是单行:
>> set(lh, 'XData', [ x1' x2' ]');
Error using matlab.graphics.primitive.Line/set
While setting the 'XData' property of Line:
Value must be a vector of numeric type
任何想法如何做到这一点?
其他信息:查询其XData产量:
>> lh.XData
ans =
0 1
ans =
1.0000 0.5000
ans =
0.2000 0.8000
答案 0 :(得分:2)
这很奇怪。出于好奇,我尝试这样做了:
set(lh, 'XData', get(lh, 'XData'));
...但收到同样的错误。
作为一种解决方法,您可以直接修改struct数组:
for ii = 1:numel(lh)
lh(ii).XData = [x1(ii) x2(ii)];
end
答案 1 :(得分:0)
因为您已经创建了三个线对象,而不仅仅是一个,所以需要为每个对象单独设置属性。最明确的选项是循环遍历线对象并相应地设置属性,但您还有另外两个选项:
<强> 1。使用set
如果查看the documentation for set
,它会在“设置线条样式为多行不同值”下提供一个语法相似的示例&#39;标题:
P = plot(rand(4));
NameArray = {'LineStyle'};
ValueArray = {'-','--',':','-.'}';
set(P,NameArray,ValueArray)
我们可以适应我们的工作范例:
x1=[0 1 .2];
y1=[0 2 1];
x2=[1 .5 .8];
y2=[1 -1 -.5];
lh=line([ x1' x2' ]',[ y1' y2' ]');
newdata = {[0 1]; [2 1]; [3 0]};
set(lh, {'XData'}, newdata);
这会产生一个新情节:
<强> 2。使用deal
的变体和新的句柄图形结构
正如您所注意到的,您现在可以使用点表示法直接处理所有属性,因为MATLAB's graphics handles are now objects。我们可以使用deal
函数的变体来利用这一点,该函数可以在&#39;示例3 - 执行相同操作而无需交易的情况下找到。在文档中标题,将我们的单元格数据数据分发到各自的XData
属性:
x1=[0 1 .2];
y1=[0 2 1];
x2=[1 .5 .8];
y2=[1 -1 -.5];
lh=line([ x1' x2' ]',[ y1' y2' ]');
newdata = {[0 1]; [2 1]; [3 0]};
[lh.XData] = newdata{:};
产生相同的结果。