1. 程式人生 > >爬蟲入門之繪圖matplotlib與詞雲(七)

爬蟲入門之繪圖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 繪製智聯招聘職位崗位數量圖

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)提出。“詞雲”就是對網路文字中出現頻率較高的“關鍵詞”予以視覺上的突出,形成“關鍵詞雲層”或“關鍵詞渲染”,從而過濾掉大量的文字資訊,使瀏覽網頁者只要一眼掃過文字就可以領略文字的主旨。

  • 詞頻
  • 分詞 語句切割
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崗位需求詞雲
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)