python graduation - Parcelles de matplotlib: suppression de l'axe, des légendes et des espaces blancs




4 Answers

Je pense que l' axis('off') commande axis('off') s'occupe de l'un des problèmes plus succinctement que de changer chaque axe et la bordure séparément. Il laisse toujours l'espace blanc autour de la frontière cependant. Ajouter bbox_inches='tight' à la commande savefig vous y savefig presque, vous pouvez voir dans l'exemple ci-dessous que l'espace blanc restant est beaucoup plus petit, mais toujours présent.

from numpy import random
import matplotlib.pyplot as plt

data = random.random((5,5))
img = plt.imshow(data, interpolation='nearest')
img.set_cmap('hot')
plt.axis('off')
plt.savefig("test.png", bbox_inches='tight')

axis remove

Je suis nouveau sur Python et Matplotlib, je voudrais simplement appliquer une palette de couleurs à une image et écrire l'image résultante, sans utiliser d'axes, d'étiquettes, de titres ou de quoi que ce soit habituellement ajouté automatiquement par matplotlib. Voici ce que j'ai fait:

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    fig.axes.get_xaxis().set_visible(False)
    fig.axes.get_yaxis().set_visible(False)
    plt.savefig(outputname)

Il supprime avec succès l'axe de la figure, mais le chiffre enregistré présente un remplissage blanc et un cadre autour de l'image réelle. Comment puis-je les supprimer (au moins le rembourrage blanc)? Merci




Solution la plus simple possible:

J'ai simplement combiné la méthode décrite dans la question et la méthode de la réponse de Hooked.

fig = plt.imshow(my_data)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('pict.png', bbox_inches='tight', pad_inches = 0)

Après ce code, il n'y a pas d'espaces et pas de frame.




Vous pouvez également spécifier l'étendue de la figure à l'argument bbox_inches . Cela permettrait de se débarrasser du rembourrage blanc autour de la figure.

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    ax = fig.gca()
    ax.set_axis_off()
    ax.autoscale(False)
    extent = ax.get_window_extent().transformed(plt.gcf().dpi_scale_trans.inverted())
    plt.savefig(outputname, bbox_inches=extent)



J'aimais réponse , mais elle ne montrait pas explicitement comment définir la taille des images non-carrées, donc je l'ai modifié pour faciliter le copier-coller:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

def save_image_fix_dpi(data, dpi=100):
    shape=np.shape(data)[0:2][::-1]
    size = [float(i)/dpi for i in shape]

    fig = plt.figure()
    fig.set_size_inches(size)
    ax = plt.Axes(fig,[0,0,1,1])
    ax.set_axis_off()
    fig.add_axes(ax)
    ax.imshow(data)
    fig.savefig('out.png', dpi=dpi)
    plt.show()

La sauvegarde d'images sans bordure est facile quel que soit le dpi que vous choisissez si pixel_size / dpi = size est conservé.

data = mpimg.imread('test.png')
save_image_fix_dpi(data, dpi=100)

Cependant l'affichage est effrayant. Si vous choisissez un petit dpi, la taille de votre image peut être plus grande que votre écran et vous obtenez une bordure pendant l'affichage. Néanmoins, cela n'affecte pas la sauvegarde.

Donc pour

save_image_fix_dpi(data, dpi=20)

L'affichage devient bordé (mais la sauvegarde fonctionne):




Related