Python数据可视化:WordCloud入门

WordCloud是一种很好的展现数据的方式,网上也有不少小工具和在线网页。
但是有些不支持中文,有些安装复杂,所以决定用Python实现。
主要参考官网,通过官网的例子,讲一下WordCloud的制作。

主要流程

  • 获取内容的路径
    • 如果是一段文字,系统自动算频次
    • 你也可以直接导入统计好的频次
  • 设置字体
    • 一般字体路径在C:\Windows\Fonts,你可以选自己喜欢的中文或者英文字体
  • 切割中文字符
    • 英文字符就不用切割了
  • 输入WordCloud的参数
    • 背景色
    • 字号
    • 生成的形状
    • 颜色
    • 字体大小
    • 字体旋转等等
  • 生成WordCloud
  • 用matplotlib显示图片

效果图

安装库

老规矩,首先,你要安装库。
最基本的两个:

pip install wordcloud  #这是WordCloud的库
pip install matplotlib #显示图像

一个单词构造WordCloud

在这个代码中,我们需要安装一个numpy
(大部分小伙伴应该都装过,就不用再装了)

pip install numpy  

这里用这个库,主要是想用数学坐标生成一个简单的背景图案,比如圆形、方形

基本步骤
1、输入单词
2、用numpy 生成一个形状,下面生成了一个圆形mask
3、输入WordCloud的参数(包括背景色、是否重复、图案形状)
4、用matplotlib显示图片

import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud

text = "square" #输入你要的单词

x, y = np.ogrid[:300, :300]  #快速产生一对数组

# 产生一个以(150,150)为圆心,半径为130的圆形mask
mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2 #此时mask是bool型
mask = 255 * mask.astype(int)  #变量类型转换为int型

wc = WordCloud(
        background_color="white",  #背景颜色为“白色”
        repeat=True, #单词可以重复
        mask=mask  #指定形状,就是刚刚生成的圆形
        )
wc.generate(text)  #从文本生成wordcloud

plt.axis("off")  #把作图的坐标轴关掉
plt.imshow(wc, interpolation="bilinear")
plt.show()

生成WordCloud

最简单的生成方式,文本内容都是英文,直接用系统默认的形状(一个长方形)
我这边是导入了一个商务英语的txt,所以可以看到,出现次数最多的单词是company,然后是business、new、work等单词,我还看到了money,哈哈~

基本步骤
1、获取内容txt的路径
2、输入WordCloud的参数(包括背景色、字号等)
3、生成WordCloud
4、用matplotlib显示图片

*WordCloud有很多参数,如果你不写,都是默认的。比如背景色默认黑色。

import os
from os import path
from wordcloud import WordCloud
from matplotlib import pyplot as plt

# 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
# 获取文本txt的路径(txt和代码在一个路径下面)
text = open(path.join(d,'BusinessEnglish.txt')).read()

# 生成词云
wc = WordCloud(
        scale=2,
        max_font_size=100,  #最大字号
        background_color='white'  #设置背景颜色
        )

wc.generate(text)  # 从文本生成wordcloud
# wc.generate_from_text(text)  #用这种表达方式也可以  

# 显示图像
plt.imshow(wc,interpolation='bilinear')
plt.axis('off')
plt.tight_layout()

wc.to_file('标签云效果图.png')  # 储存图像
#plt.savefig('标签云效果图.png',dpi=200)  #用这个可以指定像素
plt.show()

设置WordCloud形状

都是长方形、圆形、正方形这种,好像不够炫酷
为了炫酷,我们可以给它设置不同的形状,比如云朵、爱心等等
下面我们用Alice的小裙子做个实例
这个图片长这样


我们生成的图片是这样的,可以看到,完整保留了上图的轮廓


基本步骤
和之前基本都是一致的,就是多了一步,导入指定图片,获取图片轮廓
1、获取内容txt的路径
2、输入WordCloud的参数(包括背景色、字号等),指定了生成的形状
3、生成WordCloud
4、用matplotlib显示图片

*代码中增加了一个stopwords,有些你觉得没意义的单词,不想显示在图片上,你就可以放在这里

from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os

from wordcloud import WordCloud, STOPWORDS

# 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()

# 获取文本txt的路径(txt和代码在一个路径下面)
text = open(path.join(d, 'BusinessEnglish.txt')).read()

# 读取mask的图像(图像和代码在一个路径下面)
alice_mask = np.array(Image.open(path.join(d, "alice_mask.png")))

# 设置不显示单词,比如said、in、on、is这种单词
stopwords = set(STOPWORDS)
stopwords.add("said")

# 设置词云参数
wc = WordCloud(background_color="white", 
               max_words=2000, 
               mask=alice_mask,
               stopwords=stopwords, 
               contour_width=3,  #设置轮廓宽度
               contour_color='steelblue')  #设置轮廓颜色

# 从文本生成wordcloud
wc.generate(text)

# 保存到文件
wc.to_file(path.join(d, "alice.png"))

# 显示图片
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")

