Máscaras en Wordcloud

Publicado por Andrea Navarro en

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.

Máscara corazón
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.

Resultado máscara corazon

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()
Resultado máscara puzzle

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.

Máscara puzzle con contorno
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

Máscara bandera argentina

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.

Resultado máscara bandera argentina
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.

Máscara árbol
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()

Resultados máscaras árbol

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!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora