zoukankan      html  css  js  c++  java
  • 微信好友信息统计-图、词云和热图

    一、背景

        上一篇文章我们讲解了微信机器人,主要使用了wxpy这个库,如果还不会登录机器人的话可以可以快速浏览上一篇文章,微信聊天机器人-存储好友分享消息。这篇文章我们继续使用wxpy统计微信账号好友信息。主要包括:好友信息词云、好友所在省份分布、城市分布、好友性别和好友地理位置热力图等

    二、效果展示

    1、好友信息:男女比例柱状图、好友省份饼图、好友城市饼图

    2、好友个性签名词云

    3、好友所在位置热力图

    三、wordcloud

    wordcloud是生成词云的包,使用起来也是比较简单

    1、安装wordcloud包

    1 pip install wordcloud

    2、导入词云包

    1 from wordcloud import WordCloud, ImageColorGenerator

    3、构造WordCloud对象

     1 wc = WordCloud(
     2     background_color = p_background
     3     , max_words = p_max_words #显示最大词数
     4     , font_path = "msyh.ttf"
     5     , min_font_size = p_min_font_size
     6     , max_font_size = p_max_font_size
     7     , width = p_width  #图幅宽度
     8     , height = p_height
     9     , mask = cloud_mask 
    10     )

    4、生成词云结果

    1 result = wc.generate(cloud_text)

    5、保存词云结果为图片

    1 wordCloudFile = os.getcwd() + "\wordCloud.png"
    2 if os.path.exists(wordCloudFile) : 
    3     os.remove(wordCloudFile)
    4 result.to_file(wordCloudFile)

    四、jieba

    jieba是一个分词工具,可以把已知文本串进行分词,分词的结果是一个列表,wordcloud正好需要这么一个列表

    1、安装jieba包

    1 pip install jieba

    2、导入分词工具包

    1 import jieba

    3、添加建议词组,即不被分割的词组

    1 jieba.suggest_freq(('微博'), True)

    4、加载用户自定义词组

    1 jieba.load_userdict(os.getcwd() + "\jieba_user_dict.txt")

    5、分词

    1 segs = jieba.cut(text)

    五、matplotlib

    matplotlib是一个python图表包,包含各种图表控件,本文中主要使用了饼图和柱状图

    1、安装matplotlib

    1 pip install matplotlib

    2、导入图表控件

    1 import matplotlib.pyplot as plt

    3、构造一个figure对象

    1 fig = plt.figure(num = bot.self.name + u'的好友签名词云', figsize=(6.5, 6))

    4、添加plot

    1 plt.plot()
    2 plt.axis('off')
    3 plt.title(bot.self.name + u"的好友个性签名词云")
    4 plt.imshow(result)

    5、为了解决乱码问题,需要在构造figure前设置下编码

    1 plt.rcParams['font.sans-serif'] = ['SimHei']

    6、显示

    1 plt.show() 

    六、pyecharts

    pyecharts是热力图包,需要在浏览器中查看

    1、安装pyecharts包

    1 pip install pyecharts

    2、导入

    1 from pyecharts import Map, Page

    3、构造一个Map对象

    1 friends_map = Map("微信好友全国分布图", width = 1200, height=600)

    4、添加好友省份数据

     1 friends_map.add(
     2 ""
     3 , province_dict.keys()
     4 , province_dict.values()
     5 , is_label_show = True
     6 , is_visualmap = True
     7 , maptype='china'
     8 , visual_range = [0, max(province_dict.values())]
     9 , visual_text_color = 'red'
    10 , visual_range_text = ['', '']
    11 , visual_range_color = ['#FFFF00', '#D6292B'] # [黄,红]由低到高
    12 )

    5、渲染,会生成一个index.html文件在同目录下,使用浏览器打开即可

    6、如果发现地图上没有数据,需要下载地图数据包

    1 echarts-countries-pypkg 是全球国家地图,echarts-china-provinces-pypkg是中国省级地图, echarts-china-cities-pypkg是中国城市地图
    2 
    3 pip install echarts-countries-pypkg
    4 
    5 pip install echarts-china-provinces-pypkg
    6 
    7 pip install echarts-china-cities-pypkg

    七、关键步骤

    1、获取好友男女信息

     1 #获取好友性别、省份
     2 def generateInfo():
     3     male = female = other = 0
     4     for sex, count in friends_stat["sex"].items():
     5         # 1代表MALE, 2代表FEMALE
     6         if sex == 1:
     7             male = count
     8             print ("MALE %d" % count)
     9         elif sex == 2:
    10             female = count
    11             print ("FEMALE %d" % count)
    12         else :
    13             other = count
    14             print ("other %d" % count)
    15 
    16     total = male + female + other
    17     print ("男性朋友:%.2f%%" % (float(male) / total * 100))
    18     print ("女性朋友:%.2f%%" % (float(female) / total * 100))
    19     print ("其他:%.2f%%" % (float(other) / total * 100))

    2、好友省份

    1 province_dict = {}
    2 friend_privince = []
    3 for province, count in friends_stat["province"].items():
    4     if province != "":
    5         friend_privince.append([province, count])
    6         province_dict[province] = count

    3、好友城市

    1 friend_city = []
    2 for city, count in friends_stat["city"].items():
    3     if city != "":
    4         friend_city.append([city, count])

    4、签名数据清洗

    1 fs = bot.friends()
    2 for f in fs :
    3     pattern = re.compile(r'[一-龥]+')
    4     filterdata = re.findall(pattern, f.signature)
    5     text = text + ''.join(filterdata)

    八、打包成exe时遇到的问题

    1、jieba包在打包成exe,运行时可能会报找不到dict.txt文件,因此导入jieba包时执行以下代码,并将dict.txt文件拷贝到exe目录下

    1 import jieba
    2 jieba.set_dictionary(".dict.txt")
    3 jieba.initialize()

    或者看源码目录里的log.txt文件解决方案

    2、wordcloud打包时,也会遇到stopwords文件缺失,解决办法是修改源码

    wordcloud.py文件中30行代码修改

    to :STOPWORDS = set(map(str.strip, open(os.path.join(os.path.dirname(sys.executable), 'stopwords')).readlines()))

    from :STOPWORDS = set(map(str.strip, open(os.path.join(FILE, 'stopwords')).readlines()))

    打包完毕,开发时需要还原

    九、demo下载

    需要完整源码的可以下载:微信好友信息统计-图、词云和热图

    如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

     

      


    很重要--转载声明

    1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
    2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。 

  • 相关阅读:
    Oracle:SQL语句--对表的操作——删除表
    Oracle:SQL语句--对表的操作——修改表名
    Oracle:SQL语句--对表的操作——修改表名
    Oracle:SQL语句--对表的操作—— 删除字段(即删除列)
    网络配置4:vlan间通信配置
    网络配置3:动态路由配置
    网络配置2:静态路由配置
    网络配置0:网络设备基础知识
    网络配置1:VLAN配置
    T-SQL之数据操作(一):增删改
  • 原文地址:https://www.cnblogs.com/swarmbees/p/10000884.html
Copyright © 2011-2022 走看看