web-dev-qa-db-fra.com

Augmentez la résolution avec Word-cloud et supprimez la bordure vide

J'utilise Word cloud avec certains fichiers txt. Comment changer cet exemple si je voulais 1) augmenter la résolution et 2) supprimer la bordure vide.

#!/usr/bin/env python2
"""
Minimal Example
===============
Generating a square wordcloud from the US constitution using default arguments.
"""

from os import path
import matplotlib.pyplot as plt
from wordcloud import WordCloud

d = path.dirname(__file__)

# Read the whole text.
text = open(path.join(d, 'constitution.txt')).read()
wordcloud = WordCloud().generate(text)
# Open a plot of the generated image.
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
25
Bobo

Vous ne pouvez pas augmenter la résolution de l'image dans plt.show() car cela est déterminé par votre écran, mais vous pouvez augmenter la taille. Cela lui permet de redimensionner, de zoomer, etc. sans flou. Pour ce faire, passez les dimensions à WordCloud, par exemple.

wordcloud = WordCloud(width=800, height=400).generate(text)

Cependant, cela ne fait que déterminer la taille de l'image créée par WordCloud. Lorsque vous affichez cela à l'aide de matplotlib, il est mis à l'échelle à la taille du canevas du tracé, qui est (par défaut) d'environ 800 x 600 et vous perdez à nouveau la qualité. Pour résoudre ce problème, vous devez spécifier la taille de la figure avant d'appeler imshow, par exemple.

plt.figure( figsize=(20,10) )
plt.imshow(wordcloud)

Ce faisant, je peux créer avec succès un nuage de mots haute résolution 2000x1000.

Pour votre deuxième question (suppression de la bordure), nous pourrions d'abord définir la bordure sur noir, donc c'est moins évident, par exemple.

plt.figure( figsize=(20,10), facecolor='k' )

Vous pouvez également réduire la taille de la bordure en utilisant tight_layout, par exemple.

plt.tight_layout(pad=0)

Le code final:

# Read the whole text.
text = open(path.join(d, 'constitution.txt')).read()
wordcloud = WordCloud(width=1600, height=800).generate(text)
# Open a plot of the generated image.

plt.figure( figsize=(20,10), facecolor='k')
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

En remplaçant les deux dernières lignes par ce qui suit, vous pouvez obtenir la sortie finale indiquée ci-dessous:

plt.savefig('wordcloud.png', facecolor='k', bbox_inches='tight')

final Constitution wordcloud

59
mfitzp

Si vous essayez d'utiliser une image comme masque, assurez-vous d'utiliser une grande image pour obtenir une meilleure qualité d'image. J'ai passé des heures à comprendre cela.

Voici un exemple d'extrait de code que j'ai utilisé

mask = np.array(Image.open('path_to_your_image'))
image_colors = ImageColorGenerator(mask)
wordcloud = WordCloud(width=1600, height=800, background_color="rgba(255, 255, 255, 0)", mask=mask
                     ,color_func = image_colors).generate_from_frequencies(x)

# Display the generated image:
plt.figure( figsize=(20,10) )
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
2
Silver

C'est très simple, plt.tight_layout(pad=0) fait le travail, réduit l'espace en arrière-plan, en supprimant le rembourrage en excès.

0
Naved Ahmad