2016-07-21 6 views
1

Ich zeichne einen Pfeil in matplotlib mit annotate. Ich möchte den Pfeil dicker machen. Der Effekt, nach dem ich suche, ist ein zweiköpfiger Pfeil mit einer dünnen Kantenlinie, wo ich die Pfeilbreite steuern kann, d. H. Nicht ändern linewidth. Ich habe versucht, kwargs wie width nach this Antwort, aber dies verursachte einen Fehler, habe ich auch verschiedene Varianten von arrowstyle und connectorstyle wieder ohne Glück versucht. Ich bin sicher, es ist einfach!Ändern Sie die Breite eines Anmerkungspfeils in Matplotlib

Mein Code so weit ist:

import matplotlib.pyplot as plt 

plt.figure(figsize=(5, 5)) 
plt.annotate('', xy=(.2, .2), xycoords='data', 
      xytext=(.8, .8), textcoords='data', 
      arrowprops=dict(arrowstyle='<|-|>', 
          facecolor='w', 
          edgecolor='k', lw=1)) 
plt.show() 

Ich bin mit Python 2.7 und Matplotlib 1.5.1

+0

So möchten Sie die aktuelle Zeile die beiden Pfeile verbinden breiter wird, nicht die tatsächlichen Pfeilspitzen selbst? – DavidG

+0

Ja, Pfeilspitzen (proportional) auch, aber nicht die Kantenlinie (gesetzt mit 'edgecolor', deren Breite mit' lw' definiert ist). Danke vielmals. – kungphil

Antwort

0

Der einfachste Weg, dies durch FancyBboxPatch mit dem Darrow (Doppelpfeil) Option wird zu tun . Der schwierigste Teil dieser Methode ist, dass der Pfeil nicht um seine Spitze rotiert, sondern eher die Kante des Rechtecks, die den Körper des Pfeils definiert. Ich demonstriere das mit einem roten Punkt an der Rotationsstelle.

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

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

#Variables of the arrow 
x0 = 20 
y0 = 20 
width = 20 
height = 2 
rotation = 45 
facecol = 'cyan' 
edgecol = 'black' 
linewidth=5 

# create arrow 
arr = patches.FancyBboxPatch((x0,y0),width,height,boxstyle='darrow', 
          lw=linewidth,ec=edgecol,fc=facecol) 

#Rotate the arrow. Note that it does not rotate about the tip 
t2 = mpl.transforms.Affine2D().rotate_deg_around(x0,y0,rotation) + ax.transData 


plt.plot(x0,y0,'ro') # We rotate around this point 
arr.set_transform(t2) # Rotate the arrow 


ax.add_patch(arr) 

plt.xlim(10, 60) 
plt.ylim(10, 60) 

plt.grid(True) 

plt.show() 

Giving:

enter image description here

Verwandte Themen