サーチ…


サークル

円を描く最も簡単なオプションは、明らかにrectangle関数です。

%// radius
r = 2;

%// center
c = [3 3];

pos = [c-r 2*r 2*r];
rectangle('Position',pos,'Curvature',[1 1])
axis equal

矩形の曲率は1に設定する必要があります!

positionベクトルは矩形を定義し、最初の2つの値xyは矩形の左下隅です。最後の2つの値は、長方形の幅と高さを定義します。

pos = [ [x y] width height ]

円の左下 - はい、この円にはコーナーがありますが、想像上の円は中心 c = [3 3] - 半径 r = 2[xy] = [1 1]です。 高さは円の直径に等しいので、 width = 2*r; height = width;

ここに画像の説明を入力


上記の解の滑らかさが十分でない場合、 三角関数を使って実際の円を描く明白な方法を使用する方法はありません。

%// number of points
n = 1000;

%// running variable
t = linspace(0,2*pi,n);

x = c(1) + r*sin(t);
y = c(2) + r*cos(t);

%// draw line
line(x,y)

%// or draw polygon if you want to fill it with color
%// fill(x,y,[1,1,1])
axis equal

ここに画像の説明を入力

矢印

第1に、 annotation使用して手作業で正規化された図形単位を処理する必要のない、 quiverを使用することができます

drawArrow = @(x,y) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0 )    

x1 = [10 30];
y1 = [10 30];

drawArrow(x1,y1); hold on

x2 = [25 15];
y2 = [15 25];

drawArrow(x2,y2)

ここに画像の説明を入力

重要なのは、 quiver :0の5番目の引数で、それ以外の場合はデフォルトのスケーリングを無効にします。この関数は通常、ベクトルフィールドのプロットに使用されるためです。 (またはプロパティ値のペア'AutoScale','off'

追加機能を追加することもできます。

drawArrow = @(x,y,varargin) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0, varargin{:} )       
drawArrow(x1,y1); hold on
drawArrow(x2,y2,'linewidth',3,'color','r')

ここに画像の説明を入力

別の矢印が必要な場合は、1が(この回答は役に立ち月で注釈を使用する必要があり、私は震えプロットの矢印ヘッドのスタイルを変更するにはどうすればよいです? )。

矢印の頭のサイズは、 'MaxHeadSize'プロパティで調整できます。残念ながら一貫していません。その後、軸の限界値を設定する必要があります。

x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1,{'MaxHeadSize',0.8,'Color','b','LineWidth',3}); hold on

x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2,{'MaxHeadSize',10,'Color','r','LineWidth',3}); hold on

xlim([1, 100])
ylim([1, 100])

ここに画像の説明を入力

調整可能な矢頭の別の微調整があります:

function [ h ] = drawArrow( x,y,xlimits,ylimits,props )

xlim(xlimits)
ylim(ylimits)

h = annotation('arrow');
set(h,'parent', gca, ...
    'position', [x(1),y(1),x(2)-x(1),y(2)-y(1)], ...
    'HeadLength', 10, 'HeadWidth', 10, 'HeadStyle', 'cback1', ...
    props{:} );

end

次のようにスクリプトから呼び出すことができます。

drawArrow(x1,y1,[1, 100],[1, 100],{'Color','b','LineWidth',3}); hold on
drawArrow(x2,y2,[1, 100],[1, 100],{'Color','r','LineWidth',3}); hold on

ここに画像の説明を入力

楕円

楕円をプロットするには、その方程式を使用します 。楕円は、長軸と短軸を持ちます。また、異なる中心点に楕円をプロットできるようにしたいと考えています。したがって、入力と出力が次のような関数を記述します。

Inputs:
    r1,r2: major and minor axis respectively
    C: center of the ellipse (cx,cy)
Output:
    [x,y]: points on the circumference of the ellipse

次の関数を使用して、楕円上の点を取得し、それらの点をプロットすることができます。

function [x,y] = getEllipse(r1,r2,C)
beta = linspace(0,2*pi,100);
x = r1*cos(beta) - r2*sin(beta);
y = r1*cos(beta) + r2*sin(beta);
x = x + C(1,1);
y = y + C(1,2);
end

例:

[x,y] = getEllipse(1,0.3,[2 3]);
plot(x,y);

ここに画像の説明を入力

ポリゴン

頂点のx位置とy位置を保持するベクトルを作成し、 patchに供給します。

単一多角形

