Hacer anotaciones Matplotlib legibles/sin densa
¿Hay alguna manera de disminuir la densidad de etiquetas de datos en Matplotlib? Ahora mismo, parece esto.
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.
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
yset_yticks
. También puedes cambiar automáticamente la ubicación de las flechas para que las etiquetas sean más legibles mediante la funciónannotate
.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
yva
hacen referencia a la alineación horizontal y vertical de la etiqueta, yrotation
permite rotar la etiqueta para una mejor legibilidad.Puedes ajustar los valores de
ha
,va
yrotation
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