2010-11-26 20 views
13

quería girar un rectángulo en matplotlib pero cuando aplico la transformación, el rectángulo no aparece más:Matplotlib: hacer girar un parche

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

este es un error conocido o hago un error?

+0

¿Podría explicar la pregunta, qué es exactamente lo que está tratando de hacer aquí? – steabert

+0

Quiero agregar un 'Rectangle' a mi' ax' (esto funciona bien) pero en lugar de un rectángulo recto, quiero que esté inclinado de 45 grados. El objetivo final es representar un "corte" en el eje. – Mermoz

Respuesta

7

Aparentemente, las transformaciones en los parches son compuestos de varias transformaciones para tratar el escalado y el cuadro delimitador. Agregar la transformación a la transformación de la trama existente parece dar algo más de lo que cabría esperar. Aunque parece que todavía hay una compensación para hacer ejercicio.

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

No veo por qué necesita agregar el 'ax.transData'? – Mermoz

+0

Honestamente, también estoy en la oscuridad sobre eso. Hubiera pensado que t_start = rect.get_transform() hubiera sido el hechizo correcto, pero tampoco funcionó. – mjhm

+1

Creo que la respuesta es correcta, así que simplemente agregaré este comentario sobre por qué: el hecho de que no funcionó antes es que si se adjunta un parche sin transformación, esto está predeterminado en transData, como se puede ver en el add_path documentación. Entonces, si lo configura antes, necesita agregar esto a su transformación. @mjhm: si quiere usar rect.get_transform() para t_start, entonces tiene que crear el rectángulo con la opción transform =. – steabert

14

El parche en el código proporcionado hace que sea difícil saber lo que está pasando, así que he hecho una clara demostración de que trabajé a partir de un ejemplo 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