小白學 Python 資料分析(19):Matplotlib(四)常用圖表(下)
人生苦短,我用 Python
前文傳送門:
小白學 Python 資料分析(1):資料分析基礎
小白學 Python 資料分析(2):Pandas (一)概述
小白學 Python 資料分析(3):Pandas (二)資料結構 Series
小白學 Python 資料分析(4):Pandas (三)資料結構 DataFrame
小白學 Python 資料分析(5):Pandas (四)基礎操作(1)檢視資料
小白學 Python 資料分析(6):Pandas (五)基礎操作(2)資料選擇
小白學 Python 資料分析(7):Pandas (六)資料匯入
小白學 Python 資料分析(8):Pandas (七)資料預處理
小白學 Python 資料分析(9):Pandas (八)資料預處理(2)
小白學 Python 資料分析(10):Pandas (九)資料運算
小白學 Python 資料分析(11):Pandas (十)資料分組
小白學 Python 資料分析(12):Pandas (十一)資料透視表(pivot_table)
小白學 Python 資料分析(13):Pandas (十二)資料表拼接
小白學 Python 資料分析(14):Pandas (十三)資料匯出
小白學 Python 資料分析(15):資料視覺化概述
小白學 Python 資料分析(16):Matplotlib(一)座標系
小白學 Python 資料分析(17):Matplotlib(二)基礎操作
小白學 Python 資料分析(18):Matplotlib(三)常用圖表(上)
散點圖
上一篇我們介紹了常見的折線圖和柱狀圖,本篇我們接著看其他常用的圖形。
散點圖經常用來表示資料之間的關係,使用的是 plt 庫中的 scatter()
方法,還是先看下 scatter()
的語法,來自官方文件:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html :
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=<deprecated parameter>, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
前面介紹過的引數這裡不再多說,說點散點圖特有的引數:
- s : 表示的是每個點的大小,如果只有一個數值的時候,則所有的點都是一樣大的,也可以傳入一個列表,這時候每個點的大小都不一樣,散點圖也就成了氣泡圖。
- c : 表示點的顏色,如果只有一種顏色的時候,則每個點的顏色都會相同,也可以使用列表定義不同的顏色
- linewidths : 表示每個散點的線寬
- edgecolors : 每個散點外輪廓的顏色
其實散點圖的常用引數和之前的折線圖柱狀圖都差不多,還有一些沒介紹的高階引數可以參考官方文件,主要是用來做一些比較騷的操作的,可以用來自定義顏色的漸變。
看個簡單的示例,資料還是使用前文的資料:
import matplotlib.pyplot as plt
import numpy as np
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = np.array([2011,2012,2013,2014,2015,2016,2017])
y_data = np.array([58000,60200,63000,71000,84000,90500,107000])
plt.scatter(x_data, y_data, s = 100, c = 'green', marker='o', edgecolor='black', alpha=0.5, label = '產品銷量')
plt.legend()
plt.savefig("scatter_demo.png")
結果如下:
氣泡圖
氣泡圖和上面的散點圖非常類似,只是點的大小不一樣,而且是通過引數 s
來進行控制的,多的不說,還是看個示例:
import matplotlib.pyplot as plt
import numpy as np
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = np.array([2011,2012,2013,2014,2015,2016,2017])
y_data = np.array([58000,60200,63000,71000,84000,90500,107000])
# 根據 y 值的不同生成不同的顏色
colors = y_data * 10
# 根據 y 值的不同生成不同的大小
area = y_data / 300
plt.scatter(x_data, y_data, s = area, c = colors, marker='o', edgecolor='black', alpha=0.5, label = '產品銷量')
plt.legend()
plt.savefig("scatter_demo1.png")
程式碼不多解釋了,註釋已經寫得很清楚了,直接來看結果:
堆疊圖
堆疊圖的作用和折線圖非常類似,它採用的是 stackplot()
方法。
語法如下:
plt.stackplot(x, y, labels, colors)
stackplot()
堆疊圖的語法比較簡單,這裡就不多介紹了,看過前面的同學應該一眼就能明白,接下來我們看個示例:
import matplotlib.pyplot as plt
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = [2011,2012,2013,2014,2015,2016,2017]
y_data = [58000,60200,63000,71000,84000,90500,107000]
y_data_1 = [78000,80200,93000,101000,64000,70500,87000]
plt.title(label='xxx 公司 xxx 產品銷量')
plt.stackplot(x_data, y_data, y_data_1, labels=['產品銷量', '使用者增長數'])
plt.legend()
plt.savefig("stackplot_demo.png")
結果如下:
雷達圖
雷達圖各位同學可能在玩遊戲的時候經常看到,或者是做一些能力測評的時候,它可以直觀的看出來一個事物的優勢與不足。
在 plt 中建立雷達圖是用 polar()
方法的,這個方法其實是用來建立極座標系的,而雷達圖就是先在極座標系中將各個點找出來,然後再將他們連線連起來。
語法如下:
plt.polar(theta, r, **kwargs)
- theta : 每一個點在極座標系中的角度
- r : 每一個點在極座標系中的半徑
接下來我們來看個示例,這個示例完全出於小編自己幻想,無其他任何意義:
import numpy as np
import matplotlib.pyplot as plt
# 中文和負號的正常顯示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 使用ggplot的繪圖風格
plt.style.use('ggplot')
# 構造資料
values = [3.2, 2.1, 3.5, 2.8, 3]
feature = ['攻擊力', '防禦力', '恢復力', '法術強度', '生命值']
N = len(values)
# 設定雷達圖的角度,用於平分切開一個圓面
angles = np.linspace(0, 2 * np.pi, N, endpoint=False)
# 為了使雷達圖一圈封閉起來,需要下面的步驟
values = np.concatenate((values, [values[0]]))
angles = np.concatenate((angles, [angles[0]]))
# 繪圖
fig = plt.figure()
# 這裡一定要設定為極座標格式
ax = fig.add_subplot(111, polar=True)
# 繪製折線圖
ax.plot(angles, values, 'o-', linewidth=2)
# 填充顏色
ax.fill(angles, values, alpha=0.25)
# 新增每個特徵的標籤
ax.set_thetagrids(angles * 180 / np.pi, feature)
# 設定雷達圖的範圍
ax.set_ylim(0, 5)
# 新增標題
plt.title('遊戲人物屬性')
# 新增網格線
ax.grid(True)
# 顯示圖形
plt.savefig('polar_demo.png')
結果如下:
餅圖
餅圖的作用和上面的雷達圖有些類似,也是用來表示同一個事物的不同類別的佔比情況,它使用的是 plt 中的 pie
這個方法。
語法如下:
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, hold=None, data=None)
餅圖的引數還是比較複雜的,我們接下來一個一個看:
- x : array-like
- explode : array-like, optional, default: None(設定餅圖偏離)
- labels : list, optional, default: None(標籤)
- colors : array-like, optional, default: None(顏色設定)
- autopct : None (default), string, or function, optional(設定百分比顯示)
- pctdistance : float, optional, default: 0.6(百分比距圓心的位置)
- shadow : bool, optional, default: False(設定陰影)
- labeldistance : float, optional, default: 1.1(標籤距圓心的距離)
- startangle : float, optional, default: None(開始位置的旋轉角度,第一個分類是在右45度位置)
- radius : float, optional, default: None(設定半徑的大小)
- counterclock : bool, optional, default: True(是否逆時針)
- wedgeprops : dict, optional, default: None(內外邊界設定)
- textprops : dict, optional, default: None(文字設定)
- center : list of float, optional, default: (0, 0)(設定中心位置)
- frame : bool, optional, default: False(是否顯示餅圖背後圖框)
來個簡單的示例:
import matplotlib.pyplot as plt
# 中文和負號的正常顯示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 資料
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中專','大專','本科','碩士','其他']
# 讓本科學歷離圓心遠一點
explode = [0,0,0.1,0,0]
# 將橫、縱座標軸標準化處理,保證餅圖是一個正圓,否則為橢圓
plt.axes(aspect='equal')
# 自定義顏色
colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] # 自定義顏色
# 繪製餅圖
plt.pie(x=edu, # 繪圖資料
explode = explode, # 突出顯示大專人群
labels = labels, # 新增教育水平標籤
colors = colors, # 設定餅圖的自定義填充色
autopct = '%.1f%%', # 設定百分比的格式,這裡保留一位小數
)
# 新增圖示題
plt.title('xxx 公司員工教育水平分佈')
# 儲存圖形
plt.savefig('pie_demo.png')
結果如下:
環形圖
環形圖其實是另一種餅圖,使用的還是上面的 pie()
這個方法,這裡只需要設定一下引數 wedgeprops 即可。
示例如下:
import matplotlib.pyplot as plt
# 中文和負號的正常顯示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 資料
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中專','大專','本科','碩士','其他']
# 讓本科學歷離圓心遠一點
explode = [0,0,0.1,0,0]
# 將橫、縱座標軸標準化處理,保證餅圖是一個正圓,否則為橢圓
plt.axes(aspect='equal')
# 自定義顏色
colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] # 自定義顏色
# 繪製餅圖
plt.pie(x=edu, # 繪圖資料
explode = explode, # 突出顯示大專人群
labels = labels, # 新增教育水平標籤
colors = colors, # 設定餅圖的自定義填充色
autopct = '%.1f%%', # 設定百分比的格式,這裡保留一位小數
wedgeprops = {'width': 0.3, 'edgecolor':'green'}
)
# 新增圖示題
plt.title('xxx 公司員工教育水平分佈')
# 儲存圖形
plt.savefig('pie_demo1.png')
這個示例僅僅在前面示例的基礎上增加了一個引數 wedgeprops
的設定,我們看下結果:
熱力圖
熱力圖用到的方法是 imshow()
,他的語法如下:
plt.imshow(x, cmap)
首先這裡要注意, x 是資料,但是一定要是矩陣形式的。
示例如下:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(10, 10)
plt.imshow(x, cmap=plt.cm.hot)
# 顯示右邊顏色條
plt.colorbar()
plt.savefig('imshow_demo.png')
結果如下:
Matplotlib 的常用圖表到這裡就要結束了,接下來,我們會接著介紹我們之前說過的 pyecharts 的常用圖表。
程式碼倉庫
老規矩,所有的示例程式碼都會上傳至程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。
示例程式碼-Github
示例程式碼-Gitee
參考
https://blog.csdn.net/kun1280437633/article/details/80841364
https://blog.csdn.net/claroja/article/details/72911