Python 數據分析三劍客之 Matplotlib(五):散點圖的繪製

小黃人番外短片合集 — 第11集【Evil Minion Animation Test 邪惡小黃人的憤怒測試】


Matplotlib 系列文章(持續更新中):



這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/105914929

【1x00】方法描述

matplotlib.pyplot.scatter() 方法可用於繪製散點圖。

本文用到的其他圖像屬性可參考前面的兩篇文章:

《Python 數據分析三劍客之 Matplotlib(二):文本描述 / 中文支持 / 畫布 / 網格等基本圖像屬性》
《Python 數據分析三劍客之 Matplotlib(三):圖例 / LaTeX / 刻度 / 子圖等基本圖像屬性》

基本語法:matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, alpha=None, linewidths=None, edgecolors=None, \*\*kwargs)

參數 描述
x,y 數據位置,標量或類似數組的形式
s 標記的大小,以磅爲單位,默認 rcParams['lines.markersize'] ** 2,即 6**2=36
color / c 標記的顏色,可以是單個顏色或者一個顏色列表
支持英文顏色名稱及其簡寫、十六進制顏色碼等,更多顏色示例參見官網 Color Demo
marker 標記的樣式,默認爲 rcParams["scatter.marker"] = 'o',更多樣式參見表一
cmap 將浮點數映射成顏色的顏色映射表,即一個 Colormap 實例或註冊的顏色表名,僅當 c 是浮點數數組時才使用 cmap
alpha 標記的透明度,float 類型,取值範圍:[0, 1],默認爲 1.0,即不透明
linewidths 標記邊緣的線寬,默認爲 rcParams["lines.linewidth"] = 1.5
edgecolors 標記邊緣的顏色,可以是單個顏色或者一個顏色列表
支持英文顏色名稱及其簡寫、十六進制顏色碼等,更多顏色示例參見官網 Color Demo
表一:marker 標記的樣式
標記 描述
"."
"," 像素點
"o" 圓圈
"v" 倒三角
"^" 正三角
"<" 左三角
">" 右三角
"1" 倒三叉星
"2" 正三叉星(類似奔馳車標形狀)
"3" 左三叉星
"4" 右三叉星
"8" 八邊形
"s" 正方形
"p" 五邊形
"P" 填充的加號(粗加號)
"+" 加號
"*" 星形
"h" 六邊形(底部是角)
"H" 六邊形(底部是邊)
"x" x 號
"X" 填充的 x 號(粗 x 號)
"D" 粗菱形(對角線相等)
"d" 細菱形(對角線不等)
"|" 垂直線
"_" 水平線
0 水平線靠左
1 水平線靠右
2 垂直線靠上
3 垂直線靠下
4 左三角(比 "<" 更細)
5 右三角(比 ">" 更細)
6 正三角(比 "^" 更細)
7 倒三角(比 "v" 更細)
8 左三角(比 "<" 更細,靠左顯示)
9 右三角(比 ">" 更細,靠右顯示)
10 正三角(比 "^" 更細,靠上顯示)
11 倒三角(比 "v" 更細,靠下顯示)
"None" / " " / "" 無樣式
'$...$' 支持 LaTeX 數學公式,表達式用美元符號包圍起來

【2x00】簡單示例

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 1)
y = np.array([3, 8, 1, 5, 7, 2, 3, 4, 5, 7])
plt.scatter(x, y)

plt.show()

01

【3x00】多條數據

繪製多條數據,設置不同數據,然後多次調用 plt.scatter() 函數即可,不同數據的線條顏色會不同,系統隨機,可單獨指定不同顏色。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2*np.pi, 2*np.pi, 1)
y1 = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.title('多數據散點圖示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')

plt.scatter(x, y1)
plt.scatter(x, y2)
plt.scatter(x, y3)

plt.show()

02

【4x00】設置顏色 / 樣式 / 圖例

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2*np.pi, 2*np.pi, 1)
y1 = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.title('散點圖自定義樣式示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')

plt.scatter(x, y1, color='g', s=30, label='(x, y1)')              # 默認綠色樣式
plt.scatter(x, y2, color='r', s=40, marker='d', label='(x, y2)')  # 紅色菱形
plt.scatter(x, y3, color='b', s=50, marker='2', label='(x, y3)')  # 藍色正三叉星

plt.legend(framealpha=0)    # 顯示圖例,設置爲全透明

plt.show()

03

【5x00】指定位置顯示文本註釋

matplotlib.pyplot.annotate() 方法可以在指定位置顯示文本註釋,參數解釋常見前文:
《Python 數據分析三劍客之 Matplotlib(二):文本描述 / 中文支持 / 畫布 / 網格等基本圖像屬性》

應用舉例:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
y = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]

plt.title('散點圖添加文本註釋示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
plt.xlim([0, 1])       # 設置 x 軸刻度的範圍
plt.ylim([0, 1])       # 設置 y 軸刻度的範圍

plt.scatter(x, y, marker='o', s=50)
for m, n in zip(x, y):
    plt.annotate('(%s,%s)' % (m, n),
                 xy=(m, n),
                 xytext=(0, -10),
                 textcoords='offset points',
                 ha='center',      # 點在註釋文本的中心
                 va='top')         # 點在註釋文本的上方

plt.show()

04

【6x00】隨機數據散點圖

隨機數據可以用 numpy 的 random 模塊來實現。

numpy.random.rand(d0, d1, …, dn):根據給定維度生成 [0,1) 之間的數據。

numpy.random.randn(d0, d1, …, dn) :返回一個或一組具有標準正態分佈的樣本。

numpy.random.randint(low, high, size):返回隨機整數,範圍區間爲 [low,high),size 爲數組維度大小

應用舉例:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

N = 1000
x = np.random.randn(N)
y = np.random.randn(N)

plt.title('散點圖隨機數據示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
plt.scatter(x, y, alpha=0.5)

plt.show()

05

【7x00】隨機顏色與色條

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

N = 1000
x = np.random.randn(N)
y = np.random.randn(N)

color = np.random.rand(N)
size = np.random.rand(N) * 1000

plt.figure(figsize=(8.4, 5.8))    # 設置畫布大小 840x580
plt.title('散點圖隨機大小顏色示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
plt.scatter(x, y, c=color, s=size, alpha=0.5)

plt.show()

06

可以用 plt.colorbar() 方法繪製顏色對照條。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

N = 1000
x = np.random.randn(N)
y = np.random.randn(N)

color = np.random.rand(N)
size = np.random.rand(N) * 1000

plt.figure(figsize=(8.4, 5.8))
plt.title('散點圖顏色對照條示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')
plt.scatter(x, y, c=color, s=size, alpha=0.5)
plt.colorbar()

plt.show()

07

【8x00】不同圖像之間的層級調整

zorder 參數用於設置不同圖像之間的層級關係,數字越大,所處的層級越大,即顯示越靠上。

未設置 zorder 參數前:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x1 = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x1)/x1
x2 = np.arange(-2*np.pi, 2*np.pi, 1)
y2 = np.sin(3*x2)/x2

plt.title('不同圖像之間層級調整示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')

plt.plot(x1, y1, c='b', linewidth=3.5, label='線性圖')
plt.scatter(x2, y2, c='r', s=40, label='散點圖')
plt.legend()

plt.show()

08

設置 zorder 參數後:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x1 = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x1)/x1
x2 = np.arange(-2*np.pi, 2*np.pi, 1)
y2 = np.sin(3*x2)/x2

plt.title('不同圖像之間層級調整示例')
plt.xlabel('x 軸')
plt.ylabel('y 軸')

plt.plot(x1, y1, zorder=1, c='b', linewidth=3.5, label='線性圖')
plt.scatter(x2, y2, zorder=2, c='r', s=40, label='散點圖')
plt.legend()

plt.show()

09

【9x00】框選部分數據

有時候我們希望能夠框選一部分數據來強調其重要性,matplotlib.patches.Polygon() 方法的作用是生成不規則的多邊形補丁,matplotlib.patches 還有另外的方法可以生成矩形、圓形等其他圖形,具體參見前面的文章《Python 數據分析三劍客之 Matplotlib(三):圖例 / LaTeX / 刻度 / 子圖 / 補丁等基本圖像屬性》,生成補丁之後,通過 axes.add_patch() 方法將其添加到繪圖區(axes)即可。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

plt.figure(figsize=(8.4, 5.8))

x1 = np.arange(0, 1000, 10)
y1 = np.random.randint(0, 1000, 100)
x2 = np.arange(0, 500, 10)
y2 = np.random.randint(200, 800, 50)
x3 = np.random.randint(50, 800, 80)
y3 = np.random.randint(50, 800, 80)
x4 = np.array([0, 100, 300, 400, 350, 500, 450, 367, 420, 490])
y4 = np.array([267, 800, 453, 500, 600, 420, 380, 503, 390, 600])

plt.title('散點圖數據框選示例', fontsize=15)
plt.xlabel('x 軸', fontsize=15)
plt.ylabel('y 軸', fontsize=15)
plt.scatter(x1, y1, c='r', s=50, alpha=0.7, label='RED')
plt.scatter(x2, y2, c='b', s=100, alpha=0.7, label='BLUE')
plt.scatter(x3, y3, c='g', s=150, alpha=0.7, label='GREEN')
plt.scatter(x4, y4, c='y', s=250, alpha=0.7, label='YELLOW')
plt.legend(loc='upper right', borderpad=1, edgecolor='k', framealpha=1, labelspacing=1)

Polygon_point = [[100, 800], [0, 267], [500, 420], [490, 600]]        # 多邊形補丁的頂點座標
polygon = mpathes.Polygon(Polygon_point, color='#FF69B4', alpha=0.3)  # 繪製補丁,框選部分數據
ax = plt.gca()          # 獲取當前繪圖區(gca = Get Current Axes)
ax.add_patch(polygon)   # 將補丁添加到當前繪圖區

plt.show()

10

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