web-dev-qa-db-fra.com

Comment faire pivoter un graphe matplotlib de 90 degrés?

J'ai créé une figure dans matplotlib qui contient trois sous-parcelles, une dans le quadrant supérieur gauche, une dans le quadrant supérieur droit et une dans le quadrant inférieur droit. La figure en haut à droite contient une image de deux jours et les deux autres graphiques représentent la projection sur les axes Y et X respectivement. J'aimerais faire pivoter la sous-parcelle du quadrant supérieur gauche de 90 degrés dans le sens inverse des aiguilles d'une montre, de sorte que l'axe des abscisses de cette parcelle se situe le long de l'axe des ordonnées du graphe 2D.

Pour la sous-parcelle, je réalise que je pourrais retourner les données x et y, faire pivoter les étiquettes des axes, créer un titre de parcelle sur le côté gauche, etc. Mais j'espérais trouver un seul appel permettant de faire pivoter l'intégralité du tracé terminé. à travers 90deg. Mais je n'en trouve pas.

Y a-t-il un moyen simple de faire cela?

12
user3443148

De nombreux graphiques 1D pyplot semblent avoir des options "d'orientation" ou "pivot" dans leurs propres arguments. Par exemple, à partir de matplotlib.org exemple d’histogramme:

matplotlib.pyplot.hist(x, 
                       bins=10, 
                       range=None, 
                       normed=False, 
                       weights=None, 
                       cumulative=False, 
                       bottom=None, 
                       histtype=u'bar', 
                       align=u'mid', 
                       orientation=u'vertical', 
                       rwidth=None, 
                       log=False, 
                       color=None, 
                       label=None, 
                       stacked=False, 
                       hold=None, 
                       **kwargs)

Changez juste en horizontal (orientation=u'vertical')

9
nicsqr

Un autre paramètre intéressant pour de nombreuses fonctions est transform (contrairement à orientation ou pivot, ce paramètre peut également être utilisé dans, par exemple, plot ).

Le paramètre transform vous permet d'ajouter une transformation, spécifiée par un Transform object. Par exemple, voici comment vous pouvez faire pivoter le graphique de certaines données aléatoires:

import numpy
from matplotlib import pyplot, transforms

data = numpy.random.randn(100)

# first of all, the base transformation of the data points is needed
base = pyplot.gca().transData
rot = transforms.Affine2D().rotate_deg(90)

# define transformed line
line = pyplot.plot(data, 'r--', transform= rot + base)
# or alternatively, use:
# line.set_transform(rot + base)

pyplot.show()

Pour un exemple de rotation d'un patch, voir cette réponse , qui a également été la source d'inspiration de cette réponse.


mettre à jour

J'ai récemment découvert que le paramètre transform ne fonctionnait pas comme prévu lorsque vous utilisiez pyplot.scatter (et d'autres PathCollections). Dans ce cas, vous pouvez utiliser le offset_transform. Voir cette réponse pour plus d’informations sur la manière de configurer le offset_transform.

5
Mr Tsjolder

Le moyen le plus simple que je puisse imaginer serait d’utiliser la méthode scipy rotation sur la figure. Cependant, cela nécessite la bibliothèque d'imagerie Python, qui n'est pas disponible pour Python 3.x.

import scipy
from scipy import ndimage
import matplotlib.pyplot as plt

Your_Plot = plt.plot(X,Y)
Rotated_Plot = ndimage.rotate(Your_Plot, 90)

plt.figure(figsize=(12.5, 2.5))

plt.subplot(2,2,1)
plt.imshow(Rotated_Plot, cmap=plt.cm.gray)
plt.axis('off')

plt.show()

Ce n’est pas une très bonne façon de le faire, cependant, je pense qu’une fonction wrapper ou simplement l’échange manuel des données X et Y, la rotation des libellés des axes, etc.

3
MackM
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

fig=plt.figure() 
ax=fig.add_subplot(111,projection='3d')

# for rotate the axes and update.
for angle in range(0,360): 
    ax.view_init(30,angle)

plt.show()
0
sameer_nubia