在matlab中绘制元素之间的链接

时间:2013-12-09 11:18:00

标签: matlab hyperlink plot

我想通过点的方式想象我在程序中创建的消声器。点应该代表消声器的一部分。例如:

types =

'straight'
'helmholtz'
'expansion'
'straight'
'contraction'
'straight'
'helmholtz'

这是一个消声器,沿轴线具有所有类型的元素。问题是helmholtz元素应该位于前一个元素的顶部。在相同的X值但Y + 1。它应该看起来像gplot,但不是以每个人都在表示的循环方式。如果我写下来它应该是这样的。

Helmholtz Helmholtz    我,我 直----扩张----直 - 收缩-----直

圆圈代表文字,线条将按照指示连接。 这是我尝试过的最好的但却无法接近我想要的东西

types={'straight';'helmholtz';'expansion';'straight';'contraction';'straight';'helmholtz'}
index = size(find(strcmp(types,'helmholtz')))
coords = [];
for it=1:size(types,1)-size(find(strcmp(types,'helmholtz')),1)
if strcmp(types, 'Straight')
    coords= [it, 1]
end
if strcmp(types, 'contraction')
    coords= [it, 1]
end
if strcmp(types, 'expansion')
    coords= [it, 1]
end
if strcmp(types, 'helmholtz')
    coords= [it-1,2]
end

end

axes(handles.NodePlot);
plot(coords(:), '-o');
text(coords(:,1) - 0.1, coords(:,2) + 0.1, num2str((1:amountofNodes)), 'FontSize', 14)
你能不能把我推向正确的方向?

欢呼声

2 个答案:

答案 0 :(得分:0)

你的主要问题在于循环。一方面,你在每次迭代中替换数组`coords``而不是填充它;另一方面,范围似乎是假的(为什么在结束之前停止循环?)。

我向您提出以下简单代码:

coords = zeros(length(types)+sum(strcmp(types,'helmholtz')),2);
j = 0; k = 1;
for i=1:length(types)
  if strcmp(types{i},'helmholtz')
    coords(k,:) = [j-1,2]; y(k+1,:) = [j-1,1]; k = k+2;
  else
    coords(k,:) = [j,1]; k = k+1;
    j = j+1;
  end
end
plot(coords(:,1),coords(:,2),'o-')
//adding labels
j=1;
for i=1:length(coords);
  if i==1 || y(i,2)>=y(i-1,2)
    text(y(i,1), y(i,2) + 0.05, [types{j}], 'FontSize', 12);
    j = j+1;
  end
end

变量j将位置存储在消声器中,k存储数组coords中的索引,i存储数组中的索引。为了速度,我预先设置了数组coords。然后,对于每个元素,如果它匹配“helmholtz”,我创建2个点,一个用于点本身,另一个是前一个点的重复,并且被放置用于好看的情节。当您具有这样的配置时,您将看到从消防车的第1行到第2行的一个段,如__|__,而不是像__|\_那样的三角形。 标签符合此规则;我承认我没有做太多努力来渲染循环:)。

答案 1 :(得分:0)

    function plotter(handles)

    coords = zeros(length(handles.types)+sum(strcmp(handles.types,'helmholtz')),2);
    j = 0; k = 1;
    y=[]; h=0;
    for i=1:length(handles.types)
      if strcmp(handles.types{i},'helmholtz')
        coords(k,:) = [j-1,2];
        coords(k+1,:) = [coords(k-1,1),coords(k-1,2)];
        y(k-h,:) = [j-1,1];
        k = k+2;
        h=h+1;

      else
        coords(k,:) = [j,1];
        y(k-h,:)=[i-1-h,0];
        k = k+1;
        j = j+1;

      end
    end
    plot(coords(:,1),coords(:,2),'-o')
    %//adding labels

    for i=1:length(handles.types);

      text(y(i,1), y(i,2) + 1.05, [handles.types{i}], 'FontSize', 12);

我完全忘了发布我的解决方案:)对不起!这最终成为了什么。它已经扩展到其他东西,但就像我说:你指出了我正确的方向!

干杯