Sé que este hilo ha estado muerto desde hace mucho tiempo, pero me imagino que publicar mi solución podría ser útil para cualquier otra persona que intente descubrir cómo dibujar flechas en trazados logarítmicos de manera eficiente.
Como una alternativa a lo que otros ya han publicado, puede usar transformation object para ingresar las coordenadas de flecha no en la escala de los ejes originales, sino en la escala (lineal) de las "coordenadas de los ejes". Lo que quiero decir con las coordenadas de los ejes son aquellas que están normalizadas a [0,1] (rango horizontal) por [0,1] (rango vertical), donde el punto (0,0) sería la esquina inferior izquierda y el punto (1,1) sería la parte superior derecha, y así sucesivamente.Posteriormente, se podría incluir simplemente una flecha por:
plt.arrow(0.1, 0.1, 0.9, 0.9, transform=plot1.transAxes, length_includes_head=True)
Esto da una flecha que se extiende diagonalmente sobre 4/5 de la distancia horizontal y vertical de la trama, desde la parte inferior izquierda a la superior derecha (donde es el plot1
nombre de la subtrama).
Si quieres hacer esto, en general, en las coordenadas exactas (x0,y0)
y (x1,y1)
en el diario de espacio puede ser especificado por la flecha, esto no es demasiado difícil si se escribe dos funciones fx(x)
y fy(y)
que transforman a partir de las coordenadas originales a estas coordenadas de "ejes". He dado un ejemplo de cómo el código original publicado por el PO podría modificarse para implementarlo a continuación (me disculpo por no incluir las imágenes que produce el código, aún no tengo la reputación requerida).
#!/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')
parece un problema con matplotlib. Pruebe 'plt.arrow (6e-4, 1e-4, 0.1, 0.2, length_includes_head = True)' y mueva la vista a valores más altos de y. Verá que la línea de flecha comienza alrededor de 10-4. Sin embargo, si usa valores más bajos (es decir, 1e-5 para xey), la línea desaparece y solo puede ver la pequeña punta de flecha en el mismo lugar que antes. (Obviamente, debe usar plt.show() para hacer eso) – joaquin
¿Hay alguna solución? – janoliver
Si conozco alguno, habría escrito una respuesta ;-). Pero ahora, al menos, ya sabes que la flecha está allí ... – joaquin