Saltar al contenido

¿Matplotlib tiene una función para dibujar líneas diagonales en las coordenadas del eje?

Solución:

Dibujar una diagonal desde la esquina inferior izquierda a la esquina superior derecha de su trama se lograría de la siguiente manera

ax.plot([0, 1], [0, 1], transform=ax.transAxes)

Utilizando transform=ax.transAxes, el suministrado x y y las coordenadas se interpretan como ejes coordenadas en lugar de datos coordenadas.

Esto, como señaló @fqq, es solo la línea de identidad cuando su x y y los límites son iguales. Para dibujar la linea y=x de modo que siempre se extienda a los límites de su trama, funcionaría un enfoque similar al dado por @Ffisegydd, y se puede escribir como la siguiente función.

def add_identity(axes, *line_args, **line_kwargs):
    identity, = axes.plot([], [], *line_args, **line_kwargs)
    def callback(axes):
        low_x, high_x = axes.get_xlim()
        low_y, high_y = axes.get_ylim()
        low = max(low_x, low_y)
        high = min(high_x, high_y)
        identity.set_data([low, high], [low, high])
    callback(axes)
    axes.callbacks.connect('xlim_changed', callback)
    axes.callbacks.connect('ylim_changed', callback)
    return axes

Uso de ejemplo:

import numpy as np
import matplotlib.pyplot as plt

mean, cov = [0, 0], [(1, .6), (.6, 1)]
x, y = np.random.multivariate_normal(mean, cov, 100).T
y += x + 1

f, ax = plt.subplots(figsize=(6, 6))
ax.scatter(x, y, c=".3")
add_identity(ax, color="r", ls="--")

plt.show()

Trazar una línea diagonal desde la parte inferior izquierda hasta la parte superior derecha de la pantalla es bastante simple, simplemente puede usar ax.plot(ax.get_xlim(), ax.get_ylim(), ls="--", c=".3"). El método ax.get_xlim() simplemente devolverá los valores actuales del eje x (y de manera similar para el eje y).

Sin embargo, si desea poder hacer zoom usando su gráfico, entonces se vuelve un poco más complicado, ya que la línea diagonal que ha trazado no cambiará para coincidir con sus nuevos xlims e ylims.

En este caso, puede usar devoluciones de llamada para verificar cuándo han cambiado los xlims (o ylims) y cambiar los datos en su línea diagonal en consecuencia (como se muestra a continuación). Encontré los métodos para devoluciones de llamada en este ejemplo. También se puede encontrar más información aquí.

import numpy as np
import matplotlib.pyplot as plt

mean, cov = [0, 0], [(1, .6), (.6, 1)]
x, y = np.random.multivariate_normal(mean, cov, 100).T
y += x + 1

f, ax = plt.subplots(figsize=(6, 6))

ax.scatter(x, y, c=".3")
ax.set(xlim=(-3, 3), ylim=(-3, 3))

# Plot your initial diagonal line based on the starting
# xlims and ylims.
diag_line, = ax.plot(ax.get_xlim(), ax.get_ylim(), ls="--", c=".3")

def on_change(axes):
    # When this function is called it checks the current
    # values of xlim and ylim and modifies diag_line
    # accordingly.
    x_lims = ax.get_xlim()
    y_lims = ax.get_ylim()
    diag_line.set_data(x_lims, y_lims)

# Connect two callbacks to your axis instance.
# These will call the function "on_change" whenever
# xlim or ylim is changed.
ax.callbacks.connect('xlim_changed', on_change)
ax.callbacks.connect('ylim_changed', on_change)

plt.show()

Tenga en cuenta que si no desea que la línea diagonal cambie con el zoom, simplemente elimine todo lo que se muestra a continuación. diag_line, = ax.plot(...

Si los ejes están en el rango [0,1], se puede resolver de esta manera:

ident = [0.0, 1.0]
plt.plot(ident,ident)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *