Plotagem com dois eixos independentes no Matlab

Este artigo será útil para quem cria gráficos no ambiente Matlab.

Ao preparar gráficos para a publicação de artigos em revistas científicas e vários tipos de relatórios, muitas vezes me deparei com a necessidade de construir várias curvas, cada uma relacionada ao seu eixo - para não sobrecarregar o artigo com gráficos e não ultrapassar seu limite. Porém, para isso, no Matlab anterior à versão R2014a, havia apenas a equipe complicada (X1, Y1, X2, Y2) , que possui vários recursos desagradáveis, pelo que era necessário usar outros programas e fazer tudo manualmente, o que, em primeiro lugar, complica esse processo. do ponto de vista de um único estilo, em segundo lugar, requer muito tempo e, em terceiro lugar, não permite alterações rápidas.

Características e descrição desagradáveis
A tais características desagradáveis ​​eu atribuiria:

1. Falta de análogo de espera ( espera "nativa" não funciona corretamente com parcy). Para adicionar mais de 2 curvas, você precisa usar esta construção:

[hAx,hLine1,hLine2] = plotyy([x1',x2'],[y1' y2'],[x3',x4'],[y3',y4']); % 4  

Uma característica desagradável n ° 2 segue deste projeto:

2. As dimensões das matrizes entre colchetes devem corresponder, porque matrizes de elementos são formadas a partir deles. Na prática, isso acontece muito raramente.

3. O design sofre seriamente pelo fato de você não poder alterar programaticamente as cores e os tipos de todas as linhas em uma linha; é possível formatar apenas um conjunto de linhas relacionadas a um eixo específico (hLine1 e hLine2) - em qualquer caso, eu não poderia. Ao mesmo tempo, não estou falando sobre alterar parâmetros manualmente, ou seja, edição na janela “figura” - somente diretamente com o código no arquivo .m.

Resumindo o acima: plotyy () não é muito adequado para exibir vários conjuntos de gráficos para diferentes eixos. A menos que dependências simples como estas:

 x = linspace(0,10); y1 = 200*exp(-0.05*x).*sin(x); y2 = 0.8*exp(-0.5*x).*cos(10*x); y3 = 0.2*exp(-0.5*x).*cos(10*x); y4 = 150*exp(-0.05*x).*sin(x); X=[x',x']; Y1=[y1' y4']; Y2=[y2',y3']; [hAx,hLine1,hLine2] = plotyy(X,Y1,X,Y2); 



Ou a equipe de yyaxes , que apareceu na versão Matlab R2014a. Aqui temos agora para onde dar a volta.

Eu gostaria de falar sobre as delícias dessa equipe usando meu próprio exemplo. A tarefa é que eu precise construir em um gráfico 3 perfis de temperatura (soluções obtidas pelo método numérico direto, método de momento e valores experimentais) relacionados ao eixo direito e 3 perfis de pressão relacionados ao eixo esquerdo. E também adicione setas e legendas.

Os comandos yyaxis left e yyaxis right permitem lidar com esta tarefa de cada vez. O que, de fato, é a essência. Dentro de uma figura, podemos construir qualquer número de gráficos vinculando-os a um dos eixos. Dentro da estrutura de cada equipe, tudo funciona da mesma forma que nos agendamentos regulares.

A estrutura da imagem neste caso terá a seguinte aparência:

 figure() {     - , } yyaxis left { ,     - , , ,       } yyaxis right { ,     - , , ,       } 

Preenchendo essa estrutura com o necessário, obtemos como resultado:



Código do programa
 %     h = figure('Units', 'normalized', 'OuterPosition', [0 0 1 1]); %  : F='Times New Roman'; FN='FontName'; FS='FontSize'; l=30;%   set(gca, FN, F, FS, l) box on %  hold on %%   yyaxis right hPlot_1 = plot(time*10^6, T); %    hPlot_2 =plot(time_exp_T*10^6, T_exp); %   hPlot_3 =plot(time_pk, T_pk); %   set( hPlot_1, 'LineWidth', 3, 'LineStyle', ':', 'Color', 'k' ); set( hPlot_2, 'LineWidth', 1, 'LineStyle', 'none', 'Color', 'k', 'Marker', 'o' ); set( hPlot_3, 'LineWidth', 3, 'LineStyle', '--', 'Color', 'k' ); %    () ylim([180 270]); %     () yticks([190 200 210 220 230 240 250 260 267]) yticklabels({'190', '200', '210', '220', '230', '240','250' '260', '\it T, K'}) %   set(gca,'xcolor','k'); set(gca,'ycolor','k'); %%   yyaxis left hPlot_10 = plot(time_P*10^6, P_p0); %    hPlot_11 = plot(time_exp_P_p0*10^6, P_p0_exp); %   hPlot_13 = plot(time_pk, Pp0_pk); %   set( hPlot_10, 'LineWidth', 3, 'LineStyle', ':', 'Color', 'k' ); set( hPlot_11, 'LineWidth', 1, 'LineStyle', 'none', 'Color', 'k', 'Marker', 'x' ); set( hPlot_13, 'LineWidth', 3, 'LineStyle', '--', 'Color', 'k' ); %    () ylim([0.1 0.8]); %     () yticks([0.2 0.3 0.4 0.5 0.6 0.7 0.77]) yticklabels({'0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '\it p/p_0 '}) %   set(gca,'xcolor','k'); set(gca,'ycolor','k'); %%   %      xticks([0 20 40 60 80 100 120 140 160 185]) xticklabels({'0' '20' '40' '60' '80' '100' '120' '140' '160', '\it X/U, c'}) %  text(20,0.3,'\leftarrow', FS, 60, FN, F); text(140,0.6,'\rightarrow', FS, 60, FN, F); text(160,0.24,'1', FS, l, FN, F); text(60, 0.25,'2', FS, l, FN, F); text(120, 0.2,'3', FS, l, FN, F); text(140,0.51,'4', FS, l, FN, F); text(80, 0.52,'5', FS, l, FN, F); text(120,0.48,'6', FS, l, FN, F); text(5,0.75,'\it D_2O - N_2', FS, l, FN, F); hold off 



Outro recurso adicional na preparação de gráficos para impressão é a sua economia simples e conveniente em qualquer formato suportado pelo Matlab. Para fazer isso, você só precisa adicionar as seguintes linhas:

 %%   file_name = strcat('T, p_p0 - mm, ch, exp'); %   saveas(h, file_name, 'bmp'); %  .bmp saveas(h, file_name, 'fig'); %  .fig saveas(h, file_name, 'eps'); %  .eps saveas(h, file_name, 'jpeg'); %  .jpeg close(h); %     


Sumário

A partir da versão R2014a, o Matlab tornou-se um programa adequado para preparar horários para a publicação de artigos em várias revistas científicas. Uma vantagem importante é a flexibilidade muito boa dessa ferramenta, que permite processar os resultados e apresentá-los de forma digerível e bonita, inclusive para os chamados. Processamento em "lote".

Vale a pena dar uma olhada:

→ Um artigo útil sobre gráficos no Matlab
Descrição da yaxis

Descrição do ploty
Exportar gráficos

Source: https://habr.com/ru/post/pt403763/


All Articles