Vários gráficos sobrepostos com dimensionamento independente em Matplotlib

StackOverflow https://stackoverflow.com/questions/647443

  •  22-07-2019
  •  | 
  •  

Pergunta

Atualmente tenho código que chama matplotlib.pylab.plot várias vezes para apresentar vários conjuntos de dados na mesma tela, e Matplotlib escalas cada um para o min global e max, considerando todas as parcelas. Existe uma maneira de pedir que a escala cada parcela de forma independente, com o min e max de que a trama particular?

Foi útil?

Solução

Não há nenhum suporte direto para isso, mas aqui está um código de um mailing list destacamento que illlustrates dois eixos verticais independentes:

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

Outras dicas

Isto é como você criar uma única parcela (add_subplot (1,1,1)) e limitar a escala nos eixos 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

Eu preciso de algo assim, mas queria criar um exemplo que você pode copiar e colar no shell interativo e dar uma olhada nisso. Aqui é para aqueles de vocês que requer uma solução de trabalho:

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

testado e funciona em python 2.7.6, 1.8.1 numpy, matpotlib 1.3.1. Vou continuar a jogar com ele, procurando uma maneira elegante de trabalho com sobreposição de parcelas de data. Vou postar de volta as minhas conclusões.

Aqui está uma solução usando parcelas de data, e eu acho que é a solução usando mais otimizada twinx () uma mão curta para a adição de um segundo eixo 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 docs, matplotlib.pyplot.twinx (ax = None) Faça uma segunda eixos que ações do eixo x. Os novos eixos irá sobrepor machado (ou os eixos correntes se machado é None). Os carrapatos para ax2 vai ser colocado no lado direito, e o exemplo ax2 é devolvido. Mais aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top