Matplotlib庫之基礎常見圖形的繪製

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()

餅圖的效果圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章