Wordcloud слова не подходят для маскировки
Я пытаюсь создать облако слов из кадра данных, где есть столбец слов и столбец для их соответствующих частот. Я также скачал изображение, которое хочу использовать в качестве маски, например: облачное изображение
Я не могу заставить облако слов соответствовать маске - несмотря на то, что следую приведенным примерам. Вот мой код:
from PIL import Image
import pandas as pd
import numpy as np
from wordcloud import WordCloud
import matplotlib.pyplot as plt
df = pd.DataFrame({'word':['time', 'car', 'Peter\'s', 'sky',
'something', 'computer', 'brain', 'plants',
'trees', 'Alien\'s', 'gun', 'eat'],
'freq':[24, 16, 16, 15,
14, 13, 12, 10,
9, 9, 5, 3]})
words = ' '.join(df['word'])
cloud_image = r"C:\Users\L\Documents\Python Scripts\cloud.png"
mask = np.array(Image.open(cloud_image))
wordcloud = WordCloud(max_words=2000,
width=1280,
height=720,
mask=mask)
wordcloud.generate_from_frequencies()
fig, ax = plt.subplots(figsize=(8, 6))
ax.imshow(wordcloud, interpolation='bilinear')
ax.axis("off")
ax.imshow(mask, interpolation='bilinear')
plt.show()
3 ответа
Я знаю, что это старый вопрос, но я провел последний час, пытаясь заставить конкретное изображение работать как маску. Основная проблема, с которой я столкнулся, заключалась в том, что изображение, которое я хотел использовать в качестве маски для моего wordcloud, не имело белого (RGB 255,255,255) фона. Решение, к которому я пришел:
- Если у вашего изображения есть четкий фон, используйте любой онлайн-инструмент, чтобы удалить цвет фона с вашего изображения. Я использовал сайт под названием "Background Burner", который сделал фон моего изображения прозрачным. Однако (как я выяснил) wordcloud python рассматривает прозрачный фон как черный.
- С изображением без фона используйте любой онлайн-инструмент, чтобы изменить фон (который, вероятно, будет прозрачным) на белый. Я использовал сайт под названием LunaPic, чтобы изменить свои изображения.
В результате вы получите исходное изображение с белым фоном (RGB 255,255,255). Теперь маска wordcloud будет обрабатывать ваше изображение так, как вы ожидали!
Некоторые изображения должны быть скорректированы для процесса. Обратите внимание, что только значения белой точки для изображения — это mask_out (остальные значения — mask_in). Проблема в том, что некоторые изображения не подходят для маскирования. Причина в том, что np.array цвета несколько не соответствует. Чтобы решить эту проблему, можно сделать следующее:1.Создание объекта маски: (Пожалуйста, попробуйте со своим собственным изображением, так как я не смог загрузить :)
import numpy as np;
import pandas as pd;
from PIL import Image;
from wordcloud import WordCloud
mask = np.array(Image.open("filepath/picture.png"))
print(mask)
Если выходные значения для белого np.array равны 255, то все в порядке. Но если это 0 или, возможно, другое значение, мы должны изменить это на 255.
2.В случае других значений код изменения значений:2-1. Создадим функцию для преобразования (здесь наше значение = 0)
def transform_zeros(val):
if val == 0:
return 255
else:
return val
2-2. Создание такой же формы np.array:
maskable_image = np.ndarray((mask.shape[0],mask.shape[1]), np.int32)
2-3. Трансформация:
for i in range(len(mask)):
maskable_image[i] = list(map(transform_zeros, mask[i]))
3.Проверка:
print(maskable_image)
Затем вы можете использовать этот массив для своей маски.
mask = maskable_image
Все это скопировано и интерпретировано из этой ссылки, поэтому проверьте ее, если вы найдете мое объяснение неясным, так как я только что предоставил решение, но не так много понимаю в цветовых массивах изображения и его преобразовании.
Как оказалось, это была просто проблема с размером / типом изображения. Это работало с другим изображением маски (хотя ранее я безуспешно пробовал два изображения, отсюда и пост).