Domanda

Al momento ho un codice che chiama matplotlib.pylab.plot più volte per visualizzare più set di dati sulla stessa schermata e Matplotlib ridimensiona ciascuno al minimo e al massimo globale, considerando tutti i grafici. C'è un modo per chiedergli di ridimensionare ogni trama in modo indipendente, al minimo e al massimo di quella trama particolare?

È stato utile?

Soluzione

Non c'è supporto diretto per questo, ma ecco un po 'di codice da un invio di mailing list che illustra 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([])

Altri suggerimenti

Ecco come creare un singolo diagramma (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

Ho bisogno di qualcosa del genere, ma volevo creare un esempio che è possibile copiare e incollare nella shell interattiva e dare un'occhiata. Eccolo per quelli di voi che richiedono una soluzione funzionante:

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, numpy 1.8.1, matpotlib 1.3.1. Continuerò a giocarci, alla ricerca di un modo accurato per lavorare con i grafici delle date sovrapposte. Riporterò le mie scoperte.

Ecco una soluzione che usa i diagrammi di data, e penso che sia la soluzione più ottimizzata usando twinx () una mano breve 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()

Dai documenti, matplotlib.pyplot.twinx (ax = None) Crea un secondo asse che condivide l'asse x. I nuovi assi sovrapporranno l'ascia (o gli assi correnti se l'asse è Nessuno). I segni di spunta per ax2 verranno posizionati a destra e verrà restituita l'istanza di ax2. Altro qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top