2011-04-02 64 views
20

Tengo problemas con las etiquetas de ejes que solapan etiquetas de ticks en matplotlib. He intentado cambiar la posición de las etiquetas "manualmente" aplicando transformaciones o llamando a set_y(), pero no sirvió para nada.Ajuste el posicionamiento de la etiqueta en Axes3D de matplotlib

He aquí un fragmento que reproduce el problema:

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure() 
figure.subplots_adjust(bottom=0.25, top=0.75) 
axes = figure.gca(projection='3d') 
xLabel = axes.set_xlabel('XXX xxxxxx xxxx x xx x') 
yLabel = axes.set_ylabel('YY (y) yyyyyy') 
zLabel = axes.set_zlabel('Z zzzz zzz (z)') 
plot = axes.plot([1,2,3],[1,2,3]) 

pyplot.show() 

Nota cómo el X y Y etiquetas chocan con las garrapatas. ¿Puedo resolver esto elegantemente?

Respuesta

32

Comparto su frustración. Trabajé en ello durante media hora y no llegué a ninguna parte. Los documentos dicen que set_xlabel toma un arg labelpad pero me sale un error (AttributeError: etiqueta de propiedad desconocida)! Establecerlo después del hecho no hace nada, en xaxis o w_xaxis.

Aquí es una solución cruda:

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure(figsize=(8,4), facecolor='w') 
ax = figure.gca(projection='3d') 

xLabel = ax.set_xlabel('\nXXX xxxxxx xxxx x xx x', linespacing=3.2) 
yLabel = ax.set_ylabel('\nYY (y) yyyyyy', linespacing=3.1) 
zLabel = ax.set_zlabel('\nZ zzzz zzz (z)', linespacing=3.4) 
plot = ax.plot([1,2,3],[1,2,3]) 
ax.dist = 10 

pyplot.show() 

enter image description here

+6

Te lo juro, probé decenas de soluciones temporales, ¡pero no me ocurrió simplemente agregar una nueva línea al comienzo de las etiquetas! ¡Inteligente! Gracias ! – AbsentmindedProfessor

+0

ingenioso (para agregar una nueva línea) !!! –

+0

Me volví loco hasta que me encontré con un enfoque simple, pero muy inteligente. Gracias ... – Memin

3

Como práctica de diseño, el texto transformado no es muy legible. Le sugiero que use etiquetas para su eje, tal vez codificadas en color. Así es como se hace en matplotlib

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure() 
figure.subplots_adjust(bottom=0.25, top=0.75) 
axes = figure.gca(projection='3d') 
xLabel = axes.set_xlabel('X', fontsize=14, fontweight='bold', color='b') 
yLabel = axes.set_ylabel('Y',fontsize=14, fontweight='bold', color='r') 
zLabel = axes.set_zlabel('Z',fontsize=14, fontweight='bold', color='g') 


x = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='b') 
y = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='r') 
z = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='g') 

handles, labels = axes.get_legend_handles_labels() 
axes.legend((x,y,z),("XXXXXX","YYYYY","ZZZZZZ"),'best') 


plot = axes.plot([1,2,3],[1,2,3]) 


pyplot.show() 

Image result

+1

La codificación del color no es una mala idea, pero esto es para un artículo académico, que debe ser legible en blanco y negro. Gracias por compartir ! – AbsentmindedProfessor

13

que realmente necesita para seguir Stackoverflow más a menudo. Soy el mantenedor actual de mplot3d. La razón por la cual los diversos trucos que normalmente funcionan en parcelas 2D en general no funcionan para gráficos en 3D es porque mplot3d se escribió originalmente con los valores predeterminados codificados. También hubo errores en cómo mplot3d calculó el ángulo para representar las etiquetas.

v1.1.0 contiene varias correcciones para mejorar el estado de las cosas. Arreglé el error de cálculo de los ángulos de las etiquetas de los ejes e hice algunos ajustes al espaciado. Para la próxima versión, me gustaría tener ejes 3D para ocupar más que el espaciado predeterminado de los ejes, ya que el valor predeterminado se diseñó para tener en cuenta que las etiquetas tic y las etiquetas de los ejes estarían fuera de los ejes, lo que no es el caso de mplot3d . Debido a que los espaciamientos están determinados por proporciones relativas en mplot3d, tener un espacio más pequeño para trabajar obliga a que las etiquetas estén más juntas.

En cuanto a otras posibles avenidas para las soluciones alternativas, consulte la nota here. Una advertencia justa, este diccionario privado no pretende ser una solución permanente, sino más bien un mal necesario hasta que se complete el refactor de mplot3d.

Además, v1.1.0 contiene muchas actualizaciones para la API de mplot3d. Consulte la documentación revisada here.

+0

¿Hay algún ejemplo sobre cómo acceder y cambiar self._axinfo? Especialmente el relleno? – mab

+0

^^^^^^^ Ver mi respuesta –

19

En las nuevas versiones de matplotlib, esta es la forma de hacerlo:

ax.xaxis._axinfo['label']['space_factor'] = 2.8 

Véase la explicación aquí:

https://github.com/matplotlib/matplotlib/issues/3610

Probado en v1.4, debería funcionar en las versiones> 1.1 Creo.

+2

muchas gracias, única solución que funciona – fsociety

+1

Tengo 1.5.1 ejecutándose en Jupyter y esta expresión no tiene efecto aparente. – user5920660

3

Añadir esto para cada eje, adaptar el número:

axes.yaxis.labelpad=30 

Se menciona en el enlace de Adam Hughes como no funciona, pero funciona para mí.

Cuestiones relacionadas