0

いくつかのデータをプロットする必要があり、2つのx軸とy軸が必要です。メインのxとyは変位情報を提供し、セカンダリ(xは上部、yは右側)はエネルギーに関する情報を提供します。私が抱えている問題は、プロットウィンドウを大きくすると、2次軸のサイズが適切に変更されないことです。ただし、非常に小さい場合、プロットのタイトルはツールバーの下に書き込まれ、文字の下部しか表示されません。誰かが二次軸の主な問題を修正する方法を知っていますか?

二次軸に使用したコードは次のとおりです。

 figure(1)

%%%%voglio fare un plot tenendo fisse le dimensioni delle icone nella legenda
hplot = plot(yH(1,:),xH(1,:),'^', yC(:,1),xC(:,1),'*',yC(:,2),xC(:,2),'*',...
    yC(:,3),xC(:,3),'*',yC(:,4),xC(:,4),'*',yC(:,5),xC(:,5),'*',...
    yC(:,6),xC(:,6),'*','MarkerSize',s); % Markersize: specifys the size of the marker in points (s in questo caso)
hold on 
plot(Ymcporigine,Xmcporigine,'k-','MarkerEdgeColor','k','MarkerSize',1);  %Plot contorno MCP
hold on
plot(Yh, Xh, 'b-', 'MarkerSize', s); %Plot alone circolare
hold off

%Labe assi principali - It is necessary to give the label instructions after plot in order to avoid overlap
xlabel(gca, 'Deflessione magnetica [m]'); % label lower x axis
ylabel(gca,'Deflessione elettrica [m]');  %label left y axis 

%particles outside MCP radius won't be appear in figure
xlim([0, Rmcp])
ylim([0, Rmcp])

%%%% legenda assi principali
l=legend(hplot, 'H^+','C^+','C^{+2}','C^{+3}','C^{+4}','C^{+5}','C^{+6}', 'Location','BestOutside');
a=get(l,'children');
set(a(1:3:end),'MarkerSize',10);


%%%% doppio Asse x
%xlabel(gca, 'Deflessione magnetica [m]'); % label asse x principale

%set secondary x limit as the momentum of a H+ at distance equal to the MCP radius
% Secondo Harres y=(q*B*LB*L)/sqrt(2mEkin) ==> mv=q*B*LB*L/y
mv_max = (q*B*LB*L)/Rmcp;
%mv_max = 1;

%Layout instruction
set(gca,'Box','off');   % Turn off the box surrounding the whole axes
axesUnits=get(gca,'Units');
axesPosition = get(gca,'Position');          %# Get the current axes position
hNewAxes = axes('Position',axesPosition,...  %# Place a new axes on top...
                'Units', axesUnits,...
                'ActivePositionProperty', 'OuterPosition',...
                'Color','none',...           %#   ... with no background color
                'XAxisLocation','top',...    %#   ... located on the top
                'Ytick', [],...              %#   ... with no y tick marks
                'Xlim', [0, mv_max],...      %#   ... should define x axis scale (need to set xmax = mv_max)
                'Box','off');                %#   ... and no surrounding box

            xlabel(hNewAxes,'Momentum (H^+)');  %# Add a label to the top axis
set(gca, 'XTickLabel', num2str(get(gca,'XTick')','%g'))   

%%%%%Plot title - It is necessary to give the title instruction after secondary x axis in order to avoid overlap         
title(['Calcolo approssimato interazione ioni campo magnetico B=', num2str(B), 'Tesla']);

%%%% doppio Asse y            
%ylabel(gca,'Deflessione elettrica [m]'); %label asse y principale

%set secondary y limit as the energy of a H+ at distance equal to the MCP radius
% Secondo Harres x=(q*E*Le*L)/(2mEkin) ==> Ekin=q*E*Le*L/2mx
Le = 0.07; %Estensione del C.E.  : 70 mm
E = 100000; %campo TP.m
Ekin_max = (q*E*Le*L)/(2*m_H*Rmcp);
%mv_max = 1;

set(gca,'Box','off');   % Turn off the box surrounding the whole axes
axesUnits = get(gca,'Units');
axesPosition = get(gca,'Position');          %# Get the current axes position
hNewAxes = axes('Position',axesPosition,...  %# Place a new axes on top...
                'Units', 'normalized',...
                'ActivePositionProperty', 'OuterPosition',...
                'Color','none',...           %#   ... with no background color
                'YAxisLocation','right',...  %#   ... located on the right  
                'Ylim', [0, Ekin_max],...    %#   ... should define y axis scale (need to set ymax=Ekin_max)
                'Xtick', [],...              %#   ... with no y tick marks
                'Box','off');                %#   ... and no surrounding box

            ylabel(hNewAxes,'Energy (H^+)');  %# Add a label to the top axis
set(gca, 'YTickLabel', num2str(get(gca,'YTick')','%g'))
4

2 に答える 2

1

Matlab のドキュメントで複数の軸を設定する方法に関するこのウォークスルーを見たことを思い出しました。サンプルコードを試してみたところ、すべてがうまくサイズ変更されました。

コードが Matlab のドキュメントと異なる点は、2 つの異なる new-axis ステートメントではなく、x 軸と y 軸を同時に定義する必要があることです。したがって、2 つの hNewAxes ステートメントを取り出して、すべてのプロパティを含むステートメントに置き換えます。

hNewAxes = axes('Position',axesPosition,...  %# Place a new axes on top...
            'Units', 'normalized',...
            'ActivePositionProperty', 'OuterPosition',...
            'Color','none',...           %#   ... with no background color
            'YAxisLocation','right',...  %#   ... located on the right  
            'XAxisLocation','top',...
            'Xlim', [0, mv_max],...
            'Ylim', [0, Ekin_max],...    %#   ... should define y axis scale (need to set ymax=Ekin_max)
            'Box','off');                %#   ... and no surrounding box

データ ラインの一部を軸の 1 つのセットに関してプロットし、いくつかを 2 番目のセットに関してプロットする場合、2 番目のセットについては、ウォークスルーの最後にレイアウトされたスタイルでプロットする必要があります。

hl2 = line(x2,y2,'Color','k','Parent',ax2);

'Parent' プロパティは、使用する軸を Matlab に指示します。

于 2012-01-24T18:19:14.270 に答える
0

Matlab docs から、 の代わりにActivePositionPropertyasを設定する必要があるようです。スケーリングの問題は再現できませんが、タイトルの位置を調整しているように見える設定です。OuterPositionPosition

于 2012-01-24T17:59:39.507 に答える