Cómo deshabilitar bbox_inches = ‘apretado’ cuando se trabaja con matplotlib en línea en el portátil ipython

Cuando se trabaja con el backend en línea matplotlib en el portátil ipython, el comportamiento predeterminado es usar bbox_inches = ‘apretado’ para generar la imagen png incrustada internamente mediante savefig (). Esto elimina el espacio en blanco alrededor de los ejes y es excelente en la mayoría de los casos.

Sin embargo, a veces es posible que desee (temporalmente) deshabilitar esta función, por ejemplo, cuando (s) desea mantener manualmente dos figuras alineadas verticalmente (supongamos que no queremos usar una ttwig secundaria aquí):

%matplotlib inline from pylab import * plot(rand(100)) subplots_adjust(left=0.2) # Has no effect with inline, but works as expected with qt figure() plot(rand(100)*10000) # Will result in a larger left margin for this figure... subplots_adjust(left=0.2) 

Entonces, ¿cómo deshabilitar este comportamiento? Gracias ~

EDITAR

Para que el problema involucrado aquí sea más explícito (gracias a Anzel), la segunda cifra, debido a que se mostrarán más dígitos en tags yticklabels, tendrá un margen izquierdo más grande (y un margen derecho más pequeño) después del ajuste de diseño automático activado por bbox_inches = ‘apretado ‘opción en savefig (), que se llama internamente por notebook para generar la salida png incrustada. Truncará efectivamente cualquier espacio adicional que haga intencionalmente con subplots_adjust (), de modo que la segunda figura parecerá desplazarse hacia la derecha y no se “alineará” verticalmente con la primera figura.

Es fácil ver lo que quiero decir, simplemente intente el fragmento de código de arriba 🙂

La razón por la que no estoy usando subplot / subplots aquí (ver comentarios a la respuesta de Anzel) es que en este caso particular, las dos figuras son en sí mismas compuestas de decenas de subplots pequeños, más algún formato / etiquetado adicional. Fusionarlas en una gran variedad de subplots no es trivial …

Aquí hay una respuesta más completa: Matplotlib y Ipython-notebook: Mostrar exactamente la figura que se guardará.

El truco es desactivar el bbox_inches='tight' en ipython. Es un poco incómodo hacerlo temporalmente, pero simplemente ejecuta la magia IPython en un bloque: %config InlineBackend.print_figure_kwargs = {'bbox_inches':None}

Si desea volver a la forma normal, donde las tags de eje nunca se cortan automáticamente, puede ejecutar %config InlineBackend.print_figure_kwargs = {'bbox_inches':'tight'} pero tiene que ser después del bloque donde realiza el trazado. que necesita cuadros de delimitación precisos.

Puede usar los pyplot.subplots de pyplot.subplots de pyplot.subplots para alinear los gráficos en un orden de cuadrícula, de modo que las figuras se alineen visualmente en el cuaderno (si eso es lo que quiere)

Algo como esto:

 %matplotlib inline import matplotlib.pyplot as plt import numpy as np d1 = np.random.rand(100) d2 = np.random.rand(100)*10000 fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1) plt.subplots_adjust(left=0.2) ax1.plot(d1) ax2.plot(d2) 

Actualizaciones

Como los requisitos de OP para usar plots separadas en lugar de subplots, aquí hay una solución pirata. Esto está funcionando en mi computadora portátil, se pueden encontrar más detalles sobre la personalización AQUÍ .

 import matplotlib.pyplot as plt import numpy as np %matplotlib inline # to override ytick.major.width before any plot plt.rcParams['ytick.major.pad'] = 20 plt.plot(np.random.rand(100)) # another override to set alignment for the plot plt.rcParams['ytick.major.pad'] = 5 plt.figure() plt.plot(np.random.rand(100)*10000) 

Las parcelas

 # plt.rcdefaults() will reset everything to defaults as the doc says. 

No es la forma más elegante pero funciona como se requiere.