2010-11-26 24 views
13

je voulais tourner un rectangle dans matplotlib mais quand je demande la transformation, le rectangle ne montre pas plus:Matplotlib: rotation d'un patch

rect = mpl.patches.Rectangle((0.0120,0),0.1,1000) 
t = mpl.transforms.Affine2D().rotate_deg(45) 
rect.set_transform(t) 

est-ce un bug connu ou est-ce que je fais une erreur?

+0

Pourriez-vous élaborer sur la question, qu'essayez-vous exactement de faire ici? – steabert

+0

Je veux ajouter un 'Rectangle' à mon' ax' (cela fonctionne bien) mais au lieu d'un rectangle rectiligne, je veux qu'il soit incliné de 45 degrés. Le but final est de représenter une "coupe" dans l'axe. – Mermoz

Répondre

7

Apparemment, les patchs sont sur les transformations composites de plusieurs transformations pour faire face à l'échelle et la zone de délimitation. L'ajout de la transformation à la transformation de l'intrigue existante semble donner quelque chose de plus semblable à ce à quoi vous vous attendez. Bien qu'il semble qu'il y ait encore un décalage pour travailler.

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
import matplotlib as mpl 
fig = plt.figure() 
ax = fig.add_subplot(111) 

rect = patches.Rectangle((0.0120,0),0.1,1000) 

t_start = ax.transData 
t = mpl.transforms.Affine2D().rotate_deg(-45) 
t_end = t_start + t 

rect.set_transform(t_end) 

print repr(t_start) 
print repr(t_end) 
ax.add_patch(rect) 

plt.show() 
+0

Je ne vois pas pourquoi vous devez ajouter 'ax.transData'? – Mermoz

+0

Je suis honnêtement dans le noir à ce sujet aussi. J'aurais pensé que t_start = rect.get_transform() aurait été la bonne incantation, mais ça n'a pas marché non plus. – mjhm

+1

Je pense que la réponse est correcte, donc je vais juste ajouter ce commentaire sur pourquoi: le fait que cela n'a pas fonctionné avant est que si vous attachez un patch sans transformation, ceci est par défaut transData, comme vous pouvez le voir à partir du Documentation add_path. Donc, si vous le définissez avant, vous devez l'ajouter à votre transformation. @mjhm: si vous voulez utiliser rect.get_transform() pour t_start, vous devez créer l'option Rectangle avec une transformation =. – steabert

14

Le patch dans le code fourni, il est difficile de dire ce qui se passe, donc je l'ai fait une démonstration claire que je travaillais à partir d'un exemple de matplotlib:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
import matplotlib as mpl 

fig = plt.figure() 
ax = fig.add_subplot(111) 

r1 = patches.Rectangle((0,0), 20, 40, color="blue", alpha=0.50) 
r2 = patches.Rectangle((0,0), 20, 40, color="red", alpha=0.50) 

t2 = mpl.transforms.Affine2D().rotate_deg(-45) + ax.transData 
r2.set_transform(t2) 

ax.add_patch(r1) 
ax.add_patch(r2) 

plt.xlim(-20, 60) 
plt.ylim(-20, 60) 

plt.grid(True) 

plt.show() 

enter image description here