前言
今天帮一个妹妹用python绘制词云图的时候遇到了点麻烦,主要是这部分代码之前学过,好久不用了需要现学现卖,过程中遇到的问题记录如下。
源码和结果
首先给出整个源码
import matplotlib.pyplot as plt
import numpy as np
import PIL.Image as Image
from wordcloud import WordCloud, ImageColorGenerator
word_dict = {
'价值易变性': 100,
'确权难': 80,
'共享性': 75,
'可交易性': 75,
'1+1>2': 65,
'成本递减': 65,
'经济价值性': 50,
'可计量': 50,
'合法性': 50,
'安全成本高': 50,
'时效性': 50
}
mask_img = np.array(Image.open("cloud2.jpg"))
# mask = np.array(Image.open('aaa(1).png'))
# image_colors = ImageColorGenerator(mask) # 从图片提取色
wordcloud = WordCloud(
font_path='simsun.ttc', # 设置字体
max_words=1000, # 词云显示的最大词数
mask=mask_img, # 设置背景图片
background_color='white', # 背景颜色
# color_func=image_colors,
colormap='seismic'
# color_func=lambda *args, **kwargs: "rgb(176, 56, 56)"
).generate_from_frequencies(word_dict)
plt.imshow(wordcloud)
plt.axis("off")
plt.savefig("./word_cloud.png")
plt.show()
词云图
问题
1 知道词语和词频怎么绘制
之前只是遇到过给一段文字,然后根据词语的出现次数进行绘制词云图,这里数据变了,我们知道了词汇以及其对应的词频,该如何绘制图像。
WordCloud除了可以接收string之外,还能接收字典类型,所以这里理所当然就应该把数据集设置成字典形式。
word_dict = {
'价值易变性': 100,
'确权难': 80,
'共享性': 75,
'可交易性': 75,
'1+1>2': 65,
'成本递减': 65,
'经济价值性': 50,
'可计量': 50,
'合法性': 50,
'安全成本高': 50,
'时效性': 50
}
然后使用WordCloud的时候是要用…generate_from_frequencies(word_dict)而不再用generate()
wordcloud = WordCloud(
font_path='simsun.ttc', # 设置字体
max_words=1000, # 词云显示的最大词数
mask=mask_img, # 设置背景图片
background_color='white', # 背景颜色
colormap='seismic' # 字体颜色
).generate_from_frequencies(word_dict)
2 如何自定义词云形状
首先需要一张你喜欢的形状的图片,然后通过Image的open读取它,接着转换成array的形式,最后在WordCloud的参数列表中设置mask为我们自定义图像即可(见源码)
3 如何自定义图中文字的颜色
一是可以通过WordCloud的参数colormap设置相关的配色,比如
colormap='seismic'
二是可以通过参数color_func自己写一个匿名函数返回一个指定rgb颜色,比如
color_func=lambda *args, **kwargs: "rgb(176, 56, 56)"
三是我们可以自己找一张带有各种配色的图片,然后通过ImageColorGenerator提取其中的配色,图片例如
然后使用参数color_func接收,代码如下,使用ImageColorGenerator之前需要导库
# img = np.array(Image.open('aaa(1).png'))
# image_colors = ImageColorGenerator(img) # 从图片提取色
color_func=image_colors