Múltiples plots superpuestas con escalado independiente en Matplotlib

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 ajusta cada escala al mínimo y máximo globales, considerando todos los gráficos. ¿Hay alguna manera de pedirle que escale cada plot de forma independiente, al mínimo y máximo de esa plot en particular?

No hay soporte directo para esto, pero aquí hay algo de código de una publicación de la lista de correo que ilustra 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([]) 

Así es como se crea una sola gráfica (add_subplot (1,1,1)) y se limita 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 

Necesito algo como esto pero quería crear un ejemplo que pueda copiar y pegar en el shell interactivo y echarle un vistazo. Aquí está para aquellos de ustedes que requieren 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, numpy 1.8.1, matpotlib 1.3.1. Voy a seguir jugando con él, buscando una forma ordenada de trabajar con gráficos de fecha superpuestos. Voy a publicar de nuevo mis resultados.

Aquí hay una solución que usa diagtwigs 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 los documentos, matplotlib.pyplot.twinx (ax = Ninguno) Haz un segundo eje que comparte el eje x. Los nuevos ejes se superpondrán al eje (o los ejes actuales si el eje es Ninguno). Las marcas para ax2 se colocarán a la derecha y se devolverá la instancia de ax2. Más aquí .