1 初識Matplotlib
Matplotlib是一種可視化工具,可視化工具是數據挖掘中的關鍵輔助工具,可以清晰地將數據展現給我們,幫助我們調整分析方法。Matplotlib能夠將數據進行可視化,更加直觀的呈現給我們,使數據更加客觀、更具有說服力。
2 基礎圖形的繪製
matplotlib.pyplot模塊包含了一系列類似於matlab的畫圖函數,使用的時候只需要導入:import matplotlib.pyplot as plt
。
圖形回執流程:
- 創建畫布:
plt.figure()
- 繪製圖像:
plt.plot(x,y)
- 顯示圖像:
plt.show()
例1:展示上海一週的天氣溫度
參考代碼:
import matplotlib.pyplot as plt
# 創建畫布
plt.figure(figsize=(8,4),dpi=100)
# 繪製上海一週的天氣溫度折線圖
plt.plot([1,2,3,4,5,6,7],[11,13,15,17,8,4,3])
# 顯示圖像
plt.show()
繪製的效果圖:
例2:畫出某城市11點~12點這1小時內的每分鐘的溫度變化折線圖,溫度範圍在15~18度之間(某城市溫度變化圖)
參考代碼:
# 導入所需要模塊
import random,matplotlib.pyplot as plt
# 數據準備
x = range(60)
y = [random.uniform(15,18) for i in x]
# 創建畫布
plt.figure(figsize=(8,4),dpi=100)
# 繪製圖像
plt.plot(x,y)
# 展示圖像
plt.show()
繪製的效果圖:
例3:添加自定義x和y刻度
- x要顯示的刻度:
plt.xticks(x,**kwargs)
- y要顯示的刻度:
plt.xticks(y,**kwargs)
參考代碼:
# 導入模塊
import random
import matplotlib.pyplot as plt
# 數據準備
x = range(60)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=100)
# 繪圖圖像
plt.plot(x,y)
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::5],x_ticks_lable[::5]) # 座標的刻度不可以通過字符串刻度進行修改,注意先修改成數字,再用字符串進行替換
plt.yticks(y_ticks_lable[::5])
# 圖像顯示
plt.show()
繪製的效果圖:
matplotlib是支持中文的,只是在配置信息裏沒有中文字體的相關信息。所以,我們需要解決中文顯示的問題,解決方案1(這裏使用ubuntu linux平臺爲例):
# 下載simhei字體
thanlon@thanlon-master:~$ wget http://z1.zhaodll.com:81/font/s/simhei.ttf.zip
thanlon@thanlon-master:~$ unzip simhei.ttf.zip
# 將字體拷貝到/usr/share/fonts/目錄下
thanlon@thanlon-master:~$ sudo cp simhei.ttf /usr/share/fonts/
# 激活虛擬環境
thanlon@thanlon-master:~$ source PycharmProjects/venv/machine-learning/bin/activate
# 查看matplotlib配置文件的位置和配置文件的名稱
(machine-learning) thanlon@thanlon-master:~$ ipython
Python 3.7.5 (default, Nov 20 2019, 09:21:52)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.11.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import matplotlib as mpl
In [2]: mpl.get_configdir()
Out[2]: '/home/thanlon/.config/matplotlib'
In [3]: mpl.matplotlib_fname()
Out[3]: '/home/thanlon/.config/matplotlib/matplotlibrc'
In [4]:
# 創建配置文件
thanlon@thanlon-master:~$ vim .config/matplotlib/matplotlibrc
# 鍵入下面的內容,記得重啓電腦生效
thanlon@thanlon-master:~$ cat .config/matplotlib/matplotlibrc
font.family:sans-serif
font.sans-serif:SimHei
axes.unicode_minus:False
成功解決中文顯示問題:
解決方案2:
在Python腳本中動態設置matplotlibrc,可以避免由於改變配置帶來的問題。有時候,字體更改後會導致座標軸中的部分字符無法顯示,此時需要更改axes.unicode_minus參數:
# 導入模塊
import random
import matplotlib.pyplot as plt
from pylab import mpl
# 設置中文字體
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 設置正常顯示符號
mpl.rcParams['axes.unicode_minus'] = False
# 數據準備
x = range(60)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=100)
# 繪圖圖像
plt.plot(x,y)
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::5],x_ticks_lable[::5]) # 座標的刻度不可以通過字符串刻度進行修改
plt.yticks(y_ticks_lable[::5])
# 圖像顯示
plt.show()
例4:以網格的方式顯示
參考代碼:
# 導入模塊
import random
import matplotlib.pyplot as plt
# 數據準備
x = range(60)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=100)
# 繪圖圖像
plt.plot(x,y)
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::5],x_ticks_lable[::5]) # 座標的刻度不可以通過字符串刻度進行修改
plt.yticks(y_ticks_lable[::5])
plt.grid(True,linestyle = '--',alpha = 0.5) # True表示顯示;linestyle表示顯示的方式,如這裏的虛線;alpha表示圖形的透明度
# 圖像顯示
plt.show()
繪製的效果圖:
例5:添加描述信息,添加x和y軸以及標題的描述信息,設置圖像中字體的大小顯示
參考代碼:
# 導入模塊
import random
import matplotlib.pyplot as plt
# 數據準備
x = range(60)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=120)
# 繪圖圖像
plt.plot(x,y)
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::10],x_ticks_lable[::10]) # 座標的刻度不可以通過字符串刻度進行修改
plt.yticks(y_ticks_lable[::5])
plt.grid(True,linestyle = '--',alpha = 0.5) # True表示顯示;linestyle表示顯示的方式,如這裏的虛線;alpha表示圖形的透明度
plt.xlabel('時間',fontsize=10) # 設置x軸描述信息和字體大小
plt.ylabel('溫度',fontsize=10) # 設置y軸描述信息和字體大小
plt.title('中午12點整到13點整之間的溫度變化',fontsize=10) # 設置標題軸描述信息和字體大小
# 圖像顯示
plt.show()
繪製的效果圖:
例6:圖像保存
圖像保存使用到 plt.savefig('tmp.png')
,在使用plt.show()
顯示圖像後會figure資源,所以在顯示圖像之後保存圖像,就會保存一個空的圖像。所以,我們需要在顯示圖像之前保存圖像。
參考代碼:
# 導入模塊
import random
import matplotlib.pyplot as plt
# 數據準備
x = range(60)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=120)
# 繪圖圖像
plt.plot(x,y)
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::10],x_ticks_lable[::10]) # 座標的刻度不可以通過字符串刻度進行修改
plt.yticks(y_ticks_lable[::5])
plt.grid(True,linestyle = '--',alpha = 0.5) # True表示顯示;linestyle表示顯示的方式,如這裏的虛線;alpha表示圖形的透明度
plt.xlabel('時間',fontsize=10) # 設置x軸描述信息和字體大小
plt.ylabel('溫度',fontsize=10) # 設置y軸描述信息和字體大小
plt.title('中午12點整到13點整之間的溫度變化',fontsize=10) # 設置標題軸描述信息和字體大小
# 保存圖像
plt.savefig('/home/thanlon/tmp.png') # 保存到制定目錄
# 圖像顯示
plt.show()
繪製的效果圖與例5是一致的,這裏查看一下保存的圖像:
例7:在一個座標系中繪製多個圖像
參考代碼:
# 導入模塊
import random
import matplotlib.pyplot as plt
# 數據準備
x = range(50)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=120)
# 繪圖上海溫度的折線圖
plt.plot(x,y)
# 再增加一條北京的溫度的數據
y_shanghai = [random.uniform(20,30) for i in x]
# 繪製北京溫度的折線圖
plt.plot(x,y_shanghai) # r表示紅色,linestyle如果是空字符串,不會顯示圖像
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::10],x_ticks_lable[::10]) # 座標的刻度不可以通過字符串刻度進行修改
plt.yticks(y_ticks_lable[::5])
plt.grid(True,linestyle = '--',alpha = 0.5) # True表示顯示;linestyle表示顯示的方式,如這裏的虛線;alpha表示圖形的透明度
plt.xlabel('時間',fontsize=10) # 設置x軸描述信息和字體大小
plt.ylabel('溫度',fontsize=10) # 設置y軸描述信息和字體大小
plt.title('上海市和北京市中午12點到13點之間的溫度變化',fontsize=10) # 設置標題軸描述信息和字體大小
# 保存圖像
# plt.savefig('/home/thanlon/tmp.png') # 保存到指定目錄
# 圖像顯示
plt.show()
繪製的效果圖:
例8:在一個座標系中繪製多個圖像並設置圖像風格
顏色字符
:r表示紅色,g表示綠色,b表示藍色,w表示白色,c表示青色,m表示洋紅,y表示黃色,k表示黑色。
風格
:-
表示實線,- -
表示虛線,-.
表示點劃線,:
表示點虛線,''
表示留空、空格。
參考代碼:
# 導入模塊
import random
import matplotlib.pyplot as plt
# 數據準備
x = range(50)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=120)
# 繪圖上海溫度的折線圖
plt.plot(x,y)
# 再增加一條北京的溫度的數據
y_shanghai = [random.uniform(20,30) for i in x]
# 繪製北京溫度的折線圖
plt.plot(x,y_shanghai,linestyle=':',color='r') # r表示紅色,linestyle如果是空字符串,不會顯示圖像
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::10],x_ticks_lable[::10]) # 座標的刻度不可以通過字符串刻度進行修改
plt.yticks(y_ticks_lable[::5])
plt.grid(True,linestyle = '--',alpha = 0.5) # True表示顯示;linestyle表示顯示的方式,如這裏的虛線;alpha表示圖形的透明度
plt.xlabel('時間',fontsize=10) # 設置x軸描述信息和字體大小
plt.ylabel('溫度',fontsize=10) # 設置y軸描述信息和字體大小
plt.title('上海市和北京市中午12點到13點之間的溫度變化',fontsize=10) # 設置標題軸描述信息和字體大小
# 保存圖像
# plt.savefig('/home/thanlon/tmp.png') # 保存到指定目錄
# 圖像顯示
plt.show()
繪製的效果圖:
例9:在一個座標系中繪製多個圖像並添加圖例
位置的選擇:
位置字符串 | 位置代碼 |
---|---|
best | 0 |
upper right | 1 |
upter left | 2 |
lower left | 3 |
lower right | 4 |
right | 5 |
center left | 6 |
center right | 7 |
lower center | 8 |
upper center | 9 |
center | 10 |
參考代碼:
# 導入模塊
import random
import matplotlib.pyplot as plt
# 數據準備
x = range(45)
y = [random.uniform(15,18) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=120)
# 繪圖上海溫度的折線圖
plt.plot(x,y,label='上海')
# 再增加一條北京的溫度的數據
y_shanghai = [random.uniform(20,30) for i in x]
# 繪製北京溫度的折線圖
plt.plot(x,y_shanghai,linestyle=':',color='r',label='北京') # r表示紅色,linestyle如果是空字符串,不會顯示圖像
# 構造x軸刻度標籤
x_ticks_lable = ['12點{}分'.format(i) for i in x]
# 構造y軸刻度標籤
y_ticks_lable = x
# 修改x,y軸座標的刻度顯示
plt.xticks(x[::10],x_ticks_lable[::10]) # 座標的刻度不可以通過字符串刻度進行修改
plt.yticks(y_ticks_lable[::5])
plt.grid(True,linestyle = '--',alpha = 0.5) # True表示顯示;linestyle表示顯示的方式,如這裏的虛線;alpha表示圖形的透明度
plt.xlabel('時間',fontsize=10) # 設置x軸描述信息和字體大小
plt.ylabel('溫度',fontsize=10) # 設置y軸描述信息和字體大小
plt.title('上海市和北京市中午12點到13點之間的溫度變化',fontsize=10) # 設置標題軸描述信息和字體大小
# 顯示圖例
plt.legend(loc='best') # 自動選擇最好的位置顯示
# 保存圖像
# plt.savefig('/home/thanlon/tmp.png') # 保存到指定目錄
# 圖像顯示
plt.show()
繪製的效果圖:
例 10:在多個座標系中繪製多個圖像
參考代碼:
# 導入模塊
import matplotlib.pyplot as plt
import random
# 準備數據
x = range(45)
y_shanghai = [random.uniform(15,20) for i in x]
y_beijing = [random.uniform(20,30) for i in x]
# 創建畫布
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(16,5),dpi=100)
# 繪製圖像
axes[0].plot(x,y_shanghai,label = '上海')
axes[1].plot(x,y_beijing,label='北京',color='r',linestyle='--')
# 添加x與y軸的刻度
x_ticks_label = ['12點{}分'.format(i) for i in x]
axes[0].set_xticks(x[::5])
axes[0].set_yticks(x[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(x[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
# 添加網格顯示
axes[0].grid(True,linestyle='--',alpha=0.5)
axes[1].grid(True,linestyle='--',alpha=0.5)
# 顯示圖例
axes[0].legend(loc=0)
axes[1].legend(loc=0)
# 添加描述信息
axes[0].set_xlabel('時間')
axes[0].set_ylabel('溫度')
axes[0].set_title('中午12點到13點上海的溫度變化圖',fontsize = 15)
axes[1].set_xlabel('時間')
axes[1].set_ylabel('溫度')
axes[1].set_title('中午12點到13點北京的溫度變化圖',fontsize = 15)
# 圖像保存
plt.savefig('/home/thanlon/tmp.png')
# 顯示圖像
plt.show()
繪製的效果圖:
3 常見圖形的繪製
Matplotlib能夠繪製折線圖、散點圖、柱狀圖、直方圖、餅圖。在選擇以何種方式展示數據時,我們需要明確各種統計圖的意義。
折線圖:以折線的上升或下降來表示統計數量的增減變化的統計圖。特點是能夠顯示數據的變化趨勢,反應事物的變化情況。使用的的方法是:matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
。
參考代碼:
# 導入相關模塊
import matplotlib.pyplot as plt
import random
# 準備數據
x = range(9)
y = [random.randint(0,9) for i in x]
# 繪製畫布
plt.figure(figsize=(8,4),dpi=100)
# 添加x,y刻度的顯示
plt.xticks(x[::1])
plt.yticks(x[::1])
# 繪製圖像
plt.plot(x,y)
# 添加網格顯示
plt.grid(True,linestyle='--',alpha=0.5)
# 圖像保存
plt.savefig('/home/thanlon/tmp.png')
# 圖像顯示
plt.show()
折線圖的效果圖:
散點圖:用兩組數據構成多個座標點,考察座標點的分佈,判斷了兩變量之間是否存在某種關聯,以及總結座標點的分佈模式。使用到的方法是:matplotlib.pyplot. scatter ( x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs )
。
參考代碼:
# 導入相關模塊
import matplotlib.pyplot as plt
import random
# 準備數據
x = range(40)
y = [random.randint(1,49) for i in x]
# 繪製畫布
plt.figure(figsize=(10,4),dpi=100)
# 添加x,y軸刻度的顯示
plt.xticks(x[::1])
plt.yticks(range(50)[::5])
# 設置圖像的標題
plt.title('常見圖像的之散點圖的繪製')
# 繪製圖像
plt.scatter(x,y)
# 圖像的顯示
plt.show()
散點圖的效果圖:
柱狀圖:排列在工作表的列或行中的數據可以繪製到柱狀圖中,特點是很容易看出數據的大小,適用於統計和對比數據。使用的方法是:matplotlib.pyplot. bar ( left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs )
。
參考代碼:
import matplotlib.pyplot as plt
# 數據的準備
x_movie_names = ['唐人街探案3', '姜子牙', '囧媽', '中國女排', '緊急救援', '熊出沒·狂野大陸', '急先鋒', '我在時間盡頭等你', '妙先生', '抵達之謎']
x = range(len(x_movie_names))
y = [722193, 357767, 246846, 169509, 168038, 93609, 84625, 32234, 29082, 22227]
# 繪製畫布
plt.figure(figsize = (15, 5), dpi = 100)
# 繪製圖像
plt.bar(x, y, color = ['b', 'r' , 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g'], width=0.6)
# 添加x,y刻度的顯示
# plt.xticks(x[::1], x_movie_names[::1])
plt.xticks(x, x_movie_names)
# 設置標題
plt.title('貓眼電影最受期待榜榜單', fontsize = 15)
# 添加網格
plt.grid(True, linestyle='--', alpha=0.5)
# 圖像的顯示
plt.show()
柱狀圖的效果圖:
餅圖:用於表示不同分類的佔比情況,通過弧度大小來對比各種分類。使用函數是:matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None))
。
參考代碼:
import matplotlib.pyplot as plt
# 繪製畫布
plt.figure(figsize=(4,4), dpi=100)
# 繪製圖像
plt.pie([1, 2, 3, 10, 6, 7], labels=['娛樂', '育兒', '飲食', '房貸', '交通', '其它'], colors=['b', 'r' , 'g', 'y', 'c', 'm'], explode=[0, 0, 0, 0.1, 0, 0], autopct='%1.1f%%', shadow=False, startangle=10)
# 設置標題
plt.title("2020年2月份家庭支出")
# 圖像顯示
plt.show()
餅圖的效果圖: