La escala del eje y de la subplotación de Matplotlib se superpone con la gráfica anterior

Estoy tratando de trazar 3 subplots sin ningún espacio en blanco entre ellos. Las marcas de verificación predeterminadas del eje y utilizan una escala que se muestra en la parte superior derecha del eje y (1e-8 en el ejemplo a continuación), lo que estaría bien, excepto por los dos gráficos inferiores que se superponen con el gráfico anterior. Alguien sabe como arreglar esto? Un pequeño ejemplo está abajo.

import numpy as np import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec from matplotlib.ticker import MaxNLocator x = np.arange(0,200) y = np.random.rand(200) * 10e-8 fig = plt.figure(figsize=(10,15)) gs1 = gridspec.GridSpec(3, 3) gs1.update(left=0.1, right=0.9, bottom=0.5, hspace=0.0) ax0a = plt.subplot(gs1[0, :]) ax0b = plt.subplot(gs1[1, :]) ax0c = plt.subplot(gs1[2, :]) ax0a.set_xticklabels([]) ax0b.set_xticklabels([]) ax0a.plot(x,y) nbins = len(ax0a.get_xticklabels()) ax0a.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) ax0b.plot(x,y) ax0b.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) ax0c.plot(x,y) ax0c.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 

trama

así que una solución es usar mtick,

 import matplotlib.ticker as mtick ax0a.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.1e')) ax0b.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.1e')) ax0c.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.1e')) 

pero preferiría poder desplazar la escala hacia la izquierda para que esté fuera del eje si es posible.

Tengo dos opciones que podrías querer ver.

Primero, establece la ubicación del eje y el tamaño como tal:

 # your imports and data above fig = plt.figure() ax0a = fig.add_axes([0.1, 0.1, 0.8, 0.25]) ax0b = fig.add_axes([0.1, 0.39, 0.8, 0.25], sharex=ax0a) ax0c = fig.add_axes([0.1, 0.68, 0.8, 0.25], sharex=ax0a) ax0a.set_xticklabels([]) ax0b.set_xticklabels([]) ax0a.plot(x,y) nbins = len(ax0a.get_xticklabels()) ax0a.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) ax0b.plot(x,y) ax0b.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) ax0c.plot(x,y) ax0c.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) plt.show() 

introduzca la descripción de la imagen aquí

La segunda opción es ajustar manualmente la ubicación y quizás el tamaño de fuente del texto de desplazamiento:

 # your original code minus data and imports fig = plt.figure() gs1 = gridspec.GridSpec(3, 3) gs1.update(left=0.1, right=0.9, bottom=0.5, hspace=0.0) ax0a = plt.subplot(gs1[0, :]) ax0b = plt.subplot(gs1[1, :]) ax0c = plt.subplot(gs1[2, :]) ax0a.set_xticklabels([]) ax0b.set_xticklabels([]) ax0a.plot(x,y) nbins = len(ax0a.get_xticklabels()) ax0a.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) ax0b.plot(x,y) ax0b.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) ax0c.plot(x,y) ax0c.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) # play around with location and font of offset text here ax0a.get_yaxis().get_offset_text().set_x(-0.075) ax0a.get_yaxis().get_offset_text().set_size(10) ax0b.get_yaxis().get_offset_text().set_x(-0.075) ax0b.get_yaxis().get_offset_text().set_size(10) ax0c.get_yaxis().get_offset_text().set_x(-0.075) ax0c.get_yaxis().get_offset_text().set_size(10) plt.show() 

introduzca la descripción de la imagen aquí

Ok, esta es probablemente una solución fea, pero simplemente podría ax0b.plot(x, y*1e8) la escala de sus datos en los gráficos más bajos con el rango de la potencia, es decir, ax0b.plot(x, y*1e8) . Esto funciona para su ejemplo al menos.