Многоосевой график - PullRequest
       23

Многоосевой график

0 голосов
/ 24 января 2012

Мне нужно построить некоторые данные, и мне нужны две оси x и y. Основные x и y дают мне информацию о смещении, вторичные (x сверху и y справа) дают мне информацию об энергии. У меня есть проблема в том, что, если я увеличу окно графика, вторичные оси не изменят размер должным образом и, но это очень незначительно, заголовок графика будет написан под панелью инструментов, и я могу видеть только нижнюю часть букв. Кто-то знает, как исправить основную проблему на вторичных осях?

Код, который я использовал для дополнительной оси:

 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'))

Ответы [ 2 ]

1 голос
/ 24 января 2012

Я вспомнил про этот пошаговое руководство по настройке нескольких осей в документации Matlab.Я попробовал их пример кода, и все отлично меняет размеры.

Если ваш код отличается от документации Matlab, вам нужно определить оси x и y одновременно, а не в двух разных операторах новой оси.,Поэтому возьмите два оператора 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

Если вы хотите построить некоторые из ваших строк данных относительно одного набора осей, а некоторые - относительново втором, затем для второго набора вы должны будете построить их в стиле, изложенном в конце пошагового руководства:

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

, где свойство 'Parent' сообщает Matlab, какие оси использовать.

0 голосов
/ 24 января 2012

Из документов Matlab похоже, что вы должны установить ActivePositionProperty как OuterPosition вместо Position.Я не могу воспроизвести проблему масштабирования, но настройка, которая, кажется, регулирует положение заголовка.

...