• 爬虫之绘图matplotlib与词云(七)


    1 绘制条形图

    import matplotlib  # 数据可视化
    from matplotlib import pyplot as plt
    
    # 配置字体
    matplotlib.rcParams["font.sans-serif"] = ["simhei"]  # 黑体
    matplotlib.rcParams["font.family"] = "sans-serif"
    '''
    left, x轴
    height, y轴
    width=0.8 ,轴宽
    '''
    # .bar(x轴, y轴, label=u"标签名", color="颜色")
    plt.bar([1], [123], label="广州", color="r")
    plt.bar([2], [141], label=u"北京")
    plt.bar([3], [11], label=u"上海")
    plt.bar([4], [41], label=u"深圳")
    plt.bar([5], [181], label=u"香港")
    plt.legend()  # 绘图
    # plt.show()
    plt.savefig("1.jpg")  # 保存图片
    

    2 绘制智联招聘职位岗位数量图

    python
    import urllib.request
    import urllib.parse
    import re
    import matplotlib
    import matplotlib.pyplot as plt  # 数据可视化
    
    matplotlib.rcParams["font.sans-serif"] = ["simhei"]  # 配置字体
    matplotlib.rcParams["font.family"] = "sans-serif"
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
    
    def getnumberbyname(searchname):
        searchname = {"kw": searchname}
        searchname = urllib.parse.urlencode(searchname)
        url = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E6%B7%B1%E5%9C%B3&" + searchname + "&p=1&isadv=0"
        print(url, '==========')
        req = urllib.request.Request(url, headers=header)
        pagesource = urllib.request.urlopen(req).read().decode('utf-8', 'ignore')
        restr = "<em>(\d+)</em>"  # 正则表达式,()只要括号内的数据
        regex = re.compile(restr, re.IGNORECASE)
        mylist = regex.findall(pagesource)
        return mylist[0]
    # 岗位列表
    pythonlist = ["python", "python 运维", "python 测试", "python 数据", "python web"]
    num = 0
    for pystr in pythonlist:
        num += 1
        print(pystr, eval(getnumberbyname(pystr)))
        # 绘制柱状图
        plt.bar([num], eval(getnumberbyname(pystr)), label=pystr)
    
    plt.legend()  # 绘制
    plt.show()  # 显示
    

    3 词云

    “词云”这个概念由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)提出。“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。

    • 词频
    • 分词 语句切割
    python
    import jieba
    mystr = "小姐姐,我看你挺能睡的,睡我还不好"
    
    wordsplitList = jieba.cut(mystr, cut_all=True) # 切割, 全部切割
    print(wordsplitList) # 返回一个生成器对象
    print('/'.join(wordsplitList))
    wordsplitListforSearch = jieba.cut_for_search(mystr) # 按搜索方式切割
    print(wordsplitListforSearch)
    
    print('/'.join(wordsplitListforSearch))
    - 制作python岗位需求词云
    python
    import wordcloud  导入词云
    from wordcloud import STOPWORDS  # 停止词
    import jieba
    import numpy as np  # 科学计算
    import matplotlib  # 数据可视化
    from matplotlib import pyplot as plt
    from PIL import Image  # 图片处理
    

    读取文本

    pythonInfo = open('pythonworkinfo.txt', 'r', encoding='utf-8', errors='ignore').read()
    print(pythonInfo)
    

    切割

    pythonCut = jieba.cut(pythonInfo, cut_all=True)
    pythonInfoList = ' '.join(pythonCut)  # 返回一个生成器对象
    print(pythonInfoList)
    backgroud = np.array(Image.open('pig.jpg'))  # 将图片格式化成RBG数组
    myCloudword = wordcloud.WordCloud(font_path='simkai.ttf',  # 字体路径
                                      width=400, height=200,
                                      mask=backgroud,  # 字体颜色
                                      scale=1,  # 比例
                                      max_words=200,  # 最大字数
                                      min_font_size=4,  # 最小字体
                                      stopwords=STOPWORDS,  # 默认停止词
                                      random_state=50,  # 随机角度
                                      background_color='black',  # 背景颜色
                                      max_font_size=100  # 最大字体
                                      ).generate(pythonInfoList)
    #plt.imshow(myCloudword)
    #plt.show()  图片展示
    plt.figimage(mywordCloud)   #绘制图片
    plt.imsave('python.png',mywordCloud)  #保存图片
    

    精简生成词云

    import matplotlib.pyplot as plt
    from wordcloud import WordCloud
    import jieba
    
    text_from_file_with_apath = open('pythonworkinfo.txt',encoding='utf-8',errors='ignore').read()
    print(text_from_file_with_apath)
    wordlist_after_jieba = jieba.cut(text_from_file_with_apath, cut_all=True)
    
    wl_space_split = " ".join(wordlist_after_jieba)
    my_wordcloud = WordCloud().generate(wl_space_split)
    
    plt.imshow(my_wordcloud)
    plt.axis("off")
    plt.show()
    
    #注:碰到utf-8的编码问题时候,可以去源码wordcloud.py文件中新增路径,前提下好中文字体库simkai.ttf
    FONT_PATH = os.environ.get("FONT_PATH", os.path.join(os.path.dirname(__file__), "simkai.ttf"))
    覆盖掉默认的DroidSansMono.ttf
    

    4 Matplotlib 绘图

    1 多个subplot

    # subplot.py
     
    import matplotlib.pyplot as plt
    import numpy as np
     
    data = np.arange(100, 201)
    plt.subplot(2, 1, 1)
    plt.plot(data)
     
    data2 = np.arange(200, 301)
    plt.subplot(2, 1, 2)
    plt.plot(data2)
     
    plt.show()
    

    2 线形图

    # plot.py
    import matplotlib.pyplot as plt
     
    plt.plot([1, 2, 3], [3, 6, 9], '-r')
    plt.plot([1, 2, 3], [2, 4, 9], ':g')
     
    plt.show()
    

    这段代码说明如下:

    1. plot函数的第一个数组是横轴的值,第二个数组是纵轴的值,所以它们一个是直线,一个是折线;
    2. 最后一个参数是由两个字符构成的,分别是线条的样式和颜色。前者是红色的直线,后者是绿色的点线。

    3 散点图

    # scatter.py
     
    import matplotlib.pyplot as plt
    import numpy as np 
    N = 20
    plt.scatter(np.random.rand(N) * 100,
                np.random.rand(N) * 100,
                c='r', s=100, alpha=0.5)
     
    plt.scatter(np.random.rand(N) * 100,
                np.random.rand(N) * 100,
                c='g', s=200, alpha=0.5)
     
    plt.scatter(np.random.rand(N) * 100,
                np.random.rand(N) * 100,
                c='b', s=300, alpha=0.5)
    plt.show()
    

    这段代码说明如下:

    1. 这幅图包含了三组数据,每组数据都包含了20个随机坐标的位置
    2. 参数c表示点的颜色,s是点的大小,alpha是透明度

    4 饼状图

    # pie.py
    import matplotlib.pyplot as plt
    import numpy as np
     
    labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    data = np.random.rand(7) * 100
     
    plt.pie(data, labels=labels, autopct='%1.1f%%')
    plt.axis('equal')
    plt.legend()
     
    plt.show()
    

    这段代码说明如下:

    1. data是一组包含7个数据的随机数值
    2. 图中的标签通过labels来指定
    3. autopct指定了数值的精度格式
    4. plt.axis('equal')设置了坐标轴大小一致
    5. plt.legend()指明要绘制图例(见下图的右上角)

    5 条形图

    # bar.py
     
    import matplotlib.pyplot as plt
    import numpy as np
    N = 7
    x = np.arange(N)
    data = np.random.randint(low=0, high=100, size=N)
    colors = np.random.rand(N * 3).reshape(N, -1)
    labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
     
    plt.title("Weekday Data")
    plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels)
    plt.show()
    

    这段代码说明如下:

    1. 这幅图展示了一组包含7个随机数值的结果,每个数值是[0, 100]的随机数
    2. 它们的颜色也是通过随机数生成的。np.random.rand(N * 3).reshape(N, -1)表示先生成21(N x 3)个随机数,然后将它们组装成7行,那么每行就是三个数,这对应了颜色的三个组成部分。如果不理解这行代码,请先学习一下Python 机器学习库 NumPy 教程
    3. title指定了图形的标题,labels指定了标签,alpha是透明度

    6 直方图

    # hist.py
     
    import matplotlib.pyplot as plt
    import numpy as np
     
    data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
    labels = ['3K', '4K', '5K']
    bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000]
     
    plt.hist(data, bins=bins, label=labels)
    plt.legend()
     
    plt.show()
    

    上面这段代码中,[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]生成了包含了三个数组的数组,这其中:

    • 第一个数组包含了3000个随机数,这些随机数的范围是 [0, 3000)
    • 第二个数组包含了4000个随机数,这些随机数的范围是 [0, 4000)
    • 第三个数组包含了5000个随机数,这些随机数的范围是 [0, 5000)
  • 相关阅读:
    《中小学生Python编程入门指南》1.1 什么是编程
    《中小学生Python编程入门指南》前言
    简单的番茄工作法倒计时(源码)
    关于AE
    Blender2.5快捷键
    关于Blender
    随意设置控件每一个角的倒角
    关于多个block问题
    UICollectionViewCell--查找cell上的按钮点击后,对应的是哪个cell
    UIMenuItem
  • 原文地址:https://www.cnblogs.com/why957/p/9246247.html
Copyright © 2020-2023  润新知