Estoy tratando de arreglar cómo Python traza mis datos.
Decir
x = [0,5,9,10,15]
y
y = [0,1,2,3,4]
Entonces haría:
matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()
y los ticks del eje x se trazan en intervalos de 5. ¿Hay alguna manera de hacer que muestre intervalos de 1?
python
matplotlib
Dax Feliz
fuente
fuente
pyplot.locator_params(nbins=4)
Respuestas:
Puede establecer explícitamente dónde desea marcar las marcas con
plt.xticks
:Por ejemplo,
(
np.arange
se utilizó en lugar de larange
función de Python por si acasomin(x)
ymax(x)
son flotantes en lugar de int.)La función
plt.plot
(oax.plot
) establecerá automáticamente valores predeterminadosx
yy
límites. Si desea mantener esos límites, y simplemente cambiar el tamaño de paso de las marcas de verificación, puede usarax.get_xlim()
para descubrir qué límites ya ha establecido Matplotlib.El formateador de tick predeterminado debe hacer un trabajo decente redondeando los valores de tick a un número razonable de dígitos significativos. Sin embargo, si desea tener más control sobre el formato, puede definir su propio formateador. Por ejemplo,
Aquí hay un ejemplo ejecutable:
fuente
+1
en cuenta queplt.xticks(np.arange(min(x), max(x)+1, 1.0))
se requiere la entrada para mostrar la última marca de verificación.np.arange(start, stop)
genera valores en el intervalo medio abierto[start, stop)
, incluidosstart
pero excluyentesstop
. Así que solíamax(x)+1
asegurarme de quemax(x)
esté incluido.plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)
? parece que solo traza el añoOtro enfoque es establecer el localizador de ejes:
Existen varios tipos diferentes de localizador según sus necesidades.
Aquí hay un ejemplo completo:
fuente
matplotlib.dates.AutoDateLocator()
base=1.0
realmente / hacer?Me gusta esta solución (del Matplotlib Plotting Cookbook ):
Esta solución le brinda un control explícito del espaciado de ticks a través del número dado
ticker.MultipleLocater()
, permite la determinación automática de límites y es fácil de leer más adelante.fuente
En caso de que alguien esté interesado en una línea general, simplemente obtenga los ticks actuales y úselos para configurar los nuevos ticks probando cada otro tick.
fuente
ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
Esto es un poco hacky, pero con mucho el ejemplo más limpio / fácil de entender que he encontrado para hacer esto. Es de una respuesta en SO aquí:
¿Es la forma más limpia de ocultar cada enésima etiqueta en la barra de colores matplotlib?
Luego, puede recorrer las etiquetas configurándolas como visibles o no, según la densidad que desee.
editar: tenga en cuenta que a veces matplotlib establece etiquetas ==
''
, por lo que puede parecer que una etiqueta no está presente, cuando de hecho lo está y simplemente no muestra nada. Para asegurarte de que estás recorriendo las etiquetas visibles reales, puedes intentar:fuente
ax.get_xticklabels()[1::2]
son las etiquetas que deben ocultarse.''
que cuando los recorra , esté haciendo que xticklabels estén vacíos invisibles (lo que no tendría ningún efecto en la visualización, pero podría significar que no está tirando) las etiquetas correctas) Podrías probar:vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
Este es un tema antiguo, pero me tropiezo con esto de vez en cuando e hice esta función. Es muy conveniente:
Una advertencia de controlar los ticks como este es que ya no se disfruta de la actualización automática interactiva de la escala máxima después de una línea adicional. Entonces hazlo
y ejecute la función de reajuste nuevamente.
fuente
Desarrollé una solución poco elegante. Considere que tenemos el eje X y también una lista de etiquetas para cada punto en X.
Ejemplo: Digamos que quiero mostrar las etiquetas de las marcas solo para 'feb' y 'jun' Bien, ahora tenemos una lista falsa de etiquetas. Primero, trazamos la versión original. Ahora, la versión modificada.fuente
si solo desea establecer el espacio en un revestimiento simple con un mínimo de repetitivo:
También funciona fácilmente para garrapatas menores:
un poco bocado, pero bastante compacto
fuente
Esto funciono para mi
si desea marcar entre [1,5] (1 y 5 inclusive), reemplace
fuente
xmarks = range(1, length+1, 1)
. bastante seguro de que la comprensión de la lista es redundante.Implementación de Python puro
A continuación se muestra una implementación de Python pura de la funcionalidad deseada que maneja cualquier serie numérica (int o flotante) con valores positivos, negativos o mixtos y permite al usuario especificar el tamaño de paso deseado:
Salida de muestra
Uso de muestra
Observe que el eje x tiene valores enteros todos espaciados uniformemente por 5, mientras que el eje y tiene un intervalo diferente (el
matplotlib
comportamiento predeterminado, porque no se especificaron los ticks).fuente