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

来源:互联网 发布:java手机短信接口 编辑:程序博客网 时间:2024/05/22 05:25

公司最新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 WordCloudimport PILimport matplotlibimport matplotlib.pyplot as pltimport numpy as np###Note:Following 3 lines are for the problem of Chinese Font display###from pylab import mplmpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falsedef 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
1 0
原创粉丝点击