2009-03-15 14 views
8

Attualmente ho un codice che chiama più volte matplotlib.pylab.plot per visualizzare più serie di dati sullo stesso schermo, e Matplotlib ridimensiona ciascuno al minimo e al massimo globali, considerando tutti i grafici. C'è un modo per chiedergli di ridimensionare ogni trama in modo indipendente, al minimo e al massimo di quella particolare trama?Più grafici sovrapposti con ridimensionamento indipendente in Matplotlib

risposta

3

Non c'è alcun supporto diretto per questo, ma ecco qualche codice da un mailing list posting che illlustrates due assi verticali indipendenti:

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

L'ambito della domanda originale sembra essere stato per N piuttosto che per i diagrammi in scala 2 - quando provo questo con 3 o più, muore (usando a2, a3 e così via per istanze di assi aggiuntivi). Qualche idea su come ottenere un sacco di set di dati che vengono visualizzati correttamente in scala in una sola volta? – tehwalrus

0

In questo modo si crea un unico appezzamento (add_subplot (1,1,1)) e limitare la scala sugli assi y.

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

Ho bisogno di qualcosa di simile ma volevo creare un esempio che è possibile copiare e incollare nella shell interattiva e dare un'occhiata a questo. Qui è per quelli di voi che richiedono una soluzione di lavoro:

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

testato e funziona in Python 2.7.6, 1.8.1 NumPy, matpotlib 1.3.1. Continuerò a giocarci, cercando un modo pulito per lavorare con la sovrapposizione di grafici di date. Pubblicherò le mie scoperte.

0

Ecco una soluzione che utilizza i grafici della data e penso che sia la soluzione più ottimizzata utilizzando twinx() una mano corta per aggiungere un secondo asse y.

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

Dalla documentazione, matplotlib.pyplot.twinx (ax = None) fare un secondo asse che condivide l'asse x. I nuovi assi si sovrappongono all'asse (o agli assi correnti se ax è None). I tick per ax2 verranno posizionati a destra e l'istanza ax2 verrà restituita. Più here.

Problemi correlati