2009-03-15 8 views
8

Ich habe derzeit Code, matplotlib.pylab.plot mehrere Male aufgerufen, um mehrere Datensätze auf dem gleichen Bildschirm anzuzeigen, und Matplotlib skaliert jeweils auf die globale Min und Max unter Berücksichtigung aller Plots. Gibt es eine Möglichkeit, sie zu bitten, jede Parzelle unabhängig zu skalieren, bis zum Minimum und Maximum dieser Parzelle?Mehrere überlappende Diagramme mit unabhängiger Skalierung in Matplotlib

Antwort

3

Es gibt keine direkte Unterstützung für diese, aber hier ist ein Code aus einem mailing list posting, die zwei unabhängigen vertikalen Achsen illlustrates:

x=arange(10) 
y1=sin(x) 
y2=10*cos(x) 

rect=[0.1,0.1,0.8,0.8] 
a1=axes(rect) 
a1.yaxis.tick_left() 
plot(x,y1) 
ylabel('axis 1') 
xlabel('x') 

a2=axes(rect,frameon=False) 
a2.yaxis.tick_right() 
plot(x,y2) 
a2.yaxis.set_label_position('right') 
ylabel('axis 2') 
a2.set_xticks([]) 
+0

Der Bereich der ursprünglichen Frage scheint für N statt 2 skalierten Plots gewesen zu sein - wenn ich dies mit 3 oder mehr versuche, stirbt es (mit a2, a3 usw. für zusätzliche Achsen Instanzen.) Irgendeine Idee, wie zu bekommen eine ganze Reihe von Datensätzen, die richtig skaliert werden? – tehwalrus

0

Dies ist, wie Sie ein einzelnes Grundstück erstellen (add_subplot (1,1,1)) und begrenzen Sie die Skala auf den y-Achsen.

myFig = figure() 
myPlot = self.figure.add_subplot(1,1,1) 
myPlot.plot([1,2,3,4,5], [5,4,3,2,1], '+r') 
myPlot.set_ylim(1,5) # Limit y-axes min 1, max 5 
0

Ich brauche so etwas, aber ich wollte ein Beispiel erstellen, dass Sie in die interaktive Shell kopieren und einfügen können und einen Blick darauf werfen. Hier ist es für diejenigen von Ihnen, eine funktionierende Lösung erfordern:

from numpy import arange 
from math import sin, cos 
import matplotlib.pyplot as plt 

x = arange(10) 
y1 = [sin(i) for i in x] 
y2 = [10*cos(i) for i in x] 

rect = [0.1, 0.1, 0.8, 0.8] 
a1 = plt.axes(rect) # Create subplot, rect = [left, bottom, width, height] in normalized (0, 1) units 
a1.yaxis.tick_left() # Use ticks only on left side of plot 
plt.plot(x, y1) 
plt.ylabel('axis 1') 
plt.xlabel('x') 

a2 = plt.axes(rect, frameon=False) # frameon, if False, suppress drawing the figure frame 
a2.yaxis.tick_right() 
plt.plot(x, y2) 
a2.yaxis.set_label_position('right') 
plt.ylabel('axis 2') 
a2.set_xticks([]) 

plt.show() 

geprüft und Arbeiten in Python 2.7.6, 1.8.1 numpy, matpotlib 1.3.1. Ich werde weiter damit spielen und nach einer übersichtlichen Art suchen, mit überlagernden Datumsdiagrammen zu arbeiten. Ich werde meine Ergebnisse veröffentlichen.

0

Hier ist eine Lösung mit Datumsdiagrammen, und ich denke, es ist die am besten optimierte Lösung mit Twinx() eine kurze Hand zum Hinzufügen einer zweiten Y-Achse.

import matplotlib.pyplot as plt 
import matplotlib.dates as md 
import datetime 
import numpy 
numpy.random.seed(0) 
t = md.drange(datetime.datetime(2012, 11, 1), 
      datetime.datetime(2014, 4, 01), 
      datetime.timedelta(hours=1)) # takes start, end, delta 
x1 = numpy.cumsum(numpy.random.random(len(t)) - 0.5) * 40000 
x2 = numpy.cumsum(numpy.random.random(len(t)) - 0.5) * 0.002 
fig = plt.figure() 
ax1 = fig.add_subplot(111) 
fig.suptitle('a title', fontsize=14) 
fig.autofmt_xdate() 
plt.ylabel('axis 1') 
plt.xlabel('dates') 
ax2 = ax1.twinx() 
ax1.plot_date(t, x1, 'b-', alpha=.65) 
ax2.plot_date(t, x2, 'r-', alpha=.65) 
plt.ylabel('axis 2') 
plt.show() 

Aus den Dokumenten, matplotlib.pyplot.twinx (ax = None) eine zweite Achse machen, dass die x-Achse teilt. Die neuen Achsen überlagern ax (oder die aktuellen Achsen, wenn ax None ist). Die Ticks für ax2 werden rechts platziert und die ax2-Instanz wird zurückgegeben. Mehr here.