目錄
-
- 1. 簡介
- 2. 繪圖
-
- 2.1 折線圖
-
- 2.1.1 單線
- 2.1.2 多線
- 2.1.3 子圖
- 2.2 散點圖
- 2.3 直方圖
- 2.4 條形圖
-
- 2.4.1 縱置
- 2.4.2 橫置
- 2.4.3 多條
- 2.5 餅圖
1. 簡介
Matplotlib 是 Python 提供的一個繪圖庫,通過該庫我們可以很容易的繪制出折線圖、直方圖、散點圖、餅圖等豐富的統計圖,安裝使用 pip install matplotlib
命令即可,Matplotlib 經常會與 NumPy 一起使用。
在進行數據分析時,可視化工作是一個十分重要的環節,數據可視化可以讓我們更加直觀、清晰的了解數據,Matplotlib 就是一種可視化實現方式。
2. 繪圖
下面我們來學習一下如何使用 Matplotlib 繪制常用統計圖。
2.1 折線圖
折線圖可以顯示隨某一指標變化的連續數據。
2.1.1 單線
首先,我們來看一下如何使用 Matplotlib 繪制一個簡單的折線圖,具體實現如下:
from matplotlib import pyplot as pltx = range(1, 7)
y = [13, 15, 14, 16, 15, 17]
plt.title('折線圖')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
plt.plot(x, y)
plt.show()
看一下效果:
我們在使用中文時可能會現亂碼的問題,可以通過如下方式解決:
① 下載 SimHei.ttf,放到 site-packages\matplotlib\mpl-data\fonts\ttf
目錄下
② 到 site-packages\matplotlib\mpl-data
目錄下找到 matplotlibrc
文件,并修改如下兩項即可
font.sans-serif : SimHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
axes.unicode_minus : False
我們還可以改變折線的樣式、顏色等,通過示例來看一下。
from matplotlib import pyplot as pltx = range(1, 7)
y = [13, 15, 14, 16, 15, 17]
'''
figsize:設置圖片的寬、高,單位為英寸
dpi:設置分辨率
'''
plt.figure(figsize=(8, 5), dpi=80)
plt.title('折線圖')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
'''
color:顏色
linewidth:線的寬度
marker:折點樣式
linestyle:線的樣式,主要包括:'-'、'--'、'-.'、':'
'''
plt.plot(x, y, color='red', marker='o', linewidth='1', linestyle='--')
# 保存
# plt.savefig('test.png')
plt.show()
看一下效果:
2.1.2 多線
有時候我們可能存在多個指標對比的情況,也就是需要在一個圖中繪制多條折線,比如:我們要了解張三、李四隨著年齡增長體重的變化情況,示例如下所示:
from matplotlib import pyplot as pltx = range(15, 25)
y1 = [50, 55, 58, 65, 70, 68, 70, 72, 75, 70]
y2 = [52, 53, 60, 63, 65, 68, 75, 80, 85, 72]
plt.figure(figsize=(10, 6), dpi=80)
plt.title('體重年齡折線圖')
plt.xlabel('年齡(歲)')
plt.ylabel('體重(kg)')
plt.plot(x, y1, color='red', label='張三')
plt.plot(x, y2, color='blue', label='李四')
# 添加網格,alpha 為透明度
plt.grid(alpha=0.5)
# 添加圖例
plt.legend(loc='upper right')
plt.show()
看一下效果:
2.1.3 子圖
Matplotlib 可以實現在一張圖中繪制多個子圖,我們通過示例來看一下。
from matplotlib import pyplot as plt
import numpy as npa = np.arange(1, 30)
# 劃分子圖
fig, axs = plt.subplots(2, 2)
# 繪制子圖
axs1 = axs[0, 0]
axs2 = axs[0, 1]
axs3 = axs[1, 0]
axs4 = axs[1, 1]
axs1.plot(a, a)
axs2.plot(a, np.sin(a))
axs3.plot(a, np.log(a))
axs4.plot(a, a ** 2)
plt.show()
看一下效果:
2.2 散點圖
散點圖表示因變量隨自變量而變化的大致趨勢,我們通過示例來具體看一下如何繪制散點圖。
from matplotlib import pyplot as plt
import numpy as npx = np.arange(0, 20)
# 生成隨機數
y = np.random.randint(0, 20, size=20)
plt.title('散點圖')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
plt.plot(x, y, 'ob')
plt.show()
看一下效果:
2.3 直方圖
直方圖也被稱為質量分布圖,主要用來表示數據的分布情況,我們通過示例來看一下如何繪制直方圖。
import matplotlib.pyplot as plt
import numpy as np# 生成隨機數
d1 = np.random.randn(5000)
d2 = np.random.randn(4000)
'''
bins:直方圖條目數
alpha:透明度
label:圖例名
'''
plt.hist(d1, bins=50, label = 'label1', alpha=0.8)
plt.hist(d2, bins=50, label = 'label2', alpha=0.5)
plt.grid(alpha=0.3)
plt.title('直方圖')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
# 顯示圖例
plt.legend()
plt.show()
看一下效果:
2.4 條形圖
條形圖寬度相同,用高度或長短來表示數據多少,它可以橫置或縱置。
2.4.1 縱置
首先,我們來看一下如何繪制縱向條形圖,以學生成績為例,看一下具體實現。
import matplotlib.pyplot as plt
import numpy as nparr = np.arange(4)
x = ['張三', '李四', '王五', '趙六']
y = [77, 79, 70, 70]
'''
width:長條形寬度
label:圖例名
'''
rects = plt.bar(arr, y, width=0.3, label='語文')
'''
參數1:中點坐標
參數2:顯示值
'''
plt.xticks([idx for idx in range(len(x))], x)
plt.title('學生成績條形圖')
plt.xlabel('姓名')
plt.ylabel('成績')
plt.legend()
# 在條形圖上加標注
for rect in rects:height = rect.get_height()plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha='center', va='bottom')
plt.show()
看一下效果:
2.4.2 橫置
我們接著再通過示例來看一下如何繪制橫向條形圖。
import matplotlib.pyplot as plt
import numpy as nparr = np.arange(4)
y = ['張三', '李四', '王五', '趙六']
x = [88, 79, 70, 66]
plt.barh(range(4), x, 0.4, label='語文')
plt.yticks(range(4), y)
plt.xlabel('成績')
plt.ylabel('姓名')
plt.title('學生成績條形圖')
plt.legend(loc='upper right')
for x, y in enumerate(x):plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.show()
看一下效果:
2.4.3 多條
最后,我們來看一下一個學生要同時顯示語文和數學兩門成績時,如何通過 Matplotlib 來繪制條形圖。
import matplotlib.pyplot as plt
import numpy as nparr = np.arange(4)
x = ['張三', '李四', '王五', '趙六']
y1 = [88, 75, 77, 66]
y2 = [77, 79, 70, 70]
'''
width:長條形寬度
label:圖例名
'''
rects1 = plt.bar(arr, y1, width=0.3, label='語文')
rects2 = plt.bar(arr + 0.3, y2, width=0.3, label='數學')
'''
參數1:中點坐標
參數2:顯示值
參數3:間距
'''
plt.xticks([idx + 0.15 for idx in range(len(x))], x, rotation=10)
plt.title('學生成績條形圖')
plt.xlabel('姓名')
plt.ylabel('成績')
plt.legend()
# 編輯文本
for rect in rects1:height = rect.get_height()plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha='center', va='bottom')
for rect in rects2:height = rect.get_height()plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha='center', va='bottom')
plt.show()
看一下效果:
2.5 餅圖
餅圖顯示一個數據系列,我們通過示例來看一下如何繪制餅圖。
import matplotlib.pyplot as pltlabel_list = ['第一部分', '第二部分', '第三部分']
size = [50, 30, 20]
# 各部分顏色
color = ['red', 'green', 'blue']
# 各部分突出值
explode = [0, 0.1, 0]
'''
explode:設置各部分突出
label:設置圖例顯示內容
labeldistance:設置圖例內容距圓心位置
autopct:設置圓里面文本
shadow:設置是否有陰影
startangle:起始角度,默認從 0 開始逆時針轉
pctdistance:設置圓內文本距圓心距離
l_text:圓內部文本
p_text:圓外部文本
'''
patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
# 設置橫軸和縱軸大小相等,這樣餅才是圓的
plt.axis('equal')
plt.legend(loc='upper left')
plt.show()
看一下效果: