python + wordcloud实现任意形状标签云

公司最新App——AirOh已经上线三个多月,积累了首批原始用户。后台分别对用户和功能进行了统计分析,得到了丰富的数据结果。除了常规的表格、曲线、柱状图及污染热图等展示形式,亦对数据进行标签化处理,得到了非常有意思的展现形式。结果如下:

纯文字标签云

图片叠加效果标签云

从两张图的对比来看,标签云的效果比表格形象,用户更加容易理解,并带有一些小心思的创新。

目前,python + wordcloud实现标签云效果的教程很多,但由于机子的配置等一些问题,还是趟了一些坑,做下记录,供查询。

简要流程

系统配置:Ubuntu 14.04, Python 2.7
  • 安装python插件

    • sudo apt-get install python-tk

    注意:一定要提前安装该插件,不然会出现报错

    错误:wordcloud no display name and no $DISPLAY environment variable  

    主要原因是matplotlib插件中plt.imshow(wordcloud)中默认backend设置为Agg,而改GUI无法加载图片, 修改/etc/matplotlibrc

    backend      : TkAgg
    • sudo apt-get install python-numpy
    • sudo apt-get install python-matplotlib
  • 运行事例代码

    • 这里就不赘述,直接拷贝一段我试验过的一段代码
    from wordcloud import WordCloud
    import PIL
    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    ###
    
    Note:Following 3 lines are for the problem of Chinese Font display
    
    ###
    
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    
    def wordcloudplot(txt):
    
    
    ###
    
    Note:一定要加上以下三行代码。
    最早把这三行注释掉,ubuntu系统缺少matplotlib支持中文字体
    生成的标签云中文显示为口,查了很多材料,都没有明确说明这个问题
    最好加上这三行,或者自己添加为自己喜欢的字体!!!
    
    ###
    
        path='msyh.ttf'
        path=unicode(path, 'utf8').encode('gb18030')
        alice_mask = np.array(PIL.Image.open('air.jpg'))
        wordcloud = WordCloud(font_path=path,
                              background_color="white",
                              margin=5,
                              width=1800,
                              height=800,
                              mask=alice_mask,
                              max_words=2000,
                              max_font_size=60,
                              random_state=42)
        #wordcloud = wordcloud.generate(txt)
        wordcloud = wordcloud.fit_words(txt)
        wordcloud.to_file('output.png')
        plt.imshow(wordcloud)
        plt.axis("off")
        plt.show()
    
    def main():
        a=[]
        f=open(r'android.txt','r').readlines()
        for line in f:
            tempArr = line.strip()split("  ")
            tempArr[0] = tempArr[0].decode("utf-8")
            tempArr[1] = int(tempArr[1])
            a.append(tempArr)
        wordcloudplot(a)
    
    if __name__=='__main__':
        main()
    

    Note:
    wordcloud支持两种标签云生成方式,针对不同的txt格式,其中
    generate方法输入数据格式为字符串,直接输入文本流即可,实现原理可查看方法实现

    txt = open("test.txt",'r').readlines()

    fit_words方法输入数据,已经对数据进行了处理,比如格式为

    txt = [(u'空气龙',50000),(u'出行地图',4000),(u'社区PK',609029),...]

参考链接:

  1. 个人网站
  2. 【下载】msyh.tff
  3. https://www.zhihu.com/question/28975391

你可能感兴趣的:(工具,python,wordcloud,标签云)