X=rand(1,4); Y=rand(1,4);
h=patch(X,Y,'red');

単一多角形

複数のポリゴン

各ポリゴンの頂点は、 XYそれぞれの1つの列を占めます。

X=rand(4,3); Y=rand(4,3);
for i=2:3
  X(:,i)=X(:,i)+(i-1); % create horizontal offsets for visibility
end

h=patch(X,Y,'red');

3つのポリゴン

疑似4Dプロット

(mxn)行列を用いて表面によってrepresentesことができるサーフィン

サーフェスの色は、 (mxn)マトリックスの値の関数として自動的に設定されます。 カラーマップが指定されていない場合、デフォルトのものが適用されます。

現在のカラーマップを表示し、データ値のカラーマップへのマッピングを示すために、カラーバーを追加することができます。

次の例では、関数z (mxn)が生成されます。

z=x.*y.*sin(x).*cos(y);

区間[-pi,pi]にわたってxy値はmeshgrid関数を使って生成することができ、サーフェスは次のようにレンダリングされます:

% Create a Figure
figure
% Generate the `x` and `y` values in the interval `[-pi,pi]`
[x,y] = meshgrid([-pi:.2:pi],[-pi:.2:pi]);
% Evaluate the function over the selected interval
z=x.*y.*sin(x).*cos(y);
% Use surf to plot the surface
S=surf(x,y,z);
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar

ここに画像の説明を入力

図1

今では、追加の情報がz行列の値にリンクされ、別の(mxn)行列に格納されている場合があります

サーフェスの色を変更することで、これらの追加情報をプロットに追加することができます。

これにより、 (mxn)の4Dプロットが可能になります。第1 (mxn)マトリックスによって生成されたサーフェスの3D表現に対して、第4次元は、第2 (mxn)マトリックスに含まれるデータによって表されます。

surfを4入力で呼び出すことで、このようなプロットを作成することは可能です:

surf(x,y,z,C)

ここで、 Cパラメータは第2の行列( zの同じサイズでなければならない)であり、表面の色を定義するために使用される。

次の例では、 C行列は関数によって生成されます。

C=10*sin(0.5*(x.^2.+y.^2))*33;

区間[-pi,pi]

Cによって生成される表面は、

ここに画像の説明を入力

図2

今度は4つの入力でsurfを呼び出すことができます:

figure
surf(x,y,z,C)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar

ここに画像の説明を入力

図3

図1と図3を比較すると、次のことがわかります。

  • 表面の形状は、 z値(第1 (mxn)行列)に対応し、
  • サーフェスの色(およびその範囲はカラーバーによって与えられます)はC値(最初の(mxn)行列)に対応し、

ここに画像の説明を入力

図4

もちろん、プロット内のzCを入れ替えて、 C行列とz行列で与えられる色の与えられた表面の形状にすることができます:

figure
surf(x,y,C,z)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar

図2と図4を比較する

ここに画像の説明を入力

高速描画

plot(x,y)set(h , 'XData' , y, 'YData' , y)animatedline 3つの主な方法があります。アニメーションを円滑にするには、効率的な描画が必要で、3つの方法が同等ではありません。

% Plot a sin with increasing phase shift in 500 steps
x = linspace(0 , 2*pi , 100);

figure
tic
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    plot(x,y)
    drawnow
end
toc

私は5.278172 secondsを得る。プロット関数は、基本的に毎回ラインオブジェクトを削除して再作成します。プロットを更新するより効率的な方法は、 LineオブジェクトのXDataプロパティとYDataプロパティを使用することです。

tic
h = [];   % Handle of line object
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    
    if isempty(h)
        % If Line still does not exist, create it
        h = plot(x,y);
    else
        % If Line exists, update it
        set(h , 'YData' , y)
    end
    drawnow
end
toc

今私は2.741996 seconds 、ずっと良いです!

animatedlineは2014bに導入された比較的新しい機能です。それがどのように運賃を見てみましょう:

tic
h = animatedline;
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    clearpoints(h)
    addpoints(h , x , y)
    drawnow
end
toc

3.360569 seconds 、既存のプロットを更新するほど良くはないが、まだplot(x,y)より優れている。

もちろん、この例のように1行をプロットする必要がある場合、3つのメソッドはほぼ同等で、滑らかなアニメーションが得られます。しかし、より複雑なプロットがある場合は、既存のLineオブジェクトを更新することで違いが生じます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow