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 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 la figure enregistrée présente un rembourrage blanc et un cadre autour de l'image réelle. Comment puis-je les retirer (au moins le rembourrage blanc)? Merci
python
matplotlib
tapis de soleil
la source
la source
imshow
. Si vous avez un nuage de points à la place, la réponse suivante pourrait vous aider: stackoverflow.com/a/40727744/4124317Réponses:
Je pense que la commande
axis('off')
s'occupe de l'un des problèmes plus succinctement que de changer chaque axe et la frontière séparément. Il laisse cependant l'espace blanc autour de la frontière. L'ajoutbbox_inches='tight'
à lasavefig
commande vous y mène presque, vous pouvez voir dans l'exemple ci-dessous que l'espace blanc laissé est beaucoup plus petit, mais toujours présent.Notez que les nouvelles versions de matplotlib peuvent nécessiter à la
bbox_inches=0
place de la chaîne'tight'
(via @episodeyang et @kadrach)la source
fig = plt.figure()
,ax = plt.axes([0,0,1,1])
puisplt.imshow(data,interpolation="nearest"
. Combiné avecplt.axis("off")
, il devrait se débarrasser de tout à côté de l'image elle-même, espérons-le!bbox_inches=0
fait l'affaire.J'ai appris cette astuce de matehat, ici :
les rendements
la source
plt.Axes(fig, [0,0,1,1])
. Cela indique à matplotlib de créer un ensemble d'axes avec le coin inférieur gauche au point situé à (0%, 0%), et avec une largeur et une hauteur de (100%, 100%).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.
Après ce code, il n'y a ni espace ni cadre.
la source
fig.axes.get_xaxis().set_visible(False)
résout le problème. Mercifig.axes[0]
et en général tous ou certains axes.Personne
imsave
encore mentionné , ce qui en fait une ligne unique:Il stocke directement l'image telle qu'elle est, c'est-à-dire n'ajoute aucun axe ni bordure / remplissage.
la source
Vous pouvez également spécifier l'étendue de la figure à l'
bbox_inches
argument. Cela éliminerait le rembourrage blanc autour de la figure.la source
Cela devrait supprimer tout le rembourrage et les bordures:
la source
ax
) avecextent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted())
.J'ai trouvé que tout était documenté ...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis
Mon code…. "bcK" est une image 512x512
la source
La réponse votée ne fonctionne plus. Pour le faire fonctionner, vous devez ajouter manuellement un jeu d'axes à [0, 0, 1, 1], ou supprimer le patch sous la figure.
Alternativement, vous pouvez simplement supprimer le patch. Vous n'avez pas besoin d'ajouter un sous-tracé pour supprimer les rembourrages. Ceci est simplifié de la réponse de Vlady ci-dessous
Ceci est testé avec la version
3.0.3
du 2019/06/19. Image voir ci-dessous:Une chose beaucoup plus simple à faire est d'utiliser
pyplot.imsave
. Pour plus de détails, voir la réponse du luator ci-dessousla source
J'ai aimé la réponse d'ubuntu , mais elle ne montrait pas explicitement comment définir la taille des images non carrées hors de la boîte, donc je l'ai modifiée pour un copier-coller facile:
L'enregistrement d'images sans bordure est facile quel que soit le dpi que vous choisissez si pixel_size / dpi = la taille est conservée.
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 l'épargne.
Donc pour
L'affichage devient bordé (mais la sauvegarde fonctionne):
la source
Tout d'abord, pour certains formats d'image (par exemple TIFF ), vous pouvez réellement enregistrer la palette de couleurs dans l'en-tête et la plupart des téléspectateurs afficheront vos données avec la palette de couleurs.
Pour enregistrer une
matplotlib
image réelle , qui peut être utile pour ajouter des annotations ou d'autres données aux images, j'ai utilisé la solution suivante:la source
Merci pour les réponses impressionnantes de tout le monde ... J'ai eu exactement le même problème avec le fait de vouloir tracer juste une image sans rembourrage / espace supplémentaire, etc., donc j'étais super heureux de trouver les idées de tout le monde ici.
Outre l'image sans remplissage, je voulais également pouvoir ajouter facilement des annotations, etc., au-delà d'un simple tracé d'image.
J'ai donc fini par combiner la réponse de David avec celle de csnemes pour créer un simple wrapper au moment de la création de la figure. Lorsque vous utilisez cela, vous n'avez besoin d'aucune modification plus tard avec imsave () ou autre chose:
la source