it-swarm.com.de

Zeichnen von 4 Kurven in einer einzigen Grafik mit 3 Y-Achsen

Ich habe 4 Wertesätze: y1, y2, y3, y4 und einen Satz x. Die y-Werte liegen in unterschiedlichen Bereichen, und ich muss sie als separate Kurven mit separaten Wertesätzen auf der y-Achse darstellen.

Um es einfach auszudrücken: Ich brauche 3 Y-Achsen mit unterschiedlichen Werten (Skalen), um dieselbe Figur zu zeichnen.

Jede Hilfe geschätzt oder Tipps, wo sie suchen müssen.

28
Rook

Dies ist eine großartige Gelegenheit, Ihnen den File Exchange vorzustellen. Auch wenn die Organisation in letzter Zeit unter sehr unglücklichen Schnittstellenentscheidungen gelitten hat, ist sie immer noch eine großartige Ressource für vorgefertigte Lösungen für allgemeine Probleme. Obwohl viele hier Ihnen genau gesagt haben, wie Sie dies erreichen können (@prm!), Hatte ich vor einigen Jahren ein ähnliches Bedürfnis und stellte fest, dass addaxis sehr gut funktioniert hat. (Es war ein File Exchange-Pick der Woche an einer Stelle!) Es hat später bessere, wahrscheinlich bessere Mods inspiriert. Hier ist eine Beispielausgabe:

addaxis Beispiel http://www.mathworks.com/matlabcentral/fx_files/9016/1/addaxis_screenshot.jpg

Ich habe gerade nach "plotyy" bei File Exchange gesucht.

Auch wenn Sie wissen, was in einem wichtigen Bereich passiert, müssen Sie manchmal nur die Dinge erledigen, nicht selbst. Dafür ist Matlab Central gut geeignet.

22
Marc

Eine Möglichkeit, die Sie versuchen können, besteht darin, 3 Achsen zu erstellen, die übereinander gestapelt sind, wobei die 'Color'-Eigenschaften der oberen beiden auf 'none' festgelegt sind, sodass alle Diagramme sichtbar sind. Sie müssten die Achsenbreite, Position und x-Achsengrenzen so anpassen, dass die 3 y-Achsen nebeneinander und nicht übereinander liegen. Sie möchten auch die x-Achsen-Markierungen und Beschriftungen von zwei Achsen entfernen, da diese übereinander liegen.

Hier ist eine allgemeine Implementierung, die die korrekten Positionen für die Achsen und Offsets für die x-Achsengrenzen berechnet, um die Diagramme richtig in einer Reihe zu halten:

%# 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');

und hier ist die resultierende Figur:

enter image description here

12
gnovice

Ich kenne plotyy das erlaubt Ihnen zwei Y-Achsen, aber kein "plotyyy"!

Vielleicht können Sie die y-Werte normalisieren, um dieselbe Skalierung zu erhalten (Min/Max-Normalisierung, Zscore-Standardisierung usw.). Dann können Sie sie einfach mit der normalen plot, hold-Sequenz plotten.

Hier ist ein Beispiel:

%# 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

Mehrskala-Diagramme sind selten außerhalb zweier Achsen zu finden. Glücklicherweise ist es in Matlab möglich, aber Sie müssen die Achsen vollständig überlappen und mit Markierungen spielen, um Informationen nicht zu verbergen.

Unten ist ein Nizza Arbeitsprobe. Ich hoffe, das ist, wonach Sie suchen (obwohl Farben viel schöner sein könnten)!

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)

alter Text http://www.pablorodriguez.info/wp-content/Multiaxes.png

4
Pablo Rodriguez

PLOTYY erlaubt zwei verschiedene y-Achsen. Oder schauen Sie in LayerPlot vom File Exchange nach. Ich denke, ich sollte fragen, ob Sie die Verwendung von HOLD oder nur die Daten neu skalieren und eine normale alte Darstellung verwenden.

OLD, nicht das, wonach das OP gesucht hat: SUBPLOT ermöglicht das Zerlegen eines Figurenfensters in mehrere Achsen. Wenn Sie nur eine X-Achse anzeigen lassen oder andere Anpassungen vornehmen möchten, können Sie jede Achse unabhängig voneinander bearbeiten.

2
mtrw

In Ihrem Fall gibt es 3 zusätzliche y-Achsen (insgesamt 4) und der beste Code, der verwendet werden kann, um das zu erreichen, was Sie wollen und mit anderen Fällen zu tun haben, ist oben dargestellt:

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

Der obige Code wird so etwas produzieren:

0