¿Cómo eliminar completamente el espacio en blanco alrededor de un diagtwig de dispersión?

Estoy tratando de trazar un diagtwig de dispersión sobre una imagen sin tener ningún espacio en blanco a su alrededor.

Si trazo solo la imagen de la siguiente manera, entonces no hay espacio en blanco:

fig = plt.imshow(im,alpha=alpha,extent=(0,1,1,0)) plt.axis('off') fig.axes.axis('tight') fig.axes.get_xaxis().set_visible(False) fig.axes.get_yaxis().set_visible(False) 

pero a medida que agrego un diagtwig de dispersión sobre la imagen de la siguiente manera:

 fig = plt.scatter(sx, sy,c="gray",s=4,linewidths=.2,alpha=.5) fig.axes.axis('tight') fig.axes.get_xaxis().set_visible(False) fig.axes.get_yaxis().set_visible(False) 

En este punto, al usar el siguiente comando savefig, el espacio en blanco se agrega alrededor de la imagen:

 plt.savefig(im_filename,format="png",bbox_inches='tight',pad_inches=0) 

¿Alguna idea sobre cómo eliminar el espacio en blanco definitivamente?

Al cambiar al estilo mpl orientado a objetos, puede trazar tanto la imagen como el diagtwig de dispersión en los mismos ejes y, por lo tanto, solo tiene que configurar el espacio en blanco una vez, utilizando ax.imshow y ax.scatter .

En el siguiente ejemplo, he usado subplots_adjust para eliminar el espacio en blanco alrededor de los ejes, y ax.axis('tight') para establecer los límites de los ejes en el rango de datos.

 import matplotlib.pyplot as plt import numpy as np # Load an image im = plt.imread('stinkbug.png') # Set the alpha alpha = 0.5 # Some random scatterpoint data sx = np.random.rand(100) sy = np.random.rand(100) # Creare your figure and axes fig,ax = plt.subplots(1) # Set whitespace to 0 fig.subplots_adjust(left=0,right=1,bottom=0,top=1) # Display the image ax.imshow(im,alpha=alpha,extent=(0,1,1,0)) # Turn off axes and set axes limits ax.axis('tight') ax.axis('off') # Plot the scatter points ax.scatter(sx, sy,c="gray",s=4,linewidths=.2,alpha=.5) plt.show() 

introduzca la descripción de la imagen aquí

Esto funcionó para expandir las imágenes a pantalla completa tanto en show como en savefig sin marcos, espinas ni tics. Tenga en cuenta que todo se hace en la instancia de PLT sin necesidad de crear el argumento secundario, la instancia de eje o bbox:

 from matplotlib import pyplot as plt # create the full plot image with no axes plt.subplots_adjust(left=0, right=1, bottom=0, top=1) plt.imshow(im, alpha=.8) plt.axis('off') # add scatter points plt.scatter(sx, sy, c="red", s=10, linewidths=.2, alpha=.8) # display the plot full screen (backend dependent) mng = plt.get_current_fig_manager() mng.window.state('zoomed') # save and show the plot plt.savefig('im_filename_300.png', format="png", dpi=300) plt.show() plt.close() # if you are going on to do other things 

Esto funcionó durante al menos 600 ppp, que fue mucho más allá de la resolución de la imagen original en los anchos de pantalla normales. Esto es muy conveniente para mostrar imágenes OpenCV sin distorsión usando

 import numpy as np im = img[:, :, ::-1] 

para convertir los formatos de color antes del plt.imshow.