WordCloud
La función WordCloud
de la librería wordcloud
permite crear nubes de palabras en Python. Esta función proporciona varios métodos, pero generate
es el que necesitas para crear un a word cloud a partir de un texto. Ten en cuenta que el tamaño de la imagen será 400x200 por defecto, pero puedes personalizar el tamaño con los argumentos width
(ancho) y height
(alto), como en en el ejemplo siguiente, o reescalando la imagen con el argumento scale
que por defecto es 1 y se recomienda para nubes de palabras muy grandes.
Cabe mencionar que si quieres que en la nube aparezcan palabras repetidas puedes establecer repeat = True
. Esto es muy útil para crear word clouds con una sola palabra o con textos muy pequeños.
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"
wc = WordCloud(width = 300, height = 300).generate(texto)
# Eliminar los ejes y mostrar los datos como imagen
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Color de fondo
El argumento background_color
permite modificar el color de fondo negro que aparece por defecto al crear un word cloud.
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"
wc = WordCloud(width = 300, height = 300, background_color = "white")
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Paleta de colores
Utilizando colormap
puedes personalizar la paleta de colores utilizada para colorear cada palabra. Estos colores se seleccionan de manera aleatoria de la paleta de colores (por defecto "viridis"
).
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"
wc = WordCloud(width = 300, height = 300, background_color = "white",
colormap = "magma")
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Tamaño de la fuente
La función WordCloud
proporciona los argumentos min_font_size
(por defecto: 4) y max_font_size
(por defecto: None
) que son los tamaños de letra más pequeños y más grandes a ser usados en el word cloud.
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"
wc = WordCloud(width = 300, height = 300,
max_font_size = 20, min_font_size = 10)
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Número máximo de palabras
Por defecto, el word cloud intentará mostrar hasta 200 palabras, pero puedes reducir o incrementar el número de palabras con max_words
. En el ejemplo siguiente limitamos a cinco el número máximo de palabras.
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"
wc = WordCloud(width = 300, height = 300,
max_words = 5)
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Palabras irrelevantes
Si tu texto contiene palabras que te gustaría descartar de la nube de palabras puedes pasarlas en una lista al argumento stopwords
. Por defecto, la función tiene en cuenta una lista predefinida de palabras que se descartan (probablemente solo palabras en inglés).
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat"
wc = WordCloud(width = 300, height = 300,
stopwords = ["Lorem", "ipsum", "ut"])
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Incluir números
Los word clouds de Python no incluyen números por defecto, pero puedes agregarlos con include_numbers = True
si tu texto contiene números y quieres que se muestren.
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Texto de muestra con algunos números: 1, 2, 3, 1, 14, 15, 14"
wc = WordCloud(width = 300, height = 300, include_numbers = True)
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Puedes modificar la forma de un word cloud en base a una forma (círculo, triángulo) y en base a una imagen con mask
. Ten en cuenta que si mask
no es None
, entonces width
y height
se ignorarán. En el ejemplo siguiente vamos a crear un círculo y utilizarlo para crear una nube de puntos con forma circular.
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Python Charts"
# Cículo
x, y = np.ogrid[:300, :300]
mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)
wc = WordCloud(background_color = "white", repeat = True, mask = mask)
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
# plt.show()
Forma de una imagen
También puedes cargar una imagen y usarla para generar una forma. En este escenario, todas las zonas que no sean blancas (#FFFFFF) se utilizarán para crear la forma de la nube de palabras. Para los dos ejemplos siguientes utilizaremos esta imagen.
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from PIL import Image
from io import BytesIO
import requests
texto = "Python Charts"
# Desde una URL
response = requests.get("https://raw.githubusercontent.com/R-CoderDotCom/samples/main/wordcloud-mask.jpg")
mask = np.array(Image.open(BytesIO(response.content)))
# Desde una archivo local
# mask = np.array(Image.open("file_name.png"))
wc = WordCloud(background_color = "white", repeat = True, mask = mask)
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
plt.show()
Color a partir de una imagen
Es posible utilizar los colores de la imagen para generar los colores del word cloud. Tendrás que generar los colores de la imagen con ImageColorGenerator
y utilizar la función recolor
, como en el ejemplo siguiente.
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
from io import BytesIO
import requests
texto = "Python Charts"
# Desde una URL
response = requests.get("https://365psd.com/images/istock/previews/1004/100424327-vector-cloud-icon.jpg")
mask = np.array(Image.open(BytesIO(response.content)))
# Colores
image_colors = ImageColorGenerator(mask)
wc = WordCloud(background_color = "white", repeat = True, mask = mask)
wc.generate(texto)
plt.axis("off")
plt.imshow(wc.recolor(color_func=image_colors), interpolation = "bilinear")
plt.show()
Grosor y color del borde o contorno
Por último, si usas una forma puedes agregar un borde a dicha forma con contour_width
. Además, el color del contorno se puede personalizar con contour_color
.
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud
texto = "Python Charts"
# Círculo
x, y = np.ogrid[:300, :300]
mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)
wc = WordCloud(height = 500, width = 500, background_color = "white",
repeat = True, mask = mask,
contour_width = 3, contour_color = "black")
wc.generate(texto)
plt.axis("off")
plt.imshow(wc, interpolation = "bilinear")
plt.show()
También te puede interesar