Pregunta

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

¿Fue útil?

Solución

No hay soporte directo para esto, pero aquí hay un código de un 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([])

Otros consejos

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. Continuaré jugando con él, buscando una forma ordenada de trabajar con superposiciones de diagramas de fechas. Volveré a publicar mis hallazgos.

Aquí hay una solución que usa diagramas de fechas, y creo que es la solución más optimizada usando 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 = None) Haz un segundo eje que comparta el eje x. Los nuevos ejes se superpondrán al eje (o los ejes actuales si ax es None). Los ticks para ax2 se colocarán a la derecha y se devolverá la instancia de ax2. Más aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top