MATLAB:修改多行对象

时间:2015-08-18 22:51:31

标签: matlab graphics plot line

我可以使用以下方法在MATLAB中绘制多个断开的线段:

x1=[0 1 .2];
y1=[0 2 1];
x2=[1 .5 .8];
y2=[1 -1 -.5];
lh=line([ x1' x2' ]',[ y1' y2' ]');

Plotting multiple line segments in MATLAB

此处x1y1是起点的x坐标和y坐标的数组,以及终点的x2y2

lh是创建的多行对象的处理程序:

Multiple line object

但是,我无法使用传统的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

2 个答案:

答案 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);

这会产生一个新情节:

sample image

<强> 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{:};

产生相同的结果。