2016-10-09 3 views
1

Вот координаты, которые я планирую построить, имя файла Coords:Участок линии между всеми разрозненными точками и регулировать толщину линии в зависимости от расстояния между точками

x  y 
0.0110 0.1105 
-0.2730 0.2559 
0.3610 0.1528 
-0.0077 -0.2520 
-0.2412 -0.1979 
0.0444 -0.0526 
0.0543 -0.0076 
-0.1710 0.1170 
0.12741 -0.0448 
0.0949 -0.0811 

Вот мой код, участки разброс график первый:

Hold on 
%Plot Coordinate 
For i=1:10 
    dot_size = 100; 
    scatter (Coords(i,1) ,Coords(i,2), dot_size, 'filled', 'MarkerEdgeColor', 'k'); 
end 

%Draw line distance between each points 
for i=1:10 
    for j=1:10 
      plot([Coords(i,1) Coords(i,2)], [Coords(j,1) Coords(j,2)]); 
    end 
end 
Hold off 

%Sets the size of the y and x axis 
xlim([ min(Coords(:,1)) max(Coords(:,1)) ]); 
ylim([ min(Coords(:,2)) max(Coords(:,2)) ]); 
axis off; 

Вот результат я получаю:

scatter figure

Я не знаю, почему линии рисуются повсюду. Я также замечаю, что даже когда plot(x,y) = 0, линия все еще рисуется.

Я также хотел бы изменить толщину и непрозрачность линии в зависимости от расстояния между двумя точками: например. более толстая и темная линия для короткого расстояния между точками. И более тонкая/более светлая линия, если расстояние между двумя точками длинное.

Я хочу, чтобы мой участок, чтобы выглядеть примерно так:

Ideal result

ответ

3

Причина ваши линии не совпадают рассеянные точек координаты вы даете plot; Координаты находятся в неправильном порядке, и поэтому они не определяют правильные линии.

Я изменил ваш код, чтобы исправить эту проблему. Я заменил plot на line, но вы также можете сделать то же самое с plot. Кроме того, я определил anonymous functionsf и g, чтобы определить цвет и толщину каждой линии на основе расстояния до двух концов, d. Вы можете изменить эти функции, чтобы получить различное графическое поведение.

n = 10; % number of points 
dot_size = 100; 
Coords = rand(n, 2); 
% maximum possible length in your coordination plane: 
L = norm([max(Coords(:,1))-min(Coords(:,1)),max(Coords(:,2))-min(Coords(:,2))]); 
% this function defines the line width: 
f = @(x) L/(x + 0.1); % 0.1 avoids huge line widths in very small distances 
% this function defines the color: 
g = @(x) x * [1 1 1]/L; 
figure 
hold on 
for ii = 1:n-1 
    for jj = ii+1:n 
     d = norm([Coords(ii,1)-Coords(jj,1), Coords(ii,2)-Coords(jj,2)]); 
     line([Coords(ii,1) Coords(jj,1)], [Coords(ii,2) Coords(jj,2)], ... 
      'LineWidth', f(d), 'Color', g(d)); 
    end 
end 
scatter (Coords(:,1), Coords(:,2), dot_size, 'filled', 'MarkerEdgeColor', 'k'); 
axis tight 
axis off 

С этим выходом:

enter image description here

Примечание:

  1. axis tight является командой, которая устанавливает ограничения на сжатом возможно. Это эквивалентно вашему xlim([ min(Coords(:,1)) max(Coords(:,1)) ]); и следующей строке.
  2. В for -loops вы должны стараться избегать выбора одной пары точек дважды или одной точки с обеих сторон линии.
  3. Для рассеяния вам не нужна петля. Все это можно было сделать сразу.
  4. Я привел scatter после прокладки линий, поэтому круги нарисованы сверху.
2

Существует также специализированная функция MATLAB для создания таких участков: gplot.

data = [ 
    0.0110 0.1105 
    -0.2730 0.2559 
    0.3610 0.1528 
    -0.0077 -0.2520 
    -0.2412 -0.1979 
    0.0444 -0.0526 
    0.0543 -0.0076 
    -0.1710 0.1170 
    0.12741 -0.0448 
    0.0949 -0.0811]; % Coordinates 

    adjM = squareform(pdist(data)); % 
    adjM (adjM > 0) = 1; % Form adjacency matrix based on Euclidean distances 


figure; gplot(adjM, data, '-o') % Plot figure based on coordinates and adjacency matrix 

enter image description here

Затем настроить по своему вкусу, например,если вы хотите изменить тип маркера, удалите ось, добавьте метки и т. д.

+0

Это действительно полезно! Большое спасибо! – tamkrit

Смежные вопросы