web-dev-qa-db-fra.com

Tracer 4 courbes dans un même tracé, avec 3 axes des ordonnées

J'ai 4 ensembles de valeurs: y1, y2, y3, y4 et un ensemble x. Les valeurs y sont de différentes gammes et je dois les représenter sous forme de courbes séparées avec des ensembles de valeurs distincts sur l'axe des y.

Pour le dire simplement, j'ai besoin de 3 axes Y avec différentes valeurs (échelles) pour tracer sur la même figure.

Toute aide appréciée, ou des conseils sur où chercher.

28
Rook

C’est une excellente occasion de vous présenter le File Exchange. Bien que l’organisation ait récemment souffert de choix de conception d’interface malheureusement, elle reste une excellente ressource pour les solutions prédéfinies de problèmes courants. Bien que beaucoup de personnes ici vous aient expliqué en détail comment y parvenir (@prm!), J'avais un besoin similaire il y a quelques années et j'ai constaté que (addaxis } _ fonctionnait très bien. (C'était un choix de la semaine dans l'échange de fichiers à un moment donné!) Il a inspiré plus tard, probablement de meilleurs mods . Voici un exemple de sortie:

_ { exemple addaxis http://www.mathworks.com/matlabcentral/fx_files/9016/1/addaxis_screenshot.jpg } _

Je viens de chercher "plotyy" à échange de fichiers.

Bien que vous compreniez ce qui se passe dans l’important, vous devez parfois accomplir certaines tâches et non les faire vous-même. Matlab Central est idéal pour cela.

22
Marc

Une possibilité que vous pouvez essayer consiste à créer 3 axes empilés les uns sur les autres avec les propriétés 'Color' des deux premiers, définies sur 'none', de sorte que tous les tracés soient visibles. Vous devez ajuster les limites de largeur, de position et d’axe des axes des axes pour que les 3 axes y soient côte à côte et non les uns sur les autres. Vous souhaitez également supprimer les repères et les étiquettes de l'axe des abscisses de 2 des axes, car ils se superposent.

Voici une implémentation générale qui calcule les positions appropriées pour les axes et les décalages pour les limites de l'axe des x afin de maintenir les tracés correctement alignés:

%# Some sample data:
x = 0:20;
N = numel(x);
y1 = Rand(1,N);
y2 = 5.*Rand(1,N)+5;
y3 = 50.*Rand(1,N)-50;

%# Some initial computations:
axesPosition = [110 40 200 200];  %# Axes position, in pixels
yWidth = 30;                      %# y axes spacing, in pixels
xLimit = [min(x) max(x)];         %# Range of x values
xOffset = -yWidth*diff(xLimit)/axesPosition(3);

%# Create the figure and axes:
figure('Units','pixels','Position',[200 200 330 260]);
h1 = axes('Units','pixels','Position',axesPosition,...
          'Color','w','XColor','k','YColor','r',...
          'XLim',xLimit,'YLim',[0 1],'NextPlot','add');
h2 = axes('Units','pixels','Position',axesPosition+yWidth.*[-1 0 1 0],...
          'Color','none','XColor','k','YColor','m',...
          'XLim',xLimit+[xOffset 0],'YLim',[0 10],...
          'XTick',[],'XTickLabel',[],'NextPlot','add');
h3 = axes('Units','pixels','Position',axesPosition+yWidth.*[-2 0 2 0],...
          'Color','none','XColor','k','YColor','b',...
          'XLim',xLimit+[2*xOffset 0],'YLim',[-50 50],...
          'XTick',[],'XTickLabel',[],'NextPlot','add');
xlabel(h1,'time');
ylabel(h3,'values');

%# Plot the data:
plot(h1,x,y1,'r');
plot(h2,x,y2,'m');
plot(h3,x,y3,'b');

et voici le chiffre obtenu:

enter image description here

12
gnovice

Je connais plotyy qui vous permet d'avoir deux axes y, mais pas de "plotyyy"!

Peut-être que vous pouvez normaliser les valeurs y pour qu'elles aient la même échelle (normalisation min/max, normalisation zscore, etc.), vous pourrez alors les tracer facilement en utilisant la séquence normale plot, hold.

Voici un exemple:

%# random data
x=1:20;
y = [randn(20,1)*1 + 0 , randn(20,1)*5 + 10 , randn(20,1)*0.3 + 50];

%# plotyy
plotyy(x,y(:,1), x,y(:,3))

%# orginial
figure
subplot(221), plot(x,y(:,1), x,y(:,2), x,y(:,3))
title('original'), legend({'y1' 'y2' 'y3'})

%# normalize: (y-min)/(max-min) ==> [0,1]
yy = bsxfun(@times, bsxfun(@minus,y,min(y)), 1./range(y));
subplot(222), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title('minmax')

%# standarize: (y - mean) / std ==> N(0,1)
yy = zscore(y);
subplot(223), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title('zscore')

%# softmax normalization with logistic sigmoid ==> [0,1]
yy = 1 ./ ( 1 + exp( -zscore(y) ) );
subplot(224), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title('softmax')

plotyynormalization

6
Amro

Il est rare de trouver des placettes multi-échelles au-delà de deux axes ... Heureusement, dans Matlab, cela est possible, mais vous devez superposer complètement les axes et jouer avec des graduations pour ne pas masquer les informations.

Vous trouverez ci-dessous un bon exemple de travail. J'espère que c'est ce que vous recherchez (bien que les couleurs puissent être beaucoup plus agréables)!

close all
clear all 

display('Generating data');

x = 0:10;
y1 = Rand(1,11);
y2 = 10.*Rand(1,11);
y3 = 100.*Rand(1,11);
y4 = 100.*Rand(1,11);

display('Plotting');

figure;
ax1 = gca;
get(ax1,'Position')
set(ax1,'XColor','k',...
    'YColor','b',...
    'YLim',[0,1],...
    'YTick',[0, 0.2, 0.4, 0.6, 0.8, 1.0]);
line(x, y1, 'Color', 'b', 'LineStyle', '-', 'Marker', '.', 'Parent', ax1)

ax2 = axes('Position',get(ax1,'Position'),...
           'XAxisLocation','bottom',...
           'YAxisLocation','left',...
           'Color','none',...
           'XColor','k',...
           'YColor','r',...
           'YLim',[0,10],...
           'YTick',[1, 3, 5, 7, 9],...
           'XTick',[],'XTickLabel',[]);
line(x, y2, 'Color', 'r', 'LineStyle', '-', 'Marker', '.', 'Parent', ax2)

ax3 = axes('Position',get(ax1,'Position'),...
           'XAxisLocation','bottom',...
           'YAxisLocation','right',...
           'Color','none',...
           'XColor','k',...
           'YColor','g',...
           'YLim',[0,100],...
           'YTick',[0, 20, 40, 60, 80, 100],...
           'XTick',[],'XTickLabel',[]);
line(x, y3, 'Color', 'g', 'LineStyle', '-', 'Marker', '.', 'Parent', ax3)

ax4 = axes('Position',get(ax1,'Position'),...
           'XAxisLocation','bottom',...
           'YAxisLocation','right',...
           'Color','none',...
           'XColor','k',...
           'YColor','c',...
           'YLim',[0,100],...
           'YTick',[10, 30, 50, 70, 90],...
           'XTick',[],'XTickLabel',[]);
line(x, y4, 'Color', 'c', 'LineStyle', '-', 'Marker', '.', 'Parent', ax4)

alt text http://www.pablorodriguez.info/wp-content/Multiaxes.png

4
Pablo Rodriguez

_ PLOTYY autorise deux axes y différents. Ou vous pouvez regarder dans LayerPlot depuis l’échange de fichiers. Je suppose que je devrais vous demander si vous avez envisagé d’utiliser HOLD ou simplement de redimensionner les données et d’utiliser un vieux tracé classique?

OLD, pas ce que recherchait le PO: LA SOUS-PARCELLE vous permet de diviser une fenêtre de figure en plusieurs axes. Ensuite, si vous voulez avoir un seul axe des x ou une autre personnalisation, vous pouvez manipuler chaque axe indépendamment.

2
mtrw

Dans votre cas, il y a 3 axes y supplémentaires (4 au total) et le meilleur code pouvant être utilisé pour obtenir ce que vous voulez et traiter d'autres cas est illustré ci-dessus:

clear
clc

x = linspace(0,1,10);
N = numel(x);
y = Rand(1,N);
y_extra_1 = 5.*Rand(1,N)+5;
y_extra_2 = 50.*Rand(1,N)+20;
Y = [y;y_extra_1;y_extra_2];

xLimit = [min(x) max(x)];
xWidth = xLimit(2)-xLimit(1);
numberOfExtraPlots = 2;
a = 0.05;
N_ = numberOfExtraPlots+1;

for i=1:N_
    L=1-(numberOfExtraPlots*a)-0.2;
    axesPosition = [(0.1+(numberOfExtraPlots*a)) 0.1 L 0.8];
    if(i==1)
        color = [Rand(1),Rand(1),Rand(1)];
        figure('Units','pixels','Position',[200 200 1200 600])
        axes('Units','normalized','Position',axesPosition,...
            'Color','w','XColor','k','YColor',color,...
            'XLim',xLimit,'YLim',[min(Y(i,:)) max(Y(i,:))],...
            'NextPlot','add');
        plot(x,Y(i,:),'Color',color);
        xlabel('Time (s)');

        ylab = strcat('Values of dataset 0',num2str(i));
        ylabel(ylab)

        numberOfExtraPlots = numberOfExtraPlots - 1;
    else
        color = [Rand(1),Rand(1),Rand(1)];
        axes('Units','normalized','Position',axesPosition,...
            'Color','none','XColor','k','YColor',color,...
            'XLim',xLimit,'YLim',[min(Y(i,:)) max(Y(i,:))],...
            'XTick',[],'XTickLabel',[],'NextPlot','add');
        V = (xWidth*a*(i-1))/L;
        b=xLimit+[V 0];
        x_=linspace(b(1),b(2),10);
        plot(x_,Y(i,:),'Color',color);
        ylab = strcat('Values of dataset 0',num2str(i));
        ylabel(ylab)

        numberOfExtraPlots = numberOfExtraPlots - 1;
    end
end

Le code ci-dessus produira quelque chose comme ceci:

0
Fabrício Castro