2016-07-07 7 views
4

軸の上または近くにあるデータ点が見づらいことがわかります。明らかな修正はもちろん、axis([xmin xmax ymin ymax])を使用してプロット領域を変更することですが、これはすべての場合には好ましくありません。たとえば、x軸が時間の場合、最小x値を-1に移動するとアクティビティが0になることは意味がありません。MATLABのプロット領域から軸を分離する

代わりに、私は単純にXを動かすために期待していたと私はここに行っているように、yは、離れてプロットエリアから軸: left: Matlab generated, right: desired (image editing software) 左:MATLABは、右の生成:希望を(画像編集ソフト)

されています自動的にこれをMATLABで行う方法がありますか? outerposition軸プロパティを使用して(つまり、それを[0 0 0.9 0.9]に設定し、元の位置に新しい軸を描画する)、それを行う方法があると思っていましたが、その戦略ではどこにも行きませんでした。

+0

別のオプションは 'axis([minx-minx/10 maxx miny maxy])'やその他の要素1/10以外 – shamalaia

答えて

4

ここでの答えは既に説明しています。ここではx軸とy軸を分ける最後のステップを示します。

f = figure ('color', 'white'); 
% create the axes and set some properties 
ax = axes ('parent', f, 'box', 'off', 'nextplot', 'add', 'XMinorTick', 'on', 'YMinorTick', 'on'); 
% plot some data 
plot (ax, 0:10, [0:10].^2, 'rx-') 
% modify the x and y limits to below the data (by a small amount) 
ax.XLim(1) = ax.XLim(1)-(ax.XTick(2)-ax.XTick(1))/4; 
ax.YLim(1) = ax.YLim(1)-(ax.YTick(2)-ax.YTick(1))/4; 
% Set the tick direction 
ax.TickDir = 'out'; 
% draw the plot to generate the undocumented vertex data var 
drawnow() 

%% R2015a 
% X, Y and Z row of the start and end of the individual axle. 
ax.XRuler.Axle.VertexData(1,1) = 0; 
ax.YRuler.Axle.VertexData(2,1) = 0; 


%% R2015b 
% extract the x axis vertext data 
% X, Y and Z row of the start and end of the individual axle. 
vd = get(ax.XAxis.Axle,'VertexData'); 
% reset the zero value 
vd(1,1) = 0; 
% Update the vertex data 
set(ax.XAxis.Axle,'VertexData',vd); 
% repeat for Y (set 2nd row) 
vd = get(ax.YAxis.Axle,'VertexData'); 
vd(2,1) = 0; 
set(ax.YAxis.Axle,'VertexData',vd); 

編集:あなたがズームインまたは例えばパン場合頂点が軸/フィギュアのサイズを変更するたびに、MATLABが再現しているものですか。

これを解決するためにリスナーを追加することで、これに対抗しようとすることができます(ここでは、文書化されていない機能を使用しています)。我々はかなり多くの時間と呼ばれるMarkedCleanイベントを使用することができます。

編集2は0

function resetVertex (ax) 
    % extract the x axis vertext data 
    % X, Y and Z row of the start and end of the individual axle. 
    ax.XAxis.Axle.VertexData(1,1) = 0; 
    % repeat for Y (set 2nd row) 
    ax.YAxis.Axle.VertexData(2,1) = 0; 

    % You can modify the minor Tick values by modifying the vertex data 
    % for them, e.g. remove any minor ticks below 0 
    ax.XAxis.MinorTickChild.VertexData(:,ax.XAxis.MinorTickChild.VertexData(1,:)<0) = []; 
    ax.YAxis.MinorTickChild.VertexData(:,ax.YAxis.MinorTickChild.VertexData(1,:)<0) = []; 
end 

enter image description here

の下に小目盛りをオフにするコードを追加しました(R2015bのみ示す):あなたが機能をresetVertex

addlistener (ax, 'MarkedClean', @(obj,event)resetVertex(ax)); 

のようなものがあります

注:これは文書化されていない機能を使用します - >これはMatlabの特定のバージョンでのみ機能するかもしれません(私はコードを追加しましたr2015a & r2015b)、Matlabはプロットで行うことに応じて頂点データを再作成することができます。

