si puedo hacer un gráfico de dispersión con matplotlib:

plt.scatter(randn(100),randn(100))
# set x, y lims
plt.xlim([...])
plt.ylim([...])

Me gustaría anotar un punto dado (x, y) con una flecha y una etiqueta. Sé que esto se puede hacer con annotate, pero me gustaría la flecha y su etiqueta que se encuentra «óptima» de tal manera que si es posible (dadas las actuales escalas de ejes/límites) que la dirección de la flecha y la etiqueta no se superponen con los otros puntos. por ejemplo, si usted quería etiqueta de un valor atípico punto. es allí una manera de hacer esto? no tiene que ser perfecto, pero sólo una inteligente colocación de la flecha de la etiqueta, sólo el (x,y) coordenadas del punto a ser etiquetados. gracias.

  • En una nota de lado, scatter no es la intención de lo que estás haciendo. Se usa cuando se desea trazar 3 o 4 dimensiones de datos variando el color y/o tamaño de los marcadores. No lo use si solo deseas puntos. No hay nada inherentemente malo con el uso de ti por los puntos, pero va a volver una colección, que es más complejo de tratar que un Line2D objeto que plot devuelve.
InformationsquelleAutor | 2012-01-31

2 Comentarios

  1. 35

    Básicamente, no, no la hay.

    Diseño de motores que se encargan de la colocación de las etiquetas del mapa similares a este son muy complejas y más allá del alcance de matplotlib. (Cuadro delimitador las intersecciones son una muy mala manera de decidir dónde colocar las etiquetas. Cuál es el punto de escribir un montón de código para algo que sólo funcionará en un caso de 1000?)

    Otros que, debido a la cantidad de complejo de procesamiento de texto que matplotlib hace (por ejemplo, el látex), es imposible determinar el grado de texto sin representación es el primero (que es bastante lento).

    Sin embargo, en muchos casos, usted encontrará que el uso de una caja transparente detrás de la etiqueta se coloca con anotar es una solución adecuada.

    E. g.

    import numpy as np
    import matplotlib.pyplot as plt
    
    np.random.seed(1)
    x, y = np.random.random((2,500))
    
    fig, ax = plt.subplots()
    ax.plot(x, y, 'bo')
    
    # The key option here is `bbox`. I'm just going a bit crazy with it.
    ax.annotate('Something', xy=(x[0], y[0]), xytext=(-20,20), 
                textcoords='offset points', ha='center', va='bottom',
                bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
                arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5', 
                                color='red'))
    
    plt.show()

    matplotlib: cómo anotar el punto en un diagrama de dispersión automáticamente coloca la flecha?

    • Me gusta tu ejemplo. Uno también podría poner a la anotación al margen del marco, el uso de «los ejes de la fracción» por ejemplo, para el textcoords. El carácter automático de la colocación podría estar envuelto en un pequeño método que crea la anotación. Si el punto más cercano a la centro de la parte inferior, lo puso debajo del eje x; si es más cerca del borde de la derecha, la puso allí, tal vez incluso automáticamente la rotación…. Todavía la colocación requerirá un poco más de finura, porque puede ocultar las marcas de graduación, o conseguir recorta por el borde de la figura, etc…
    • ¿Cómo se decide qué valores para dar a xytext (en este caso (-20,20))?
    • Eso es un desplazamiento en los puntos. Es arbitrario, pero no dependen de que sus rangos de datos. Nota el kwarg textcoords='offset points'. Pasando en varios otros valores para textcoords controla cómo los números en xytext se interpretan.
  2. 5

    Uso adjustText (la divulgación completa, lo escribí).

    Vamos a la etiqueta de los primeros 10 puntos. El único parámetro que cambié fue la reducción de la fuerza de repeler a partir de los puntos, ya que hay muchos de ellos y queremos que el algoritmo a tomar un poco más de tiempo y lugar las anotaciones más cuidadosamente.

    import numpy as np
    import matplotlib.pyplot as plt
    from adjustText import adjust_text
    np.random.seed(1)
    x, y = np.random.random((2,500))
    
    fig, ax = plt.subplots()
    ax.plot(x, y, 'bo')
    ts = []
    for i in range(10):
        ts.append(plt.text(x[i], y[i], 'Something'+str(i)))
    adjust_text(ts, x=x, y=y, force_points=0.1, arrowprops=dict(arrowstyle='->', 
    color='red'))
    plt.show()

    matplotlib: cómo anotar el punto en un diagrama de dispersión automáticamente coloca la flecha?
    No es lo ideal, pero los puntos son bastante densas aquí y a veces no hay manera de colocar el texto cercano a su destino sin la superposición de cualquiera de ellos. Pero todo es automático y fácil de usar, y también no dejar las etiquetas se superponen unos a otros.

    PS
    Utiliza el cuadro delimitador de las intersecciones, pero con bastante éxito diría!

Dejar respuesta

Please enter your comment!
Please enter your name here