matplotlib介紹
資料可視化的庫
不僅可以繪制 2-D圖,也可以繪制 3-D圖
# 導包
import matplotlib.pyplot as plt
繪圖三部曲:
- 建立畫布
- 繪圖
- 圖形展示
一、繪圖基礎文法與常用參數
1、基本繪圖流程
2、建立畫布與子圖
函數名稱 | 函數作用 |
---|---|
plt.figure | 建立一個空白畫布,可以指定畫布大小,像素。 |
figure.add_subplot | 建立并選中子圖,可以指定子圖的行數、列數、與選中圖檔編号。 |
3、圖形修飾
函數名稱 | 函數作用 |
---|---|
plt.title | 給目前圖形添加标題 |
plt.xlabel | 添加 x 軸名稱 |
plt.ylabel | 添加 y 軸名稱 |
plt.xlim | 指定目前圖形 x 軸的範圍,隻能确定一個數值區間,而無法使用字元串辨別 |
plt.ylim | 指定目前圖形 y 軸的範圍,隻能确定一個數值區間,而無法使用字元串辨別 |
plt.xticks | 指定 x 軸刻度的數目與取值,可以使用字元串進行辨別 |
plt.yticks | 指定 y 軸刻度的數目與取值,可以使用字元串進行辨別 |
plt.legend | 增加圖例,可以指定圖例的位置 loc |
plt.text | 标注具體數值 |
4、圖檔的儲存與展示
函數名稱 | 函數作用 |
---|---|
plt.savefig | 儲存繪制的圖檔,在圖形修飾完之後,圖形展示之前 |
plt.show | 圖形展示 |
5、RC參數
# 設定RC參數,使其支援中文
plt.rcParams['font.sans-serif']='SimHei'
# 設定RC參數,使其支援負号
plt.rcParams['axes.unicode_minus']=False
線條
rc 參數名稱 | 解釋 |
---|---|
color | 線條的顔色 |
linestyle | 線條的樣式 |
linewidth | 線條的寬度 |
marker | 點的形狀 |
markersize | 點的大小 |
markerfacecolor | 點的填充顔色 |
markeredgecolor | 點的邊緣顔色 |
- 常見線條類型解釋
linestyle取值 | 意義 | linestyle取值 | 意義 |
---|---|---|---|
- | 實線 | -. | 點線 |
– | 長虛線 | : | 短虛線 |
- 線條标記解釋
marker取值 | 意義 | marker取值 | 意義 |
---|---|---|---|
“o” | 圓圈 | “.” | 點 |
“D” | 菱形 | “s” | 正方形 |
“h” | 六邊形1 | “*” | 星号 |
“H” | 六邊形2 | “d” | 小菱形 |
“-” | 水準線 | “v” | 一角朝下的三角形 |
“8” | 八邊形 | “<” | 一角朝左的三角形 |
“p” | 五邊形 | “>” | 一角朝右的三角形 |
“,” | 像素 | “^” | 一角朝上的三角形 |
“+” | 加号 | "\ " | 豎線 |
“None” | 無 | “x” | X |
如果想要參考更多線條樣式、顔色,請通路:
https://www.cnblogs.com/darkknightzh/p/6117528.html
二、繪制圖形
1、折線圖(plot)
plot 函數在官方文檔的文法中隻要求填入不定長參數,實際可以填入的參數主要如下:
參數名稱 | 說明 |
---|---|
x,y | 接收 array。表示 x 軸和 y 軸對應的資料。 |
color | 接收特定 string。指定線條的顔色 |
linestyle | 接收特定 string。指定線條類型。預設為”-“。 |
marker | 接收特定 string。表示繪制的點的形狀。 |
alpha | 接收 0-1的小數。表示點的透明度。 |
- color 參數的 8 中常用顔色的縮寫。
顔色縮寫 | 代表的顔色 | 顔色縮寫 | 代表的顔色 |
---|---|---|---|
b | 藍色 | m | 品紅 |
g | 綠色 | y | 黃色 |
r | 紅色 | k | 黑色 |
c | 青色 | w | 白色 |
案例一:
繪制下一周北京、廣州天氣溫度走勢圖
- 注意:如果橫坐标是中文字元串形式的,先用序号代替,之後再用字元串替換
import matplotlib.pyplot as plt
import numpy as np
# 1、建立畫布
plt.figure()
# 修改RC參數,讓其支援中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 再去修改RC參數,讓其支援負号
plt.rcParams['axes.unicode_minus'] = False
# 2、繪圖
## 建構x,y軸資料
x = np.arange(1, 8)
y1 = np.array([-10, -8, -6, -10, -12, -4, 2]) # 北京天氣
y2 = np.array([26, 24, 22, 24, 25, 20, 18]) # 廣州天氣
## 繪制折線圖
plt.plot(x, y1, color='r', linestyle=':', linewidth=1.2, marker="*", markersize=7, markerfacecolor='b', markeredgecolor='g')
plt.plot(x, y2, color='b', linestyle='-.', linewidth=1.2, marker="o", markersize=7, markerfacecolor='r', markeredgecolor='r')
## 圖形修飾
## 1.增加标題
plt.title("下一周北京、廣州天氣溫度走勢圖")
## 2.增加x軸名稱
plt.xlabel("日期")
## 3.增加y軸名稱
plt.ylabel("溫度℃")
## 4.修改x軸刻度
# 用中文字元串替換序号
# 參數1 序号
# 參數2 中文字元串
xticks = ["周一","周二","周三","周四","周五","周六","周日"]
plt.xticks(x, xticks)
## 5.修改y軸刻度
# 如果隻是修改數值的取值範圍 ---重新設定刻度
# 參數 新的刻度
yticks = np.arange(-15, 31, 3)
plt.yticks(yticks)
## 6.增加圖例
# loc --調整圖例的位置
legend = ["北京","廣州"]
plt.legend(legend, loc=0)
## 7.進行标注
for i,j in zip(x,y1):
# 參數1 标注的橫坐标
# 參數2 标注的縱坐标
# 參數3 标注的内容
# horizontalalignment='center' --讓标注水準居中
plt.text(i, j + 0.7, "%d℃" % j, horizontalalignment='center')
for i,j in zip(x,y2):
plt.text(i, j + 0.7, "%d℃" % j, horizontalalignment='center')
# 儲存圖檔
plt.savefig("./下一周北京、廣州天氣溫度走勢.png")
# 3、圖形展示
plt.show()
案例二:
- 加載
國民經濟核算季度資料.npz
檔案
連結:https://pan.baidu.com/s/1m3CcoWuCDsWZDRQWdzlzfg
提取碼:c0gv
- 繪制
2000-2017各産業生産總值折線圖.png
import matplotlib.pyplot as plt
import numpy as np
def build_data():
"""加載資料"""
res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
# for tmp in res:
# print(tmp)
columns = res['columns']
values = res['values']
return columns, values
def show_data(columns, values):
"""資料可視化"""
# 1、建立畫布
plt.figure(figsize=(10, 8), dpi=100)
# 修改RC參數,讓其支援中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 再去修改RC參數,讓其支援負号
plt.rcParams['axes.unicode_minus'] = False
# 2、繪圖
# 準備x軸和y軸資料
x = np.arange(1, values.shape[0] + 1)
# 第一産業總值
y1 = values[:, 3]
# 第二産業總值
y2 = values[:, 4]
# 第三産業總值
y3 = values[:, 5]
# 繪制折線圖
# fmt = '[marker][line][color]'
plt.plot(x, y1, 's-b')
plt.plot(x, y2, 'o-.r')
plt.plot(x, y3, 'o--g')
# 圖形修飾
# 增加标題
plt.title("2000-2017年各産業季度生産總值折線圖")
# 增加y軸名稱
plt.ylabel("生産總值(億元)")
# 修改x軸刻度
# 用中文字元串替換序号
xticks = values[:, 1]
plt.xticks(x[::4], xticks[::4], rotation=45)
# 增加圖例
legend = [tmp[:4] for tmp in columns[3:6]]
plt.legend(legend)
# 儲存圖檔
plt.savefig("./2000-2017各産業生産總值折線圖.png")
# 3、圖形展示
plt.show()
def main():
# 1、加載資料
columns, values = build_data()
print("columns:\n", columns)
print("values:\n", values)
# 2、資料可視化
show_data(columns, values)
if __name__ == '__main__':
main()
結果展示:
那麼我們如何在一個畫布中,繪制多個圖形呢?
- 繪制子圖
- 調整子圖間距
繪制下圖:
代碼實作:
import matplotlib.pyplot as plt
import numpy as np
def build_data():
"""加載資料"""
res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
# for tmp in res:
# print(tmp)
columns = res['columns']
values = res['values']
return columns, values
def show_data(columns, values):
# 1、建立畫布
# 傳回一個畫布對象
fig = plt.figure(figsize=(12, 10), dpi=100)
# 調整子圖間距
# hspace ---上下子圖的高度差
# wspace ---左右子圖的寬度差
# 給定值為小數,意義為占 子圖的占比
fig.subplots_adjust(hspace=0.3)
# 修改RC參數,讓其支援中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 再去修改RC參數,讓其支援負号
plt.rcParams['axes.unicode_minus'] = False
# 2、繪圖
# 2行1列第一個子圖
# 參數1 繪制的子圖的行數
# 參數2 繪制子圖的列數
# 參數3 第幾個子圖
fig.add_subplot(2, 1, 1)
# 準備x軸和y軸資料
x = np.arange(1, values.shape[0] + 1)
# 第一産業總值
y1 = values[:, 3]
# 第二産業總值
y2 = values[:, 4]
# 第三産業總值
y3 = values[:, 5]
# 繪制折線圖
# fmt = '[marker][line][color]'
plt.plot(x, y1, 's-b')
plt.plot(x, y2, 'o-.r')
plt.plot(x, y3, 'o--g')
# 圖形修飾
# 增加标題
plt.title("2000-2017年各産業季度生産總值折線圖")
# 增加y軸名稱
plt.ylabel("生産總值(億元)")
# 修改x軸刻度
# 用中文字元串替換序号
xticks = values[:, 1]
plt.xticks(x[::4], xticks[::4], rotation=45)
# 增加圖例
legend = [tmp[:4] for tmp in columns[3:6]]
plt.legend(legend)
# 繪制第2個子圖
fig.add_subplot(2, 1, 2)
# 準備x軸和y軸資料
color_list = ['k','g','b','yellow','lime','m','c','peru','orangered']
num = 0
for i in range(6, 15):
y = values[:, i]
plt.plot(x, y, '%s' % color_list[num])
num += 1
# y1 = values[:, 6]
# y2 = values[:, 7]
# y3 = values[:, 8]
# y4 = values[:, 9]
# y5 = values[:, 10]
# y6 = values[:, 11]
# y7 = values[:, 12]
# y8 = values[:, 13]
# y9 = values[:, 14]
# # 繪制圖形
# plt.plot(x, y1)
# plt.plot(x, y2)
# plt.plot(x, y3)
# plt.plot(x, y4)
# plt.plot(x, y5)
# plt.plot(x, y6)
# plt.plot(x, y7)
# plt.plot(x, y8)
# plt.plot(x, y9)
# y = values[:, 6:]
# # 繪制圖形
# # 折線圖繪制的時候,每一個x,拿出一列又一列分别的去繪制折線圖
# plt.plot(x, y)
# 增加x軸名稱
plt.xlabel("年份")
# 增加y軸名稱
plt.ylabel("生産總值(億元)")
# 修改x軸刻度
# 用中文字元串替換序号
xticks = values[:, 1]
plt.xticks(x[::4], xticks[::4], rotation=45)
# 增加圖例
legend = [tmp[:2] for tmp in columns[6:]]
plt.legend(legend)
# 儲存圖檔
plt.savefig("./2000-2017各産業、行業生産總值折線圖.png")
# 3、圖形展示
plt.show()
def main():
# 1、加載資料
columns, values = build_data()
print("columns:\n", columns)
print("values:\n", values)
# 2、資料可視化
show_data(columns, values)
# 3、結論
# xxxxxxxxx
if __name__ == '__main__':
main()
- 應用場景
檢視資料的發展趨勢、變化、走勢
如:遊戲的線上人數在每天不同的時間段的變化趨勢
如:某公司上線的産品在不同的時間段的人數變化
2、散點圖(scatter)
常用參數及說明如下表所示:
參數名稱 | 說明 |
---|---|
x , y | 接收 array。表示 x軸和 y 軸對應的資料。 |
s | 指定點的大小,可以傳單個大小,也可以傳 array_like。 |
c | 指定點的顔色,可以傳單個顔色,也可以傳 array_like |
marker | 點的形狀。隻能傳入單個形狀,不能傳入 array_like |
任務實作:
代碼實作:
import matplotlib.pyplot as plt
import numpy as np
def build_data():
"""加載資料"""
res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
# for tmp in res:
# print(tmp)
columns = res['columns']
values = res['values']
return columns, values
def show_data(columns, values):
"""資料可視化"""
# 1、建立畫布
plt.figure(figsize=(10, 8), dpi=100)
# 修改RC參數,讓其支援中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 再去修改RC參數,讓其支援負号
plt.rcParams['axes.unicode_minus'] = False
# 2、繪圖
# 建構橫縱坐标資料
x = np.arange(values.shape[0])
y1 = values[:,3]
y2 = values[:,4]
y3 = values[:,5]
# 繪制散點圖
plt.scatter(x, y1, c='r', marker="o")
plt.scatter(x, y2, c='b', marker='s')
plt.scatter(x, y3, c='yellow', marker='v')
# 圖形修飾
plt.title("2000-2017年各産業季度生産總值散點圖")
plt.ylabel("生産總值(億元)")
xticks = values[:,1]
plt.xticks(x[::4], xticks[::4], rotation=45)
legend = [tmp[:4] for tmp in columns[3:6]]
plt.legend(legend)
# 儲存圖檔
plt.savefig("./2000-2017年各産業季度生産總值散點圖.png")
# 3、圖形展示
plt.show()
def main():
# 1、加載資料
columns, values = build_data()
print("columns:\n", columns)
print("values:\n", values)
# 2、資料可視化
show_data(columns, values)
# 3、結論
if __name__ == '__main__':
main()
- 應用場景
- 類似于折線圖的這種散點圖,可以用來觀察資料的走勢
- 一堆一堆的散點圖,可以用來檢視資料的緊密聯系程度
- 也可以用來對比不同的類别—(一般不用)
3、直方圖與柱狀圖的差別
直方圖:
- 由緊密結合的多個柱子組成
- 橫軸為資料的分布範圍區間
- 縱軸為資料落在各個區間内的數量
- 一般用于檢視資料的分布範圍
- 應用于大量資料的場景
柱狀圖:
- 由多個分開的柱子組成
- 橫軸一般為資料的各個類别
- 縱軸為各個類别所對應的數量
- 一般用于各個類别之間的對比
- 一般用于少量資料類别的對比
4、柱狀圖(bar)
常用參數及說明如下表所示:
參數名稱 | 說明 |
---|---|
left | 接收 array。表示 x 軸資料。 |
height | 接收 array。表示 x 所代表資料的數量。 |
width | 接收 0-1 之間的 float。指定直方圖寬度。預設為 0.8. |
color | 接收特定 string 或者包含顔色字元串的 array。 表示直方圖顔色。預設為 None。 |
任務實作:
代碼實作:
import matplotlib.pyplot as plt
import numpy as np
def build_data():
"""加載資料"""
res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
columns = res['columns']
values = res['values']
return columns, values
def show_data(columns, values):
"""資料可視化"""
# 1、建立畫布
plt.figure()
# 修改RC參數,讓其支援中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 再去修改RC參數,讓其支援負号
plt.rcParams['axes.unicode_minus'] = False
# 2、繪圖
# 橫軸--第一産業、第二産業、第三産業
x = np.arange(3)
# 縱軸--各個産業--在2000年的值
y = values[0,3:6] / 1000
# 繪制柱狀圖
# width ---柱子的寬度
# color--可以給定一個具體的顔色,也可以給一個顔色 array_like
plt.bar(x, y, width=0.3, color=['r', 'g', 'b'])
# 圖形修飾
plt.title("2000年第一季度國民生產毛額産業構成分布柱狀圖") # 增加标題
plt.xlabel("産業") # 橫軸名稱
plt.ylabel("生産總值(千億元)") # 縱軸名稱
# 修改橫軸刻度
xticks = [tmp[:4] for tmp in columns[3:6]]
plt.xticks(x, xticks)
# 進行标注
for i,j in zip(x, y):
plt.text(i, j + 0.1, "%.2f千億元" % j, horizontalalignment='center')
# 柱狀圖不需要增加圖例
# 儲存圖檔
plt.savefig("./2000年第一季度國民生產毛額産業構成分布柱狀圖.png")
# 3、圖形展示
plt.show()
def main():
# 1、加載資料
columns, values = build_data()
print("columns:\n", columns)
print("values:\n", values)
# 2、資料可視化
# 3、結論
if __name__ == '__main__':
main()
5、直方圖(hist)
import matplotlib.pyplot as plt
import numpy as np
# 1、建立畫布
plt.figure()
# 2、繪制圖形
# 繪制某班同學身高分布情況 ---30位同學
high = np.random.uniform(low=140, high=190, size=30)
# print("high:\n", high)
# 将身高保留一位小數
high = np.array([float("%.1f" % i) for i in high])
print("high:\n", high)
# 繪制直方圖
# 預設分組
# plt.hist(high, bins=5)
# 自定義分組
# bins = [140, 150, 160, 170, 180, 190]
# plt.hist(high, bins)
# 按照資料進行自定義等寬分組
# (1)确定分組個數
group_num = 5
# (2)确定每一組的步長
# 确定最大值
max_high = np.max(high)
# 确定最小值
min_high = np.min(high)
# 确定最大值與最小值的差距 ---極差
ptp = max_high - min_high
# 确定步長
step = np.ceil(ptp / group_num)
# (3)确定bins
bins = np.arange(min_high, max_high + step, step)
print("max_high:\n", max_high)
print("min_high:\n", min_high)
print("bins:\n", bins)
# 繪制直方圖
plt.hist(high, bins=bins, color="b", edgecolor="k")
# 設定刻度
plt.xticks(bins)
yticks = np.arange(11)
plt.yticks(yticks)
# 不能标注
# 增加網格線
plt.grid(b=True, axis="y")
# 直方圖不能增加圖例
# 3、圖形展示
plt.show()
結果展示:
6、餅圖(pie)
餅圖 ----将各部分全部繪制在同一個餅中,可以展現出各部分的占比。
- 應用場景:
- 對比各部分的占比情況
- 也可以對比部分與整體的關系
import matplotlib.pyplot as plt
import numpy as np
def build_data():
"""加載資料"""
res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
columns = res['columns']
values = res['values']
return columns, values
def show_data():
"""資料可視化"""
# 1、建立畫布
plt.figure()
# 2、繪制圖形
# 建構繪制餅圖的資料
x = values[-1, 3:6]
# explode ---表示各部分距離圓心的半徑 ---也可以了解為 各部分之間的間隙
explode = (0.01, 0.02, 0.01) # 占半徑的占比
# labels ---每一項的名稱
labes = [tmp[:4] for tmp in columns[3:6]]
# colors --- 設定顔色
colors = ["r", "g", "b"]
# autopct ---用來顯示各部分占比
autopct = "%.1f%%"
# pctdistance ---控制着标注的位置,預設為距離圓心0.6個半徑的位置
pctdistance = 0.6
# labeldistance ---控制着名稱的位置,預設為距離圓心1.1個半徑的位置
labeldistance = 1.1
# radius ---表示餅圖的半徑
radius = 1.0
# 繪制餅圖
plt.pie(x, explode=explode, labels=labels, colors=colors, autopct=autopct, pctdistance=pctdistance, labeldistance=labeldistance, radius=radius)
# 将餅圖由橢圓 變為圓形
# 橢圓裡面 有個長軸、短軸 ---> 長軸=短軸 --->圓
plt.axis('equal')
# 增加标題
plt.title("2017年各個産業的增加總值占比情況")
# 設定圖例
plt.legend(labels)
# 儲存圖檔
plt.savefig("./2017年各個産業的增加總值占比情況.png")
# 3、圖形展示
plt.show()
def main():
# 1、加載資料
columns, values = build_data()
print("columns:\n", columns)
print("values:\n", values)
# 2、資料可視化
show_data(columns, values)
if __name__ == '__main__':
main()
結果展示:
7、箱線圖(boxplot)
箱線圖 —利用最小值、下四分位數、中位數、上四分位數、最大值來進行描述資料。
應用場景:
- 可以用來檢視資料的是否對稱、離散、分布
- 借助箱線圖分析剔除異常值(遠離正常範圍的錯誤的值)
import matplotlib.pyplot as plt
import numpy as np
def build_data():
"""加載資料"""
res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
columns = res['columns']
values = res['values']
return columns, values
def show_data(columns, values):
"""資料可視化"""
# 1、建立畫布
plt.figure()
# 2、繪制圖形
x = values[:,3:6]
# notch ---是否有缺口
# meanline=True, showmeans=True 同時使用,才能在箱線圖上顯示出均值
# vert=False ---繪制水準的箱子
# labels 名稱
labels = [tmp[:4] for tmp in columns[3:6]]
# 繪制箱線圖
plt.boxplot(x, notch=True, meanline=True, showmeans=True, labels=labels)
# 3、圖形展示
plt.show()
def main():
# 1、加載資料
columns, values = build_data()
print("columns:\n", columns)
print("values:\n", values)
if __name__ == '__main__':
main()
結果實作: