python折線圖的繪製方法(python之折線圖繪製體驗)
2023-05-02 22:37:33 1
python折線圖的繪製方法? 上一篇「python之初體驗」中我們主要是實現了抓取csdn本人博客列表頁面的每一篇博客的閱讀數量和標題功能,後來就想我們是有了數量和title,可是我還想要是知道我的每篇閱讀數量和日期之間的關係就好了,以及每篇博客的閱讀趨勢,說到關係和趨勢可能再多的語言都顯得蒼白無力,所以圖表可能是最好的一種表現形式,今天要實現的功能就是在python中通過繪製折線圖來表明日期和閱讀數量的關係,我來為大家講解一下關於python折線圖的繪製方法?跟著小編一起來看一看吧!

python折線圖的繪製方法
上一篇「python之初體驗」中我們主要是實現了抓取csdn本人博客列表頁面的每一篇博客的閱讀數量和標題功能,後來就想我們是有了數量和title,可是我還想要是知道我的每篇閱讀數量和日期之間的關係就好了,以及每篇博客的閱讀趨勢,說到關係和趨勢可能再多的語言都顯得蒼白無力,所以圖表可能是最好的一種表現形式,今天要實現的功能就是在python中通過繪製折線圖來表明日期和閱讀數量的關係。
當然代碼是可以復用的,之前的爬取代碼我們直接拿過來用就好了,本質上是只需要將我們爬取的數據展示在折線圖上面就好了,python中畫圖常用的就是matplotlib了,當然這個屬於第三方模塊,需要安裝,如果不安裝直接導包是會失敗的,當然安裝就很簡單了,這裡就不多介紹了。下面是我們代碼的完整實例。
[python] view plain copy
#!usr/bin/python
# -*- coding: utf-8 -*-
'''''
使用python爬取csdn個人博客的訪問量,並用折線圖展示出來時間和閱讀數目的關係
'''
import urllib2
import re
from bs4 import BeautifulSoup;
#當前的博客列表頁號
from http import ResponseUtils
# 導入畫圖需要的庫
from pylab import *
page_num = 1
notLast = 1;
# account = str(raw_input('輸入csdn的登錄帳號:'))
account = 'submit66'
allTitleList = [];
allViewList = [];
while notLast:
#首頁地址
baseUrl = 'http://blog.csdn.net/' account
#連接頁號,組成爬取的頁面網址
myUrl = baseUrl '/article/list/' str(page_num)
#偽裝成瀏覽器訪問,直接訪問的話csdn會拒絕
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
#構造請求
req = urllib2.Request(myUrl, headers=headers);
#訪問頁面
myResponse = urllib2.urlopen(req)
myPage = ResponseUtils.OutResponse.getResponse(myResponse);
#在頁面中查找是否存在『尾頁』這一個標籤來判斷是否為最後一頁,如果沒有則代表是最後一頁了
pattern = re.compile('尾頁');
notLast = pattern.findall(myPage, re.S);
soup = BeautifulSoup(myPage, 'lxml');
# 使用beautifulsoup來解析html
titleList = soup.find_all('span', class_='link_postdate');
# 使用beautifulsoup來解析html
viewList = soup.find_all('span', class_='link_view');
allTitleList.extend(titleList);
allViewList.extend(viewList);
#頁號加1
page_num = page_num 1;
# ----------------循環結束渠道數據,下面是為了繪圖準備數據,並且對數據做加工-----------------
# 將數據結果順序反轉,因為之前是倒序排列,我們需要的時間是從前到後的
allTitleList.reverse;
allViewList.reverse;
# 聲明兩個數組,存儲的即為x、y軸的值
xValues = [];
yValues = [];
# 通過循環給存儲x和y軸坐標值的list賦值
for n in range(len(allViewList)):
xvalue = allViewList[n].contents[1].encode('utf-8'); # 取出閱讀數量數據
yvalue = allTitleList[n].get_text.encode('utf-8'); # 取出閱讀日期數據
yValues.append(xvalue[1:len(xvalue)-1]) # 因為去除的閱讀數是帶的,所以我們需要截取,對於字符串的截取就相當於截取數組
xValues.append(yvalue) # 將閱讀數量放在list中
# 列印輸出我們的數據
print'閱讀數量:%s 日期:%s' % (yValues[n], xValues[n]);
# --------------下面是開始繪圖部分--------------
# 這行代碼是設置中文字體可以展示,否則將會報錯
mpl.rcParams['font.sans-serif'] = ['SimHei']
x = range(len(xValues))
plt.plot(x, yValues, marker='o', mec='r', mfc='w', label=u'x時間和y閱讀數關係折線圖')
plt.legend # 讓圖例生效
# 可以看到x和y 設置的方式是不同的,因為x軸可能只是一個名稱,一個分類,而不是一個具體的數值,所以通過這種方式來做了,而對於y則是要具體展示的數值
plt.xticks(x, xValues, rotation=45) # 這裡的rotation,當名稱展示時候,一個傾斜的角度,當文案很長時候特別好用
plt.margins(0) # 這個不設置的話,折線的開始和結束出會有間距
plt.subplots_adjust(bottom=0.27) # 設置折線圖和底部區域的距離
plt.xlabel(u"time(s)閱讀日期") #X軸標籤
plt.ylabel(u"閱讀數量(次)") #Y軸標籤
plt.title(u"閱讀數量趨勢圖") #標題
# 展示圖表對話框
plt.show
其實,上面的代碼寫的還是蠻清楚的,相比之前的代碼,就是需要導入pylab模塊,裡面自然是包含了matplotlib的了,之前代碼還是爬取的,一變的是之前我們抓取的是閱讀數量和博客title,現在是閱讀數量和每篇博客創建時間,二是將閱讀數量和閱讀日期分別放在了list中方便下面使用。然後第二部分就是將數據做整合,即為繪圖準備x和y軸的值,兩者均放在一個list裡面,兩個list的數量是一致的,否則是會報錯的。第三部分則是繪圖部分,首先是設置了繪圖可以正確展示中文,其次是將x和y軸的數據給了繪圖實例,然後讓繪圖實例生效,因為我們的x軸只是一個名稱展示,這裡即為日期展示,所以不能像y軸那樣子直接把值塞進去,所以下面調用了xticks方法進行了特殊處理,下面又設置了x和y軸標籤,即x和y軸分別代表什麼了。最後就是我們的圖表的show(秀)啦。讓我們看看最終效果圖吧:
嗯,看起來貌似還不錯,不過最近的閱讀數量有點低呀,尷尬啦。有人會問上面的xticks方法的rotation是幹嘛的,就是讓我們的x軸數值逆時針旋轉45度呀,你看我們的x軸的每個數值都那麼長,如果不旋轉肯定覆蓋了呀,還有subplots_adjust這個方法是設置繪圖區域和上下左右之間的距離的,特別是底部的,如果不設置的話,那麼長的文案是會被下面的菜單欄覆蓋的哦,然後我們再說說plot這個方法的幾個參數的意思,前兩個就是x和y軸的數據了,第三個就是設置上圖的紅圈即為標記點了,第四個參數是設置標記點的顏色,上面r代表紅色,你換成g就是綠色了,如果不設置的話,默認是藍色。第五個參數就是設置標記點是否是實心,如果mfc不設置的話就是實心的,最後一個參數就是折線圖的實例和說明了。
,