文章目錄
Matplotlib
Matplotlib介紹
- Matplotlib專門用於開發2D圖表(也支持3D圖表),是一個畫二維圖表的python庫
- Matplotlib以漸進、交互方式實現數據可視化,使用起來簡單
爲什麼要學習Matplotlib
- Matplotlib能將數據進行可視化,更直觀的呈現,幫助理解數據,方便選擇更合適的分析方法
- Matplotlib使數據更加客觀,更具有說服力
Matplotlib簡單實例
畫一條簡單直線
修改點的座標即可畫出折線圖
Matplotlib圖像結構
Matplotlib三層結構
容器層
容器層主要由Canvas(畫板)、Figure(畫布)、Axes(圖表)組成。
- Canvas位於最底層的系統層,在繪圖的過程中充當畫板的角色,即放置畫布的工具,通常情況下,我們並不需要對Canvas特別的聲明,當我們需要在其他模塊調用Matplotlib模塊繪圖時,就需要聲明Canvas,相當於我們在自家畫畫不用強調畫板,出去寫真時卻需要帶一塊畫板
- Figure是Canvas上方的第一層,也是需要用戶來操作的第一層,在繪圖的過程中充當畫布的角色。當我們對Figure大小、背景色彩進行設置的時候,就相當於選擇畫布大小、材質的過程。因此,每當我們繪圖時,寫的第一行就是創建Figure的代碼。
- Axes是應用層的第二層,在繪圖的過程中相當於畫布上的繪圖區角色。一個Figure對象可以包含多個Axes對象,每個Axes都是一個獨立的座標系,繪圖過程中的所有圖像都是基於座標系繪製的。
輔助顯示層
輔助顯示層爲Axes內除根據數據畫出的圖像以外的內容,主要包括外觀(facecolor)、邊框線(spines)、座標軸(axis)、座標軸名稱(axis label)、座標軸刻度(tick)、座標軸刻度標籤(tick label)、網格線(grid)、圖例(legend)、標題(title)等。
該層的作用可使圖像更加直觀、更加容易理解,但對圖像沒有實質性的影響
圖像層
圖像層指的Axes內通過plot(折線圖)、hist(柱狀圖)、contour(輪廓圖)、bar(柱狀圖)、barbs、pie(餅圖)等函數繪製出的圖像。
總結
- Canvas(畫板)位於最底層,用戶一般接觸不到
- Figure(畫布)建立在Canvas之上
- Axes(繪圖區)建立在Figure之上
- 座標軸(axis)、圖例(legend)等輔助顯示層及圖像層都是建立在Axes之上
實例
定義多個figure畫多個圖像
在一個figure中畫多個圖像
折線圖與基礎繪圖功能
matplotlib.pyplot包含了一系列類似於matlab的畫圖函數,作用於當前圖形(figure)的當前座標系(axes)
折線圖繪製與保存圖片
- 繪製一個簡單的折線圖
- 設置畫布屬性與圖片保存
設置圖片的大小與清晰度
- plt.figure(figsize(a,b),dpi=)
- figsize 設置圖形的大小,a 爲圖形的寬, b 爲圖形的高,單位爲英寸
- dpi 爲設置圖形每英寸的點數
- 該函數返回一個figure對象
保存圖片
- plt.savefig(路徑與名字)
注意 plt.show()會釋放figure資源,如果在顯示圖像之後保存圖片只能保存空圖片
設置x、y軸
- plt.xlim(*args,**kwargs)
- 設置x軸顯示的刻度範圍
- plt.ylim(*args,**kwargs)
- 設置y軸顯示的刻度範圍
- plt.xticks(x,**kwargs)
- x : 要顯示的新刻度值
- plt.yticks(y,**kwargs)
- y : 要顯示的新刻度值
- y : 要顯示的新刻度值
中文亂碼問題
本意是顯示0點,1點等,亂碼就顯示如下
下載中文字體(黑體,看準系統版本)
- 下載SimHei字體(其他支持中文顯示的字體也行)
- 安裝字體
-
windows和mac中,雙擊安裝
-
linux中,拷貝字體到/usr/share/fonts下
sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
- 刪除matplotlib緩存字體
- Mac
- 刪除~/.matplotlib中的緩存文件
cd ~/.matplotlib rm -r *
- 刪除~/.matplotlib中的緩存文件
- Linux
- 刪除~/.cache/matplotlib中的緩存文件
cd ~/.cache/matplotlib rm -r *
- 刪除~/.cache/matplotlib中的緩存文件
- 修改配置文件matplotlibrc
- Mac
- 修改配置文件matplotlibrc
vi ~/.matplotlib/matplotlibrc
- 將文件內容修改爲
font.family : sans-serif font.sans-serif : SimHei axes.unicode : False
- Linux
- 修改配置文件matplotlibrc
sudo find -name matplotlibrc
- 返回結果
./.virtualenvs/ai/lib/python3.5/site-package/matplotlib/mpl-data/matplotlib
- 將文件內容修改爲
font.family : sans-serif font.sans-serif : SimHei axes.unicode : False
添加網格顯示
爲了更加清楚地觀察圖像對應地值
plt.grid(True,linestyle=‘–‘,alpha=0.5)
- True:代表是否添加網格
- linestyle:網格線的格式
- alpha:透明度
添加描述信息
- plt.xlabel(str)
- str : 要顯示的x軸名稱
- plt.ylabel(str)
- str : 要顯示的y軸名稱
- plt.title(str)
- str:圖片的標題
- str:圖片的標題
在原圖上加一個圖層
一個圖就是一個plot,需要加圖層就是多定義一個plot
在圖層上添加說明
plt.plot(,label=str)
- str:直線的說明
plt.legend(loc=‘lower left’)
- loc:圖例顯示的位置
創建多個繪圖區
matplotlib.pyplot.subplots(nrows=1,ncols=1,**fig_kw)創建一個帶有多個axes(座標系/繪圖區)的圖
- nrows:行數,默認是一行
- ncols:列數,默認是一列
plt.函數名()相當於面向過程的畫圖方法,axes.set_函數名()相當於面向對象的畫圖方法
In
# 繪製0-12點的溫度變化圖
import matplotlib.pyplot as plt
#創建寬20高8英寸dpi爲80的畫布
figure,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=80)
x=[0,1,2,3,4,5,6,7,8,9,10,11]#時間 x
y=[2,3,2,2,2,4,5,8,9,9,12,15]#溫度 y
y1=[12,9,8,9,7,5,5,2,0,9,12,15]#溫度 y1
axes[0].plot(x,y,label='picture1') #繪製圖像1
axes[1].plot(x,y1,label='picture2') #繪製圖像2
axes[0].legend(loc='lower left') #顯示圖例
axes[1].legend(loc='lower left') #顯示圖例
#設置兩個軸顯示刻度
y_label=['{}℃'.format(i)for i in y]
x_label=['{}h'.format(i)for i in x]
#添加網格
axes[0].grid(True,linestyle='--',alpha=0.5)
axes[1].grid(True,linestyle='--',alpha=0.5)
#添加描述信息
axes[0].set_xlabel('time/h')
axes[0].set_ylabel('tempreture/℃')
axes[0].set_title('tempreture_change_picture')
axes[1].set_xlabel('time/h')
axes[1].set_ylabel('tempreture/℃')
axes[1].set_title('tempreture_change_picture')
axes[0].set_xticks(x,x_label)
axes[0].set_yticks(y,y_label)
axes[1].set_xticks(x,x_label)
axes[1].set_yticks(y1,y_label)
plt.show()
Out
繪製數學函數
畫圖之前先寫出y的表達式
import numpy as np
import math
x=np.linspace(-1,1,1000)
y=-1*x*x #表達式y
plt.figure(figsize=(20,8),dpi=80)#創建畫布
plt.plot(x,y) #繪製圖形
plt.grid() #添加網格
plt.show()
柱狀圖
- 意義:能夠一眼看出各個數據的大小,方便統計和對比數據之間的差別
- mayplotlib.pyplot.bar(x,width,align=‘center’,**kwargs) 繪製柱狀圖
- 用途:比較多組數據之間的差別
#繪製公司的第一月份和第一年的收入圖
x=['company A','company B','company C','company D']
y_month=[1200,2100,4100,3110]
y_year=[5810,5120,8040,7410]
plt.figure(figsize=(6,4),dpi=80)#創建畫布
plt.bar([0,1,2,3],y_month,width=0.2,label='first month income',
color=['r']) #繪製圖形
plt.bar([0.2,1.2,2.2,3.2],y_year,width=0.2,
label='first year income') #繪製圖形
plt.legend()
plt.xticks(range(4),x)
plt.title('company income table')
plt.grid() #添加網格
plt.show()
直方圖
- 組數:在統計數據時,我們把數據按照不同的範圍分成幾個組,分成的組的個數稱爲組數
- 組距:每一組兩個端點的差
- 意義:直方圖展示數據的分佈
- matplotlib.pyplot.hist(x,bins=None,normed=None,**kwargs)
- x:畫圖的數據
- bins:組數
x=[143,152,164,148,165,157,159,162,170,176,148,154,165,158,149,172,157,164,168,157]
plt.figure(figsize=(6,4),dpi=80)#創建畫布
plt.hist(x,11)
plt.title('table')#標題
plt.xticks(range(min(x),max(x),3))
plt.show()
散點圖
- 意義:判斷變量之間是否存在數量關聯趨勢,展示數據分佈規律
- matplotlib.pyplot.scatter() 繪製散點圖
- 用途:探究不同變量之間的內在關係
餅圖
- matplotlib.pyplot.pie(x,labels=,autopct=,colors)
- x:數量
- labels:每部分名稱
- autopct:佔比顯示指定%1.2f%%
- colors:每部分顏色
name=['A','B','C','D','E','F']
count=[1250,900,850,749,1300,890]
plt.figure(figsize=(6,4),dpi=80)#創建畫布
plt.pie(count,labels=name,colors=['r','b','y','g','c','m'],autopct='%1.2f%%')
plt.title('table')#標題
#如果圖形不平整,加該行代碼
#plt.axis('equal')
plt.show()