数据可视化之【词云图】与【网络图】

👨‍🎓 作者简介:大家好,我是可可卷,欢迎大家关注,一起学习交流 ~
📜主攻领域:【python算法】【数据分析】【数学建模】【机器学习】【深度学习】【数据可视化】
📖个人主页:可可卷的博客

网络图

networkx是Python的一个包,用于构建和操作复杂的图结构、动态和功能,提供分析图的算法。

使用NetworkX,您可以以标准和非标准数据格式加载和存储网络,生成多种类型的随机和经典网络,分析网络结构,构建网络模型,设计新的网络算法,绘制网络,等等。

安装依赖

import networkx as nx
import matplotlib.pyplot as plt

绘图

   names = {}  # 人物出现次数
   relationships = {}  # 关系字典
#绘图部分
G = nx.Graph()
for name, times in names.items():
    if times>=3:
        G.add_node(name)

for name, edges in relationships.items():
    for v, w in edges.items():
        if w > 3:
            G.add_edge(name,v,weight=w)

pos = nx.shell_layout(G)
nx.draw_networkx_edges(G, pos, width=[float(d['weight']/10) for (u, v, d) in G.edges(data=True)])
nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos, labels=None, font_size=12, font_color='k', font_family='YouYuan',font_weight='normal')
plt.show()

效果

0902-1

中文词云图

词云图的制作主要使用wordcloud库
官方文档:https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html

安装依赖

import imageio
import jieba
from wordcloud import WordCloud

利用jieba统计词频

def word_count(filename):
    with open(filename, 'r', encoding='utf-8')as f:
        s = f.read()
        words = jieba.cut(s, cut_all=False)
        word_dict = {}
        word_list = ''
        for word in words:
            if (len(word) > 1):
                word_list = word_list + ' ' + word
                if (word_dict.get(word)):
                    word_dict[word] = word_dict[word] + 1
                else:
                    word_dict[word] = 1
        return word_dict

停用词处理

def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords

......
for word in words:
	if (len(word) > 1) and if word not in stopwords:
......

生成词云图

需要注意的是,为了能够正常显示中文字体,需要配置simsun.ttc字体文件

更多字体可于本地C:\Windows\Fonts文件夹中寻找

def wordcloud_pic(filename):
    result=word_count(filename)
    Pic = imageio.imread('duck.png')    #蒙版图片
    w = WordCloud(width=1000, height=700, background_color='white', mask=Pic, scale=15,font_path='simsun.ttc')
    w.generate_from_frequencies(result)
    filename = 'wordcloud.png'
    w.to_file(filename)

样例

以一只特立独行的猪为例,演示词云图效果

蒙版图片duck.png:点击获取

文本:
一只特立独行的猪