+0

非常に良い! 'matlab.graphics.axis.Axes 'クラスの適切なメソッド、プロパティ、またはフィールド' XAxis 'はありません。 – EBH

+0

@EBH - ' 2015a'に必要なコードが追加されました – matlabgui

+0

私はあなたのコードを実行しました。それは完全に動作します。しかし、私は理解していない問題があります。 Figureウィンドウを最大化すると、Figureウィンドウを元に戻しても、Axesは再び結合され、結合されたままになります。私はMATLAB R2016aを使用しています。私が言っていることのより良い説明のためにこれを見たり、ズームしたりしてください。(あなたの解決策は、最高ですが):-) –

1

0より小さい値から軸を開始して、プロットから0未満のティックを削除することができます。例えばこのコードでは

plot(0:3:30,0:3:30);  %Some random data for plotting 
h = gca; 
axis([-1 30 -1 30]);  %Setting the axis from less than zero 
box off;     %Removing box 
h.TickDir = 'out';  %Setting Direction of ticks to outwards 
h.XTickLabel(1)= {' '}; %Removing the first tick of X-axis 
h.YTickLabel(1)= {' '}; %Removing the first tick of Y-axis 

、あなたはこの結果を得るでしょう:

zeromarkmaynotbeincluded

あなたは上の図で見ることができるので、これは(ゼロダニも削除されますことを、時々、欠点を有していてもよく)。これは、プロットが軸の最初のティックをゼロに設定していたためです。これは、ifの条件を使用して回避することができます。だから、コードは以下のように変更することができます。

plot(0:3:30,0:3:30); 
h = gca; 
axis([-1 30 -1 30]); 
box off; 
h.TickDir = 'out'; 

if str2num(cell2mat(h.XTickLabel(1))) <0 
    h.XTickLabel(1)= {' '}; 
end 

if str2num(cell2mat(h.YTickLabel(1))) <0 
    h.YTickLabel(1)= {' '}; 
end 

上記のコードは次のような結果が得られます: - あなたの軸の目盛りは非常にあるので、また、あなたのケースのために、それを注意し

zeromarkincluded

をless、-1は、軸の開始値にあまり適していない可能性があります。つまり、

2

これを実現する簡単な方法は次のとおりです。

この図を生成する
% some data: 
x = 1:100; 
[email protected](x) 5.*x; 
y=f(x)+rand(1,length(x))*50; 
close all 
% plotting: 
f1 = figure('Color','white'); 
ax = axes; 
plot(ax,x,y,'o'); 
% 'clean' the data area a little bit: 
box off 
ax.TickDir = 'out'; 
% pushing the axis a bit forward: 
lims = axis; 
pos = ax.Position; 
axis([lims(1)-ax.XTick(2)/5 lims(2)+0.1 lims(3)-ax.YTick(2)/5 lims(4)+0.1]) 
% Create lines 
firstXtick = 0.013; %this value need to be adjusted only once per figure 
firstYtick = 0.023; %this value need to be adjusted only once per figure 
lx = annotation(f1,'line',[pos(1) pos(1)+firstXtick],... 
    [pos(2) pos(2)],'Color',[1 1 1],'LineWidth',1); 
ly = annotation(f1,'line',[pos(1) pos(1)],... 
    [pos(2) pos(2)+firstYtick],'Color',[1 1 1],'LineWidth',1); 

:ここで調整する enter image description here

唯一のことは、かつての図の種類ごとに、細かな特定の軸に合わせて調整する必要がfirstXtickfirstYtick値、です。それらを正しい値に設定した後、Figureは問題なくリサイズできます。ズームとパンには少し修正が必要です。

+0

@衣装とSardar_Usama私はあなたのために動作するかどうかを教えてください(matlabguiとは異なる方法で)質問の数字に近い結果を得るために私の答えを編集しました – EBH

+0

これはまた、申し訳ありませんが、私は2つの答えを受け入れることはできません... +1 – achilles

+0

@EBHアノテーションで素敵なハック!私はすでにそれを投票しました! –

関連する問題