web-dev-qa-db-ja.com

Matlabでは、矢筒プロットの矢印の頭のスタイルを変更するにはどうすればよいですか?

振動プロットのデフォルトの矢印のスタイルを変更したいのですが。どうすれば変更できますか?

14

Matlabバージョン> R2014bの場合

R2014bバージョン以降、Matlabはグラフィカルコンポーネントの構造を変更しました。 Matlabの注釈を使用する最新のコードを次に示します。

enter image description here

によって生成されます

headWidth = 8;
headLength = 8;
LineLength = 0.08;

%some data
[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;

%quiver plots
figure('Position',[10 10 1000 600],'Color','w');
hax_1 = subplot(1,2,1);
hq = quiver(x,y,u,v);           %get the handle of quiver
title('Regular Quiver plot','FontSize',16);

%get the data from regular quiver
U = hq.UData;
V = hq.VData;
X = hq.XData;
Y = hq.YData;

%right version (with annotation)
hax_2 = subplot(1,2,2);
%hold on;
for ii = 1:length(X)
    for ij = 1:length(X)

        headWidth = 5;
        ah = annotation('arrow',...
            'headStyle','cback1','HeadLength',headLength,'HeadWidth',headWidth);
        set(ah,'parent',gca);
        set(ah,'position',[X(ii,ij) Y(ii,ij) LineLength*U(ii,ij) LineLength*V(ii,ij)]);

    end
end
%axis off;
title('Quiver - annotations ','FontSize',16);

linkaxes([hax_1 hax_2],'xy');

このコードは、線の長さのヘッドスタイルとコントロールを変更することに注意してください(左のパネルでは、左のサブプロットの左上部分に矢印が重なっており、右のサブプロットには重なっていないことがわかります) )。矢印の長さと幅は変更されません。

この編集では、角度をコード化した配色を維持せず、動的な頭のサイズを破棄しました。物事が明確になります。


Matlabバージョン<R2014bの場合

矢筒プロットは修正が困難です。 @Luis Mendoが言ったように、matlabインストール内で震え機能を変更できます。ただし、プログラムでニースパッチ/ラインを使用して矢印を描画する複雑さによって制限されます。 annotationを使用する方が簡単な場合があります-headStyleプロパティをcback1に設定する「Quiver-注釈」サブプロットを参照してください。

注釈 は、プロットが完了したら手で簡単に挿入できるグラフィカルオブジェクト(線、テキストボックス、矢印など)です。たとえば、追加のテキストを表示したり、特定の領域をポイントしたりします。また、それらの位置を定義することにより、プログラムで挿入することもできます-それが私たちが取るオプションです。最初に通常のquiverプロット(左パネル)を描画し、青い線のXおよびYデータを取得し、これらの座標を使用して注釈矢印を挿入します。まったく同じ場所に表示されます(同じ位置、同じ角度、同じサイズ、右パネル)。

注釈矢印には、ColorHeadWidthHeadLengthHeadStyleなど、簡単に変更できるいくつかのNiceプロパティがあります。次のプロットでは、x軸に対する角度と、長さに依存するheadWidthに応じて、各矢印の色を変更しました。

次の写真

enter image description here

によって生成されます

%some data
[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;

%quiver plots
figure('Position',[10 10 1000 600],'Color','w');
hax_1 = subplot(1,2,1);

%left version (regular)
hq1 = quiver(x,y,u,v);

%get the line position (first handle)
hkid = get(hq1,'children');
X = get(hkid(1),'XData');
Y = get(hkid(1),'YData');
axis off;
title('Quiver - regular ','FontSize',16);

%right version (with annotation)
hax_2 = subplot(1,2,2);
cmap = jet(116); %colormap, 116 because angles goes up to 115 degrees

for ii = 1:3:length(X)-1

    headWidth = 200 * sqrt((X(ii+1)-X(ii)).^2 + (Y(ii+1)-Y(ii)).^2); % set the headWidth, function of length of arrow
    angled = floor(atan2(Y(ii+1)-Y(ii),X(ii+1)-X(ii))*180/pi) + 1; %get the angle
    ah = annotation('arrow',...
        'Color', cmap(angled,:),...
        'headStyle','cback1','HeadLength',50,'HeadWidth',headWidth);
    set(ah,'parent',gca);
    set(ah,'position',[X(ii) Y(ii) X(ii+1)-X(ii) Y(ii+1)-Y(ii)]);
end
axis off;
title('Quiver - annotations ','FontSize',16);

linkaxes([hax_1 hax_2],'xy');
19
marsei

ファイル refresh.mフォルダーにある...\MATLAB\...\toolbox\matlab\specgraph\@specgraph\@quivergroup\@quivergroupには次の行が含まれます。

%// Arrow head parameters
alpha = .33;  %// Size of arrow head relative to the length of the vector
beta = .25;  %// Width of the base of the arrow head relative to the length

alphaおよびbetaの値を変更すると、目的の効果が得られます。

ただし、これにはMatlabのファイルの変更が伴うため、お勧めしません。その場合は、元のrefresh.mファイル。


quiverのヘルプに表示されるサンプルコードを使用した結果:

[x,y] = meshgrid(-2:.2:2,-1:.15:1);
z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.15);
quiver(x,y,px,py), hold off, axis image
  • 元のパラメーター(alpha = .33;beta = .25;):

    enter image description here

  • alpha = .5;beta = .5;

    enter image description here

7
Luis Mendo

ここから開始できます:

http://www.mathworks.com/help/matlab/ref/quiver.html

そして、ここでquiverの利用可能なプロパティを探すことができます:

http://www.mathworks.com/help/matlab/ref/quivergroupproperties.html

たとえば、プロパティMaxHeadSizeを使用すると、矢印のサイズを変更できます。

EDIT:このリンクの詳細: 矢印のプロパティ

一番下で読む

注釈を選択してから[Mコードを表示]を選択すると、関数またはスクリプトに挿入して注釈を再現できるコードスニペットを取得できます。

4
pablo1977

pablo1977 のこの答えは、私にとって最も有益なものでした。矢筒グループのプロパティを調整することで、つまり次の2行のコードで、より大きな矢印を取得できました。

h = quiver(...);
set(h,'MaxHeadSize',1e2,'AutoScaleFactor',1);
1
user3592998