Plusieurs graphiques se chevauchant avec une mise à l'échelle indépendante dans Matplotlib

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

  •  22-07-2019
  •  | 
  •  

Question

J'ai actuellement du code qui appelle matplotlib.pylab.plot à plusieurs reprises pour afficher plusieurs ensembles de données sur le même écran, et Matplotlib met chaque échelle à l'échelle globale, en tenant compte de tous les tracés. Y a-t-il un moyen de lui demander d’échelonner chaque parcelle indépendamment, au minimum et au maximum de cette parcelle particulière?

Était-ce utile?

La solution

Il n'y a pas de support direct pour cela, mais voici quelques codes d'un publication sur une liste de diffusion qui illustre deux axes verticaux indépendants:

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

Autres conseils

C’est ainsi que vous créez un seul tracé (add_subplot (1,1,1)) et limitez l’échelle sur l’axe des 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

J'ai besoin de quelque chose comme ça, mais je voulais créer un exemple que vous pouvez copier et coller dans le shell interactif et y jeter un coup d'œil. Pour ceux qui recherchent une solution de travail:

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

Testé et fonctionne en python 2.7.6, numpy 1.8.1, matpotlib 1.3.1. Je vais continuer à jouer avec elle, à la recherche d'une façon élégante de travailler avec des superpositions de parcelles de dates. Je posterai mes conclusions.

Voici une solution utilisant des tracés de date, et je pense que c’est la solution la plus optimisée utilisant twinx () un raccourci pour l’ajout d’un deuxième axe 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()

À partir de la documentation, matplotlib.pyplot.twinx (ax = None) Faites un deuxième axe qui partage l’axe des x. Les nouveaux axes superposeront ax (ou les axes actuels si ax est Aucun). Les ticks pour ax2 seront placés à droite et l'instance ax2 sera renvoyée. Plus de ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top