15.Matplotlib-繪制散點圖

掃碼關注【牽引小哥講Python】,關注回復【資源】領取學習資源!
原創(chuàng)作者:牽引小哥
微信公眾號:牽引小哥講Python
注:轉載或復制請注明出處——牽引小哥
本期小哥主要講解散點圖的繪制方法。在Matplotlib中使用ax.scatter()函數(shù)繪制散點圖。官方參考鏈接:
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter
1. ax.scatter()的基礎用法
ax.scatter(x, y, s=None, c=None, marker=None, cmap=None, alpha=None, edgecolors=None, **kwargs)
關鍵參數(shù)說明:
- x:x軸數(shù)據(jù)序列
- y:y軸數(shù)據(jù)序列
- c:數(shù)據(jù)點的顏色,可以是單一顏色,也可是顏色序列
- marker:數(shù)據(jù)點形狀(默認圓形)
- camp:可對數(shù)據(jù)點指定色譜映射
- alpha:數(shù)據(jù)點透明度
- edgecolors:數(shù)據(jù)點輪廓顏色
- **kwargs:其他參數(shù)
應用舉例:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.size'] = 16
mpl.rcParams['figure.figsize'] = (6,5)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#%% 基礎用法
x = np.arange(0, 6, 0.2)
y1 = x**2
y2 = (x - 5.8)**2
# 根據(jù)數(shù)據(jù)特點定義數(shù)據(jù)點顏色和大小的映射序列
colors = np.linspace(y1.min(), y1.max(), len(x)) #顏色序列與y軸數(shù)值對應
size =15 * np.linspace(1, 10, len(x))
fig, ax = plt.subplots()
ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
# cmap='hsv'意為使用Matplotlib內置的‘hsv’色譜,更多講解可參考小哥之前關于顏色的文章
plt.show()
plt.tight_layout()

可以看到,數(shù)據(jù)點的顏色和大小均隨數(shù)值變化。
小哥Tips:數(shù)據(jù)點的size隨數(shù)據(jù)順序,由小變大。
接下來,小哥簡單講解下關于顏色和大小的映射順序問題。比如我們繪制y1,y2兩個關于x = 5.8對稱的函數(shù)散點圖:
# y1 = x**2
# y2 = (x - 5.8)**2
ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
ax.scatter(x, y2, s=size, c=colors, alpha=0.75, cmap='viridis')

從結果可以看出,數(shù)據(jù)點的大小并不對稱。為了使其對稱,就需要更改數(shù)據(jù)序列的順序,使其逆序。在這里,小哥使用數(shù)組切片技巧[: : -1]獲得元組的逆序結果。
ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
ax.scatter(x[::-1], y2[::-1], s=size, c=colors, alpha=0.75, cmap='hsv')

還可以為散點圖添加圖例:
scatter = ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
ax.legend(*scatter.legend_elements(), bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)

不同的顏色對應不同的與y軸的數(shù)值大小對應。
2. 離散數(shù)據(jù)的散點圖
對于離散的數(shù)據(jù)可以使用散點圖進行可視化。
np.random.seed(0)
fig, ax = plt.subplots()
citys = ['成都', '武漢', '重慶']
colors = ['blue', 'red', 'yellow']
for i in range(len(citys)):
color = colors[i]
city = citys[i]
n = 20
x, y = np.random.rand(2, n) # 生成隨機數(shù)數(shù)組
scale = 200.0 * np.random.rand(n)
ax.scatter(x, y, c=color, s=scale, label=city,
alpha=0.5, edgecolors='none')
ax.legend(loc='lower center', ncol=3, bbox_to_anchor=(0.5, 1))
ax.grid(color='k', linestyle='--', linewidth=0.2)
plt.show()
plt.tight_layout()
