МАТЛАБ: Как сохранить соотношение сторон заполненных эллипсов при использовании функции «заливка»? - PullRequest
0 голосов
/ 13 февраля 2019

Я строю заполненные круги и эллипсы на графике xy.Эллипсы получены из тензорных данных 2x2.Направления x и y имеют совершенно разные единицы измерения в зависимости от типа данных, которые я строю.Я хочу, чтобы эллипс отображался в некотором (x, y) месте на графике, но я хочу, чтобы соотношение сторон построенного эллипса сохранялось независимо от единиц по осям x и y.Обратите внимание, что axis equal здесь не вариант, потому что шкалы x и y очень разные.Если я попытаюсь сделать axis equal, это просто сделает сюжет очень маленьким.

Ниже приведен простой пример.В этом примере первый эллипс всегда является идеальным кругом для справки, чтобы увидеть, как его искажает фигура.Любая помощь приветствуется.

x = 100*[1 2 3 4]; %x direction is several orders of magnitude larger than y direction
y = [1 2 3 4]; %y direction
data = randn(4,1); %data to fill ellipse (irrelevant to the question)

nrot = 36; %Number of points on each ellipse

for i = 1:4
    %Elements of 2x2 tensor to make the ellipse
    r1 = randn; r2 = randn; r3 = randn; r4 = randn;

    for irot=1:nrot %Loop to get ellipse points

        rot_ang = (irot-1)*360/(nrot-1);
        v = [cosd(rot_ang),sind(rot_ang)]; %Rotating vector components

        if i == 1 %Ensure that the first ellipse is a perfect circle
            r1 = 0; r4 = 0; r3 = r2;
        end

        plot_vec = [r1 r2; r3 r4]*v';

        %x component of ellipse to plot
        ex(irot) = plot_vec(1);

        %y component of ellipse to plot
        ey(irot) = plot_vec(2);  
    end 

    %Plot the ellipse at the x-y location
    xp = x(i)+ex;
    yp = y(i)+ey;

    fill(xp,yp,data(i)); hold on %Plot ellipses filled with "data".


end

%"Axis equal" does not work in this case
%axis equal

1 Ответ

0 голосов
/ 13 февраля 2019

Звучит так, будто вы хотите, чтобы ваши эллипсы имели отображаемое соотношение сторон данных 1: 1, даже если соотношение сторон данных осей отсутствует.Один из вариантов - сначала выбрать соотношение сторон данных , которое вы хотите для своих осей, а затем соответственно масштабировать значения y ваших эллипсов перед их переводом и нанесением на график:

x = 100*[1 2 3 4];
y = [1 2 3 4];
aspectRatio = 100;  % Choose an aspect ratio of 100
data = randn(4, 1);
nrot = 36;

for i = 1:4

  r1 = randn; r2 = randn; r3 = randn; r4 = randn;

  for irot = 1:nrot

    rot_ang = (irot-1)*360/(nrot-1);
    v = [cosd(rot_ang), sind(rot_ang)];

    if i == 1
      r1 = 0; r4 = 0; r3 = r2;
    end

    plot_vec = [r1 r2; r3 r4]*v';
    ex(irot) = plot_vec(1);
    ey(irot) = plot_vec(2);

  end

  xp = x(i)+ex;
  yp = y(i)+ey./aspectRatio;  % Scale ellipse y data by aspect ratio

  fill(xp, yp, data(i));
  hold on;
  daspect(gca, [aspectRatio 1 1]);  % Set aspect ratio of axes

end

И вот результатсюжет:

enter image description here

Эллипсы маленькие, но если вы увеличите изображение, вы увидите, что они имеют правильное соотношение сторон (т.е. первое выглядит каккруг).

...