plt.figure()  #新建一个图片,把mask也显示出来
plt.imshow(alice_mask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")

plt.show()

根据图片调整颜色

原图是这样的

如果我们直接根据上一步,获取图片轮廓,可以得到下图

我们进一步,根据原图,调整颜色

其实就是获取了图片颜色,也是一行代码

image_colors = ImageColorGenerator(alice_coloring)

完整代码

from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

# 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()

# 获取文本txt的路径(txt和代码在一个路径下面)
text = open(path.join(d, 'BusinessEnglish.txt')).read()

# 读取我要的图片文件
alice_coloring = np.array(Image.open(path.join(d, "alice_color.png")))

# 设置不显示的单词
stopwords = set(STOPWORDS)
stopwords.add("said")

# 设置词云参数
wc = WordCloud(background_color="white", 
               max_words=2000, 
               mask=alice_coloring,
               stopwords=stopwords, 
               max_font_size=40, 
               random_state=42)

# 从文本生成wordcloud
wc.generate(text)

# 根据图片,创建颜色
image_colors = ImageColorGenerator(alice_coloring)

# 把图片分成3份
fig, axes = plt.subplots(1, 3)

axes[0].imshow(wc, interpolation="bilinear")
# recolor wordcloud and show
# we could also give color_func=image_colors directly in the constructor
axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
axes[2].imshow(alice_coloring, cmap=plt.cm.gray, interpolation="bilinear")
for ax in axes:
    ax.set_axis_off()

# 单独显示图片    

# plt.figure()    
# plt.imshow(wc, interpolation="bilinear")
# plt.axis("off")

# plt.figure()    
# plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
# plt.axis("off")

# plt.figure()    
# plt.imshow(alice_coloring, cmap=plt.cm.gray, interpolation="bilinear")
# plt.axis("off")
    
plt.show()

用频率绘制WordCloud

上面是直接把一个txt输进去,系统自动给你算出现次数的
但是实际过程中,我们有时候,是知道单词出现次数的,我们就想根据已知的次数显示

这一步,其实就改了一行代码,
原来是这样的

wc.generate(text) 
# 这里的text是一段文字

现在是这样的

wc.generate_from_frequencies(text) 
# 这里的text是一个字典
#  'ken': 1, 'was': 47, 'hot': 2, 'water': 2

如果你已经有一个字典,直接代进去就好了
这里给大家详细看一下,如果假设我没有这个字典
我还是一段文字,我想先生成这个字典,再代入进去

这里,你需要安装一个库multidict,创建一键多值字典

pip install multidict

multidict这个库,我可以把文本变成一个字典

通过上图就可以看到,这个字典有1105个组合,每一个单词,都统计了出现次数

import multidict as multidict

import numpy as np

import os
import re
from PIL import Image
from os import path
from wordcloud import WordCloud
import matplotlib.pyplot as plt


def getFrequencyDictForText(sentence):
    fullTermsDict = multidict.MultiDict()
    tmpDict = {}

    # making dict for counting frequencies
    for text in sentence.split(" "):
        if re.match("a|the|an|the|to|in|for|of|or|by|with|is|on|that|be", text):
            continue
        val = tmpDict.get(text, 0)
        tmpDict[text.lower()] = val + 1
    for key in tmpDict:
        fullTermsDict.add(key, tmpDict[key])
    return fullTermsDict


def makeImage(text):
    alice_mask = np.array(Image.open("alice_mask.png"))

    wc = WordCloud(
            background_color="white",
                   max_words=1000, 
                   mask=alice_mask
                   )
    # generate word cloud
    wc.generate_from_frequencies(text)

    # show
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    wc.to_file('frequency.png')  # 储存图像
    plt.show()


# 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
# 获取文本txt的路径(txt和代码在一个路径下面)
text = open(path.join(d, 'BusinessEnglish.txt'), encoding='utf-8')
text = text.read()
makeImage(getFrequencyDictForText(text))

生成中英文WordCloud

生成一个中英文混搭的WordCloud
如果你的txt全是中文,那就是全中文的

基本步骤
和之前基本也都一样,就是中文字符,需要增加一个中文词语切割
这就需要添加一个库

pip install jieba  # 中文切割

1、获取内容txt的路径
2、设置字体
3、切割中文字符
4、输入WordCloud的参数(包括背景色、字号等),指定了生成的形状
5、生成WordCloud
6、用matplotlib显示图片

import os
from os import path
from wordcloud import WordCloud
from matplotlib import pyplot as plt

import jieba

# 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
# 获取文本txt
text = open(path.join(d,'商务英语.txt'),encoding='utf-8').read()
# 设置中文字体
font_path = 'C:\Windows\Fonts\simfang.ttf'  # 字体路径
# 精确切割中文字符
text = ' '.join(jieba.cut(text, cut_all = False))

# 生成词云
wc = WordCloud(
        font_path = font_path,  #字体路径
        scale=2,
        max_words = 100, #最多词个数
        max_font_size=100,  #最大字号
        background_color='white'  #背景色
        )
wc.generate(text)
# 显示图像
plt.imshow(wc,interpolation='bilinear')
plt.axis('off')
plt.tight_layout()
# 储存图像
#wc.to_file('标签云效果图.png')
#plt.savefig('标签云效果图.png',dpi=200)
plt.show()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 使用wordcloud制作精美词云图 一个简单的开始 安装库   wordcloud用来绘制词云图,是今天的主角。...
    lifanxin阅读 6,015评论 0 8
  • 智能决策上手系列教程索引 我们使用已经合并在一起的拉勾网数百个职位招聘详情文件来进行这个练习。百度云下载文件 密码...
    zhyuzh3d阅读 13,119评论 2 21
  • 一、今日功课 种下慷慨财富的种子,100元以下的产品不打价。发红包给不熟悉的人或者同事,回向自己将来能够财富自由。...
    郝丽2018阅读 287评论 0 3
  • 在这个世界,我们每一个人都是孤独而又带着束缚,活的不那么佛系,也不那么世俗。有许多人像我,可那都不是我,他们似好似...
    花兮木婲土阅读 689评论 0 0
  • 那时候你来了整个世界都在欢呼天空之城是那么的蓝一切都像是为你的彩排现在你走了整个世界都昏暗着天空之城下起了细雨一切...
    紫雯阁阅读 458评论 0 1