2009-03-15 16 views
8

Actualmente tengo un código que llama a matplotlib.pylab.plot varias veces para mostrar múltiples conjuntos de datos en la misma pantalla, y Matplotlib escala cada uno al mínimo y máximo globales, considerando todos los diagramas. ¿Hay alguna manera de pedirle que escale cada trama de forma independiente, al mínimo y máximo de esa trama en particular?Múltiples diagramas superpuestos con escalado independiente en Matplotlib

Respuesta

3

No hay soporte directo para esto, pero aquí hay un código de un mailing list posting que illlustrates dos ejes verticales independientes:

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

El alcance de la pregunta original parece haber sido para N en lugar de 2 gráficos a escala: cuando intento esto con 3 o más, muere (usando a2, a3, etc. para instancias de ejes adicionales). Alguna idea de cómo obtener ¿un conjunto completo de datasets renderizados correctamente a escala al mismo tiempo? – tehwalrus

0

Ésta es la forma de crear una sola parcela (add_subplot (1,1,1)) y limite la escala en los ejes 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

Necesito algo como esto, pero quería crear un ejemplo que pueda copiar y pegar en el caparazón interactivo y echarle un vistazo. Aquí es para aquellos de ustedes que requiere una solución de trabajo:

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

probado y funciona en Python 2.7.6, 1.8.1 numpy, matpotlib 1.3.1. Voy a seguir jugando con eso, buscando una manera ordenada de trabajar con diagramas de fechas superpuestas. Publicaré mis hallazgos.

0

Aquí hay una solución que usa diagramas de fecha, y creo que es la solución más optimizada que usa twinx() una mano corta para agregar un segundo eje 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() 

De la documentación, matplotlib.pyplot.twinx (ax = None) hacer un segundo ejes que comparte el eje x. Los nuevos ejes se superpondrán al eje (o los ejes actuales si el eje es Ninguno). Los ticks para ax2 se colocarán a la derecha y se devolverá la instancia de ax2. Más here.

Cuestiones relacionadas