Ich weiß, dass dieser Thread schon lange tot ist, aber ich denke, meine Lösung könnte hilfreich für jeden sein, der versucht herauszufinden, wie man Pfeile auf Log-Scale-Plots effizient zeichnet.
Alternativ zu dem, was andere bereits geschrieben haben, könnten Sie eine transformation object verwenden, um die Pfeilkoordinaten nicht im Maßstab der Originalachsen, sondern im (linearen) Maßstab der "Achsenkoordinaten" einzugeben. Was ich unter Achsenkoordinaten verstehe, sind diejenigen, die auf [0,1] (horizontaler Bereich) um [0,1] (vertikaler Bereich) normalisiert sind, wobei der Punkt (0,0) die untere linke Ecke und der Punkt wäre (1,1) wäre die obere rechts, und so weiter.Dann schließen Sie könnten einfach einen Pfeil durch:
plt.arrow(0.1, 0.1, 0.9, 0.9, transform=plot1.transAxes, length_includes_head=True)
Dies gibt einen Pfeil, der diagonal über 4/5 des Grundstücks der horizontalen und vertikalen Bereich erstreckt sich von unten links nach oben rechts (wo plot1
das ist Unterplot-Name).
Wenn Sie wollen, dass diese im Allgemeinen zu tun, wo genau (x0,y0)
und (x1,y1)
im Log-Raumkoordinaten für den Pfeil angegeben wird, dann ist dies nicht allzu schwierig, wenn Sie zwei Funktionen fx(x)
und fy(y)
, die von der ursprünglichen Koordinaten-Transformation schreiben zu diesen "Achsen" -Koordinaten. Ich habe ein Beispiel gegeben, wie der ursprüngliche Code, der vom OP gepostet wurde, modifiziert werden könnte, um dies unten zu implementieren (Entschuldigung dafür, dass ich die Bilder, die der Code produziert, nicht mit einbeziehe, habe ich noch nicht die erforderliche Reputation).
#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# functions fx and fy take log-scale coordinates to 'axes' coordinates
ax = 1E-12 # [ax,bx] is range of horizontal axis
bx = 1E0
def fx(x):
return (np.log(x) - np.log(ax))/(np.log(bx) - np.log(ax))
ay = 1E-20 # [ay,by] is range of vertical axis
by = 1E-10
def fy(y):
return (np.log(y) - np.log(ay))/(np.log(by) - np.log(ay))
plot1 = plt.subplot(111)
plt.xscale('log')
plt.yscale('log')
plt.xlim(ax, bx)
plt.ylim(ay, by)
# transformed coordinates for arrow from (1E-10,1E-18) to (1E-4,1E-16)
x0 = fx(1E-10)
y0 = fy(1E-18)
x1 = fx(1E-4) - fx(1E-10)
y1 = fy(1E-16) - fy(1E-18)
plt.arrow(
x0, y0, x1, y1, # input transformed arrow coordinates
transform = plot1.transAxes, # tell matplotlib to use axes coordinates
facecolor = 'black',
length_includes_head=True
)
plt.grid(True)
plt.savefig('test.pdf')
scheint ein Problem mit Matplotlib. Versuchen Sie 'plt.arrow '(6e-4, 1e-4, 0.1, 0.2, length_includes_head = True)' und verschieben Sie die Ansicht um einen höheren Wert von y. Sie werden die Pfeillinie ab etwa 10-4 sehen. Wenn Sie jedoch niedrigere Werte verwenden (dh 1e-5 für x und y), verschwindet die Linie und Sie können nur den kleinen Pfeilkopf an der gleichen Stelle wie zuvor sehen. (Natürlich sollten Sie plt.show() dazu verwenden) – joaquin
Gibt es also einen Workaround? – janoliver
Wenn ich etwas weiß, hätte ich eine Antwort geschrieben ;-). Aber jetzt weißt du wenigstens, dass der Pfeil da ist ... – joaquin