插队的时候,我喂过猪,也放过牛。假如没有人来管,这两种动物也完全知道该怎样生活。它们会自由自在地闲逛,饥则食渴则饮,春天来临时还要谈谈爱情;这样一来,它们的生活层次很低,完全乏善可陈。人来了以后,给它们的生活做出了安排:每一头牛和每一口猪的生活都有了主题。就它们中的大多数而言,这种生活主题是很悲惨的:前者的主题是干活,后者的主题是长肉。我不认为这有什么可抱怨的,因为我当时的生活也不见得丰富了多少,除了八个样板戏,也没有什么消遣。有极少数的猪和牛,它们的生活另有安排。以猪为例,种猪和母猪除了吃,还有别的事可干。就我所见,它们对这些安排也不大喜欢。种猪的任务是交配,换言之,我们的政策准许它当个花花公子。但是疲惫的种猪往往摆出一种肉猪(肉猪是阉过的)才有的正人君子架势,死活不肯跳到母猪背上去。母猪的任务是生崽儿,但有些母猪却要把猪崽儿吃掉。总的来说,人的安排使猪痛苦不堪。但它们还是接受了:猪总是猪啊。
对生活做种种设置是人特有的品性。不光是设置动物,也设置自己。我们知道,在古希腊有个斯巴达,那里的生活被设置得了无生趣,其目的就是要使男人成为亡命战士,使女人成为生育机器,前者像些斗鸡,后者像些母猪。这两类动物是很特别的,但我以为,它们肯定不喜欢自己的生活。但不喜欢又能怎么样?人也好,动物也罢,都很难改变自己的命运。
以下谈到的一只猪有些与众不同。我喂猪时,它已经有四五岁了,从名分上说,它是肉猪,但长得又黑又瘦,两眼炯炯有光。这家伙像山羊一样敏捷,一米高的猪栏一跳就过;它还能跳上猪圈的房顶,这一点又像是猫——所以它总是到处游逛,根本就不在圈里待着。所有喂过猪的知青都把它当宠儿来对待,它也是我的宠儿——因为它只对知青好,容许他们走到三米之内,要是别的人,它早就跑了。它是公的,原本该劁掉。不过你去试试看,哪怕你把劁猪刀藏在身后,它也能嗅出来,朝你瞪大眼睛,嗷嗷地吼起来。我总是用细米糠熬的粥喂它,等它吃够了以后,才把糠兑到野草里喂别的猪。其他猪看了嫉妒,一起嚷起来。这时候整个猪场一片鬼哭狼嚎,但我和它都不在乎。吃饱了以后,它就跳上房顶去晒太阳,或者模仿各种声音。它会学汽车响、拖拉机响,学得都很像;有时整天不见踪影,我估计它到附近的村寨里找母猪去了。我们这里也有母猪,都关在圈里,被过度的生育搞得走了形,又脏又臭,它对它们不感兴趣;村寨里的母猪好看一些。它有很多精彩的事迹,但我喂猪的时间短,知道得有限,索性就不写了。总而言之,所有喂过猪的知青都喜欢它,喜欢它特立独行的派头儿,还说它活得潇洒。但老乡们就不这么浪漫,他们说,这猪不正经。领导则痛恨它,这一点以后还要谈到。我对它则不止是喜欢——我尊敬它,常常不顾自己虚长十几岁这一现实,把它叫做“猪兄”。如前所述,这位猪兄会模仿各种声音。我想它也学过人说话,但没有学会——假如学会了,我们就可以做倾心之谈。但这不能怪它。人和猪的音色差得太远了。
后来,猪兄学会了汽笛叫,这个本领给它招来了麻烦。我们那里有座糖厂,中午要鸣一次汽笛,让工人换班。我们队下地干活时,听见这次汽笛响就收工回来。我的猪兄每天上午十点钟总要跳到房上学汽笛,地里的人听见它叫就回来——这可比糖厂鸣笛早了一个半小时。坦白地说,这不能全怪猪兄,它毕竟不是锅炉,叫起来和汽笛还有些区别,但老乡们却硬说听不出来。领导上因此开了一个会,把它定成了破坏春耕的坏分子,要对它采取专政手段——会议的精神我已经知道了,但我不为它担忧——因为假如专政是指绳索和杀猪刀的话,那是一点门都没有的。以前的领导也不是没试过,一百人也逮不住它。狗也没用:猪兄跑起来像颗鱼雷,能把狗撞出一丈开外。谁知这回是动了真格的,指导员带了二十几个人,手拿五四式手枪;副指导员带了十几人,手持看青的火枪,分两路在猪场外的空地上兜捕它。这就使我陷入了内心的矛盾:按我和它的交情,我该舞起两把杀猪刀冲出去,和它并肩战斗,但我又觉得这样做太过惊世骇俗——它毕竟是只猪啊;还有一个理由,我不敢对抗领导,我怀疑这才是问题之所在。总之,我在一边看着。猪兄的镇定使我佩服之极:它很冷静地躲在手枪和火枪的连线之内,任凭人喊狗咬,不离那条线。这样,拿手枪的人开火就会把拿火枪的打死,反之亦然;两头同时开火,两头都会被打死。至于它,因为目标小,多半没事。就这样连兜了几个圈子,它找到了一个空子,一头撞出去了,跑得潇洒至极。以后我在甘蔗地里还见过它一次,它长出了獠牙,还认识我,但已不容我走近了。这种冷淡使我痛心,但我也赞成它对心怀叵测的人保持距离。
我已经四十岁了,除了这只猪,还没见过谁敢于如此无视对生活的设置。相反,我倒见过很多想要设置别人生活的人,还有对被设置的生活安之若素的人。因为这个缘故,我一直怀念这只特立独行的猪。

效果

0901-1

英文词云图

和中文不同的地方在于,英文单词不能直接用jieba分词统计词频

因此我们选用字典树(Trie)进行英文单词的词频统计

统计词频

# 前缀树节点
class TrieNode:

    def __init__(self):
        self.word = False   # 遍历到次节点时是否是完整的单词
        self.child = {}     # 子节点字典 [字符:节点]
        self.count = 0      # 到此是完整单词的次数


# 前缀树生成并统计
class Trie:

    def __init__(self):
        self.root = TrieNode()
        self.stat = {}

    def Insert(self, word):
        cur = self.root

        for w in word:
            if w not in cur.child:
                cur.child[w] = TrieNode()
            cur = cur.child[w]

        if not cur.word:
            cur.count = 1
            cur.word = True
        else:
            cur.count += 1

        self.stat[word] = cur.count

    def Trie_output(self):
        return self.stat
    
    def Trie_input(self, text_src):
        fo = open(text_src, "r")
        text = fo.read()
        
        text = text.lower()
        for ch in text:
            if not ch.islower():
                text = text.replace(ch,' ')
        wordList = text.split()

        for word in wordList:
            self.Insert(word)
        
        fo.close()


# 统计字符串文本中各单词(不区分大小写)出现的次数
# 使用前缀树实现,统计信息以[单词:频数]的字典进行保存
# 时间复杂度为 O(n*m) 其中n为单词数,m为单词的平均长度

def Trie_word_count(text_src):
    t = Trie()
    t.Trie_input(text_src)
    return t.Trie_output()


# print(Trie_word_count("./essay_text.txt"))

(Trie代码来源:我的队友lzx同学)

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可可卷

不要看到我~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值