Python使用Matplotlib繪制Swarm Plot(蜂群圖)的代碼步驟
Swarm Plot(蜂群圖)是一種數(shù)據(jù)可視化圖表,它用于展示分類數(shù)據(jù)的分布情況。這種圖表通過將數(shù)據(jù)點(diǎn)沿著一個(gè)或多個(gè)分類變量輕微地分散,以避免它們之間的重疊,從而更好地顯示數(shù)據(jù)的分布密度和分布趨勢(shì)。Swarm Plot特別適用于較小的數(shù)據(jù)集。
為什么使用Swarm Plots?
蜂群圖在以下情況下非常有利:
- 可視化類別內(nèi)的點(diǎn)分布。
- 識(shí)別數(shù)據(jù)中的模式或離群值。
- 通過顯示單個(gè)數(shù)據(jù)點(diǎn)來(lái)補(bǔ)充其他圖,如箱形圖或小提琴圖。
但是,它們可能會(huì)因大型數(shù)據(jù)集而變得混亂,并且可能不適合涉及多個(gè)變量的復(fù)雜關(guān)系。
使用Matplotlib創(chuàng)建Swarm Plots
雖然Seaborn提供了一種簡(jiǎn)單的方法來(lái)創(chuàng)建蜂群圖,但Matplotlib沒有用于這種類型圖的內(nèi)置函數(shù)。但是,您可以通過編寫自定義函數(shù)來(lái)創(chuàng)建類似的效果。
要在Matplotlib中創(chuàng)建蜂群圖,關(guān)鍵是操縱數(shù)據(jù)點(diǎn)的x軸位置,使它們水平間隔開,避免重疊,同時(shí)保持它們的分類分組。
步驟1:導(dǎo)入所需的庫(kù)
首先導(dǎo)入必要的庫(kù),例如Matplotlib、NumPy和Pandas以進(jìn)行數(shù)據(jù)操作。以下是如何使用Matplotlib創(chuàng)建蜂群圖的示例:
import matplotlib.pyplot as plt import numpy as np import pandas as pd
步驟2:生成示例數(shù)據(jù)
對(duì)于本文,讓我們創(chuàng)建一個(gè)表示多個(gè)類別和數(shù)值數(shù)據(jù)的隨機(jī)數(shù)據(jù)集。您可以將其替換為您想要可視化的任何數(shù)據(jù)集。
# Create a sample dataset
np.random.seed(0)
categories = ['A', 'B', 'C']
data = {
'Category': np.random.choice(categories, size=150),
'Value': np.random.randn(150)
}
df = pd.DataFrame(data)
步驟3:散點(diǎn)圖準(zhǔn)備
使用Matplotlib的散點(diǎn)函數(shù)繪制各個(gè)點(diǎn)。y軸表示值,而x軸表示類別。
# Create a basic scatter plot
plt.scatter(df['Category'], df['Value'])
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Basic Scatter Plot')
plt.show()
輸出

在這個(gè)階段,點(diǎn)將重疊,特別是在密集區(qū)域。下一步是將點(diǎn)隔開,以獲得更清晰的群體圖效果。
步驟4:添加抖動(dòng)以避免重疊
為了避免數(shù)據(jù)點(diǎn)重疊,您可以向x軸位置添加抖動(dòng)(一個(gè)小的隨機(jī)變化)。這將模擬群集圖的效果,其中點(diǎn)水平分布。
def add_jitter(x, scale=0.05):
return x + np.random.uniform(-scale, scale, size=len(x))
df['Jittered_Category'] = df['Category'].apply(lambda x: categories.index(x))
df['Jittered_Category'] = add_jitter(df['Jittered_Category'])
# Create a scatter plot with jittered points
plt.scatter(df['Jittered_Category'], df['Value'], alpha=0.7)
plt.xticks(ticks=range(len(categories)), labels=categories)
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Swarm Plot with Jittered Points')
plt.show()

在這里,add_jitter用于稍微移動(dòng)每個(gè)類別中的點(diǎn)的x軸位置。這樣可以防止重疊,并使點(diǎn)沿分類軸均勻分布。
自定義蜂群圖
1. 使用注釋增強(qiáng)蜂群圖
您可以向蜂群圖添加文本注釋以突出顯示某些數(shù)據(jù)點(diǎn)。當(dāng)您想要指出特定的值或類別時(shí),這特別有用。注釋有助于強(qiáng)調(diào)特定的數(shù)據(jù)點(diǎn)并提供額外的上下文。
# Add annotations to the plot
plt.scatter(df['Jittered_Category'], df['Value'], s=50, alpha=0.6)
plt.xticks(ticks=range(len(categories)), labels=categories)
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Swarm Plot with Annotations')
# Highlight a point
highlight = df.iloc[10]
plt.annotate('Highlighted Point', (highlight['Jittered_Category'], highlight['Value']),
xytext=(10, 20), textcoords='offset points', arrowprops=dict(arrowstyle='->'))
plt.show()

2. 為不同類別添加顏色
要區(qū)分類別,可以使用散點(diǎn)圖中的c參數(shù)為每個(gè)類別添加不同的顏色。

將蜂群圖與其他圖類型疊加
蜂群圖可以與其他類型的圖(如箱線圖或小提琴圖)結(jié)合使用,以提供更全面的數(shù)據(jù)分布視圖。例如,您可以將群圖疊加在箱形圖上。
# Create a box plot
plt.boxplot([df[df['Category'] == cat]['Value'] for cat in categories], positions=range(len(categories)))
# Overlay the swarm plot
plt.scatter(df['Jittered_Category'], df['Value'], c=df['Color'], s=50, alpha=0.6)
plt.xticks(ticks=range(len(categories)), labels=categories)
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Swarm Plot Overlayed on Box Plot')
plt.show()

Tips和最佳實(shí)踐
- 數(shù)據(jù)縮放:確保x軸正確縮放,以適應(yīng)抖動(dòng),而不會(huì)過度重疊。
- 抖動(dòng)靈敏度:您添加的抖動(dòng)量應(yīng)根據(jù)數(shù)據(jù)的密度進(jìn)行調(diào)整。太多的抖動(dòng)會(huì)使圖形混亂。
- 小心使用顏色和標(biāo)記:顏色和形狀的選擇應(yīng)避免混淆,特別是在具有許多類別的復(fù)雜圖中。
總結(jié)
在Matplotlib中創(chuàng)建蜂群圖需要手動(dòng)操作數(shù)據(jù)點(diǎn)的x軸位置以避免重疊。雖然像Seaborn這樣的庫(kù)簡(jiǎn)化了這個(gè)過程,但Matplotlib提供了根據(jù)特定需求定制蜂群圖的靈活性。通過添加抖動(dòng)、調(diào)整點(diǎn)大小和透明度以及使用顏色和標(biāo)記形狀,您可以創(chuàng)建有效且視覺上吸引人的蜂群圖。
以上就是Python使用Matplotlib繪制Swarm Plot(蜂群圖)的代碼步驟的詳細(xì)內(nèi)容,更多關(guān)于Python Matplotlib繪制Swarm Plot的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python安全獲取域管理員權(quán)限幾種方式操作示例
在不考慮直接攻擊域控的情況下,如何快速獲取域管理員權(quán)限呢?本文分享幾種常見的獲取域管理員權(quán)限的方式,有需要的朋友可以借鑒參考下2021-10-10
python基于paramiko將文件上傳到服務(wù)器代碼實(shí)現(xiàn)
這篇文章主要介紹了python基于paramiko將文件上傳到服務(wù)器代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
在Python 2.7即將停止支持時(shí),我們?yōu)槟銕?lái)了一份python 3.x遷移指南
這篇文章主要介紹了在Python 2.7即將停止支持時(shí)我們?yōu)槟銣?zhǔn)備了一份python 3.x遷移指南的相關(guān)資料,需要的朋友可以參考下2018-01-01
Python必備shelve與dbm本地持久化存儲(chǔ)數(shù)據(jù)的兩個(gè)強(qiáng)大工具
當(dāng)涉及存儲(chǔ)大量數(shù)據(jù)并且需要高效訪問時(shí),shelve和dbm模塊是Python中用于本地持久化存儲(chǔ)數(shù)據(jù)的兩個(gè)強(qiáng)大工具,它們?cè)试S開發(fā)人員以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù),并支持快速的檢索和更新操作,在本文將深入探討這兩個(gè)模塊,展示它們的優(yōu)勢(shì)和應(yīng)用場(chǎng)景2024-01-01
python計(jì)算寄送包裹重量的實(shí)現(xiàn)過程
要實(shí)現(xiàn)這樣一個(gè)需求寄送包裹小于5kg,每公斤0.5元,大于等于5kg,超出5公斤部分,按照每公斤0.8元計(jì)算,輸入重量,輸出應(yīng)付金額,下面小編給大家分享實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧2022-02-02

