/ / matplotlib: obtenga la relación de eje de la parcela - python, matplotlib

matplotlib: consiga la relación del eje de la trama - python, matplotlib

Necesito producir gráficos de dispersión para varios conjuntos de datos 2D automáticamente.

Por defecto se establece la relación de aspecto. ax.set_aspect(aspect="equal"), que la mayoría de las veces funciona porque la x,y Los valores se distribuyen más o menos en una región al cuadrado.

A veces, sin embargo, me encuentro con un conjunto de datos que, cuando se traza con el equal relación, se ve así:

enter image description here

es decir: demasiado estrecho en un eje dado. Para la imagen de arriba, los ejes son aproximadamente 1: 8.

En tal caso, una relación de aspecto de ax.set_aspect(aspect="auto") resultaría en una trama mucho mejor:

enter image description here

Ahora, no quiero establecer aspect="auto" como mi predeterminado para todos los conjuntos de datos porque el uso aspect="equal" es en realidad el forma correcta de mostrar un diagrama de dispersión de este tipo.

Necesito volver a usar ax.set_aspect(aspect="auto") solo para casos como el anterior.

La pregunta: ¿hay una manera de saber de antemano si la relación de aspecto de una trama será demasiado estrecha si aspect="equal" se utiliza? Como obtener la relación de aspecto real del conjunto de datos trazados.

De esta manera, en función de ese número, puedo ajustar la relación de aspecto a un aspecto más sano (es decir: auto o alguna otra relación de aspecto) en lugar de "equal".

Respuestas

4 para la respuesta № 1

Algo como esto debería hacer,

aspect = (max(x) - min(x)) / (max(y) - min(y))

2 para la respuesta № 2

los axes método get_data_ratio Da la relación de aspecto de los límites de tus datos. como se muestra

ax.get_data_ratio()

por ejemplo:

M = 4.0
ax.set_aspect("equal" if 1/M < ax.get_data_ratio() < M else "auto")

¹Este es el recíproco de la respuesta de @farenorth cuando los ejes se amplían alrededor de los datos, es decir, cuando max(y) == max(ax.get_ylim()) ya que se calcula utilizando los rangos en ax.get_ybound y ax.get_xbound.