Máscaras en Wordcloud
En este artículo veremos como aplicar máscaras a nuestras nubes de palabras generadas con la librería de Python Wordcloud para obtener diferentes formas. También veremos cómo modificar los colores de las palabras y cómo utilizar los colores de las imágenes.
Máscaras
Las máscaras son imágenes que se usan como patrón para la ubicación de las diferentes palabras de la nube. Para aplicar una máscara se utilizará las librerías Pillow y Numpy. La imagen se abre utilizando el método open
de Image
y la información resultante se convierte en un arreglo utilizando Numpy. De esta manera la imagen es convertida en una lista de valores correspondientes a los píxeles de la imagen.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
mask = np.array(Image.open("corazon.png"))
texto=open ("martinfierro.txt").read()
nube = WordCloud(mask = mask).generate(texto)
plt.imshow(nube,interpolation='bilinear')
plt.axis("off")
plt.show()
El resultado es una nube de palabras donde las palabras son ubicadas en las posiciones donde la imagen no tiene contenido ignorando las zonas blancas de la imagen.
Es importante resaltar que si la imagen tiene un fondo transparente la máscara o se aplicará correctamente. En ese caso será necesario convertir el fondo a blanco.
Mapas de colores
Los mapas de colores permiten seleccionar los posibles colores que tendrán las palabras de la nube. Esto permite que la figura resultante sea más similar al objeto que se utiliza como máscara. Se utiliza el atributo colormap y alguno de los valores disponibles en Matplotlib.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
mask = np.array(Image.open("puzzle.png"))
texto=open ("martinfierro.txt").read()
nube = WordCloud(mask = mask, colormap="binary").generate(texto)
plt.imshow(nube,interpolation='bilinear')
plt.axis("off")
plt.show()
Contorno
Es posible dibujar un contorno a una máscara utilizando el parámetro contour_color
de la clase WordCloud
para definir el color y contour_width
para definir el ancho de la linea.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
mask = np.array(Image.open("puzzle.png"))
texto=open ("martinfierro.txt").read()
nube = WordCloud(mask = mask, contour_width=1, contour_color='grey', colormap="binary").generate(texto)
plt.imshow(nube,interpolation='bilinear')
plt.axis("off")
plt.show()
Máscaras con colores
Si se selecciona una imagen con colores sencillos y planos es posible solicitar a WordCloud que utilice estos colores a través del generador de colores. El primer paso es crear un generador de colores a partir de la máscara con la clase ImageColorGenerator
. Una vez creada la nube se la colorea con la función recolor
pasando el valor generado en el atributo color_func
.
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
mask = np.array(Image.open("bandera-argentina.png"))
texto=open ("martinfierro.txt").read()
nube = WordCloud(mask = mask).generate(texto)
image_colors = ImageColorGenerator(mask)
nube.recolor(color_func=image_colors)
plt.figure(figsize=(10, 10))
plt.imshow(nube, interpolation="bilinear")
plt.axis("off")
plt.show()
En el caso que la máscara aplicada a la nube no muestre la imagen de manera clara es posible ajustar el tamaño de la fuente para generar bordes más definidos utilizando el parámetro max_font_size
.
Cuanto más pequeña es la fuente máxima más definida estará la imagen pero también se perderá la relación de tamaño de la palabra con la frecuencia del texto.
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
mask = np.array(Image.open("tree.png"))
texto=open ("martinfierro.txt").read()
nube = WordCloud(max_words=2000,
mask=mask, max_font_size=5, relative_scaling=0).generate(texto)
image_colors = ImageColorGenerator(mask)
nube.recolor(color_func=image_colors)
plt.figure(figsize=(10, 10))
plt.imshow(nube, interpolation="bilinear")
plt.axis("off")
plt.show()
En este artículo hemos visto como utilizar imágenes para dar forma o color a nuestras nubes de palabras generadas con WordCloud. Espero que les sirva!