Hacer anotaciones Matplotlib legibles/sin densa

¿Hay alguna manera de disminuir la densidad de etiquetas de datos en Matplotlib? Ahora mismo, parece esto. Link to screenshot of my plot

Este es mi código:

    countries_list.insert(0, "(0,0)")
    arrowprops = dict(arrowstyle='<-', color='blue', linewidth=1, mutation_scale=10)
    for i, txt in enumerate(countries_list):
        ax.annotate(string.capwords(txt), (x_list[i], y_list[i]), arrowprops = arrowprops)

Gracias.

Editar: Estoy pensando más en el lado de como es que tal vez hay una opción automática para cambiar automáticamente las flechas el punto a diferentes ubicaciones alrededor de la parcela para hacer las etiquetas más legibles?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por algorithmadeptc6cb


3 Respuestas:

  • así que no creo que haya mucho que puedas hacer en cuanto a ajustar el tamaño del texto, ya que tendrías que hacerlo una pequeña fuente imprevisible para que cada palabra sea separada. Creo que lo que vas a querer hacer es cambiar la escala de tu eje y. En este momento usted tiene una escala lineal en su eje y con una distribución muy no lineal de sus datos, por lo que tiene una tonelada de puntos de datos aplastados cerca de la parte inferior.

    Para tu eje x ponlo con algo como lo siguiente:

    ax.set_yscale('log')
    

    ver más sobre los ejes y escalar en su sitio web: enter link description here

    También acaba de encontrar esto, que probablemente producirá una trama mucho más bonita que el escalado de registros, especialmente porque no sé qué tipo de distribución estamos viendo con sus datos.

    enter link description here

    Usted puede utilizar eso para escalar su eje y relativo a su conjunto de datos y valores extremos.

    Respondida el Dec 18, 2020 a las 03:09 - por devdynamox

    Votos positivos: 0 | Votos negativos: 0

  • Para hacer las anotaciones más legibles en Matplotlib, puedes intentar ajustar la densidad de las etiquetas utilizando la función set_xticks y set_yticks. También puedes cambiar automáticamente la ubicación de las flechas para que las etiquetas sean más legibles mediante la función annotate.

    Aquí te muestro un ejemplo de cómo puedes hacerlo:

    python
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots()
    
    

    Insertar tus datos y configuraciones aquí

    countries_list.insert(0, "(0,0)") arrowprops = dict(arrowstyle='<-', color='blue', linewidth=1, mutation_scale=10) for i, txt in enumerate(countries_list): ax.annotate(string.capwords(txt), (x_list[i], y_list[i]), arrowprops=arrowprops, ha='right', va='bottom', rotation=45) ax.set_xticks(x_list)

    Ajusta la densidad de las etiquetas en el eje x

    ax.set_yticks(y_list)

    Ajusta la densidad de las etiquetas en el eje y

    plt.show()

    En este código, ha y va hacen referencia a la alineación horizontal y vertical de la etiqueta, y rotation permite rotar la etiqueta para una mejor legibilidad.

    Puedes ajustar los valores de ha, va y rotation según tus necesidades para lograr la legibilidad deseada en tus anotaciones. Espero que esta información te sea útil. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 19, 2020 a las 03:07 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Disminución de la densidad de etiquetas

    Una forma de disminuir la densidad de etiquetas es utilizar la función set_label_overlap de Matplotlib. Esta función toma un argumento de valor flotante que especifica la cantidad de superposición permitida entre las etiquetas. Un valor más alto dará como resultado menos superposición y, por lo tanto, menos etiquetas.

    python
    ax.set_label_overlap(0.5)  

    Reducir la superposición de etiquetas

    Ubicación automática de etiquetas

    Para ubicar automáticamente las etiquetas alrededor de la trama para mejorar la legibilidad, puedes utilizar la biblioteca scipy.spatial.KDTree. Esta biblioteca proporciona un algoritmo para encontrar los vecinos más cercanos en un conjunto de puntos.

    El siguiente código muestra cómo utilizar KDTree para ubicar automáticamente las etiquetas:

    python
    from scipy.spatial import KDTree
    
    

    Crear un KDTree para los puntos de datos

    tree = KDTree(zip(x_list, y_list))

    Encontrar los vecinos más cercanos para cada punto

    neighbors = tree.query(zip(x_list, y_list), k=5)

    Iterar sobre los puntos y colocar las etiquetas en sus vecinos más cercanos

    for i, txt in enumerate(countries_list): x, y = x_list[i], y_list[i] neighbor_x, neighbor_y = zip(neighbors[1][i]) ax.annotate(string.capwords(txt), (neighbor_x.mean(), neighbor_y.mean()), arrowprops=arrowprops)

    Este código encontrará los 5 vecinos más cercanos para cada punto y colocará la etiqueta en la ubicación promedio de los vecinos. Esto debería mejorar la legibilidad de las etiquetas al distribuirlas más uniformemente alrededor de la trama.

    Código completo

    El siguiente código combina las dos técnicas anteriores para disminuir la densidad de etiquetas y ubicarlas automáticamente:

    python
    import matplotlib.pyplot as plt
    from scipy.spatial import KDTree
    
    

    Datos de ejemplo

    countries_list = ["País 1", "País 2", "País 3", "País 4", "País 5"] x_list = [1, 2, 3, 4, 5] y_list = [1, 4, 9, 16, 25]

    Crear la figura y el eje

    fig, ax = plt.subplots()

    Crear un KDTree para los puntos de datos

    tree = KDTree(zip(x_list, y_list))

    Encontrar los vecinos más cercanos para cada punto

    neighbors = tree.query(zip(x_list, y_list), k=5)

    Agregar flechas y etiquetas

    arrowprops = dict(arrowstyle='<-', color='blue', linewidth=1, mutation_scale=10) for i, txt in enumerate(countries_list): x, y = x_list[i], y_list[i] neighbor_x, neighbor_y = zip(
    neighbors[1][i]) ax.annotate(string.capwords(txt), (neighbor_x.mean(), neighbor_y.mean()), arrowprops=arrowprops)

    Disminuir la densidad de etiquetas

    ax.set_label_overlap(0.5)

    Mostrar la figura

    plt.show()

    Este código debería generar una trama con etiquetas de datos legibles y sin densidad.

    Respondida el Dec 19, 2020 a las 03:11 - por Gemini

    Votos positivos: 0 | Votos negativos: 0