Python使用Matplotlib和Seaborn繪制常用圖表的技巧
1. 引言:數(shù)據(jù)可視化的力量
在當(dāng)今數(shù)據(jù)爆炸的時(shí)代,我們每天都面臨著海量信息。如何從這些原始數(shù)據(jù)中提取有價(jià)值的洞察,并將其清晰、有效地傳達(dá)給他人?答案就是——數(shù)據(jù)可視化。
數(shù)據(jù)可視化是將數(shù)據(jù)以圖形或圖像的形式呈現(xiàn),幫助我們理解數(shù)據(jù)模式、趨勢(shì)、異常值和關(guān)系。它不僅僅是美化數(shù)據(jù),更是數(shù)據(jù)分析不可或缺的一環(huán)。一張精心設(shè)計(jì)的圖表,往往勝過(guò)千言萬(wàn)語(yǔ),能讓我們一眼洞察數(shù)據(jù)背后的故事。
Python作為數(shù)據(jù)科學(xué)領(lǐng)域的明星語(yǔ)言,擁有強(qiáng)大且豐富的可視化庫(kù),其中最著名的莫過(guò)于 Matplotlib 和 Seaborn。
- Matplotlib 是Python最基礎(chǔ)也是最核心的繪圖庫(kù),它提供了非常靈活的繪圖接口,可以繪制各種靜態(tài)、動(dòng)態(tài)、交互式的圖表。雖然其默認(rèn)樣式可能略顯樸素,但通過(guò)精細(xì)的控制,可以創(chuàng)建出任何你想要的圖表。
- Seaborn 是基于Matplotlib的高級(jí)統(tǒng)計(jì)圖表庫(kù),它提供了更美觀的默認(rèn)樣式和更高級(jí)的統(tǒng)計(jì)圖表類型,特別適合進(jìn)行探索性數(shù)據(jù)分析。Seaborn讓繪制復(fù)雜且具有統(tǒng)計(jì)學(xué)意義的圖表變得更加簡(jiǎn)單快捷。
本篇博客將作為數(shù)據(jù)可視化之旅的起點(diǎn),手把手帶領(lǐng)完全新手讀者,從零開始學(xué)習(xí)如何使用Matplotlib和Seaborn繪制常用圖表,并掌握一些基本的圖表定制技巧。
2. 前置知識(shí)與環(huán)境準(zhǔn)備
在開始繪圖之前,請(qǐng)確保您的Python環(huán)境中已安裝必要的庫(kù)。
2.1. 必備知識(shí)
- Python基礎(chǔ): 對(duì)Python語(yǔ)法、數(shù)據(jù)類型(列表、字典)、循環(huán)、函數(shù)等有基本了解。
- Pandas基礎(chǔ): 對(duì)DataFrame數(shù)據(jù)結(jié)構(gòu)有基本認(rèn)識(shí),知道如何創(chuàng)建、選擇和過(guò)濾數(shù)據(jù)。
2.2. 安裝所需庫(kù)
如果您尚未安裝 pandas, matplotlib 和 seaborn,可以使用 pip 命令進(jìn)行安裝:
pip install pandas matplotlib seaborn
2.3. 推薦開發(fā)環(huán)境
為了獲得最佳的學(xué)習(xí)體驗(yàn),我們強(qiáng)烈建議您使用 Jupyter Notebook 或 JupyterLab。它們提供了交互式的代碼執(zhí)行環(huán)境,可以即時(shí)看到繪圖結(jié)果,非常適合數(shù)據(jù)探索和可視化。
如果您使用VS Code等IDE,也可以直接運(yùn)行Python腳本。
3. 分步指南:從基礎(chǔ)到進(jìn)階的圖表繪制
我們將首先從Matplotlib的基礎(chǔ)圖表開始,然后過(guò)渡到Seaborn更高級(jí)和美觀的圖表。
3.1. 導(dǎo)入必要的庫(kù)
在任何繪圖代碼的開頭,通常都需要導(dǎo)入這些庫(kù):
import pandas as pd import numpy as np # NumPy常用于生成數(shù)值數(shù)據(jù) import matplotlib.pyplot as plt import seaborn as sns # 設(shè)置Matplotlib中文顯示,防止亂碼 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認(rèn)字體 plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像時(shí)負(fù)號(hào)'-'顯示為方塊的問(wèn)題
小貼士: plt.rcParams 的設(shè)置是為了讓Matplotlib能夠正確顯示中文標(biāo)簽和負(fù)號(hào)。如果您是在英文環(huán)境下,可以忽略此設(shè)置。
3.2. 準(zhǔn)備示例數(shù)據(jù)
為了演示,我們先創(chuàng)建一些簡(jiǎn)單的數(shù)據(jù)。
# 創(chuàng)建一個(gè)簡(jiǎn)單的DataFrame
data = {
'月份': ['一月', '二月', '三月', '四月', '五月', '六月'],
'銷售額': [150, 200, 180, 220, 250, 230],
'成本': [100, 120, 110, 130, 140, 135],
'利潤(rùn)': [50, 80, 70, 90, 110, 95],
'產(chǎn)品A銷量': [30, 45, 40, 50, 60, 55],
'產(chǎn)品B銷量': [20, 30, 25, 35, 40, 38],
'評(píng)分': [75, 80, 85, 70, 90, 88]
}
df = pd.DataFrame(data)
print("示例DataFrame:")
print(df)
# 創(chuàng)建一些用于直方圖和餅圖的額外數(shù)據(jù)
np.random.seed(42) # 為了結(jié)果可復(fù)現(xiàn)
scores = np.random.normal(loc=75, scale=10, size=100) # 模擬100個(gè)考試分?jǐn)?shù)
categories = ['電子產(chǎn)品', '服裝', '食品', '家居', '圖書']
sales_by_category = [400, 300, 200, 150, 100]
3.3. Matplotlib基礎(chǔ)繪圖
Matplotlib的繪圖流程通常是:plt.figure() (創(chuàng)建畫布,可選) -> plt.plot()/plt.scatter()/... (繪制圖表) -> plt.title()/plt.xlabel()/... (添加標(biāo)題和標(biāo)簽) -> plt.show() (顯示圖表)。
3.3.1. 折線圖 (Line Plot)
用途: 展現(xiàn)數(shù)據(jù)隨時(shí)間或其他連續(xù)變量變化的趨勢(shì)。
plt.figure(figsize=(10, 6)) # 設(shè)置圖表大小
plt.plot(df['月份'], df['銷售額'], marker='o', linestyle='-', color='skyblue', label='銷售額')
plt.plot(df['月份'], df['成本'], marker='x', linestyle='--', color='salmon', label='成本')
plt.title('月度銷售額與成本趨勢(shì)')
plt.xlabel('月份')
plt.ylabel('金額 (萬(wàn)元)')
plt.grid(True, linestyle='--', alpha=0.7) # 添加網(wǎng)格線
plt.legend() # 顯示圖例
plt.show()
3.3.2. 散點(diǎn)圖 (Scatter Plot)
用途: 探索兩個(gè)數(shù)值變量之間的關(guān)系,判斷是否存在相關(guān)性。
plt.figure(figsize=(8, 6))
plt.scatter(df['銷售額'], df['利潤(rùn)'], color='purple', alpha=0.7)
plt.title('銷售額與利潤(rùn)關(guān)系散點(diǎn)圖')
plt.xlabel('銷售額 (萬(wàn)元)')
plt.ylabel('利潤(rùn) (萬(wàn)元)')
plt.grid(True, linestyle=':', alpha=0.6)
plt.show()
3.3.3. 柱狀圖 (Bar Plot)
用途: 比較不同類別之間的數(shù)據(jù)大小。
plt.figure(figsize=(10, 6))
plt.bar(df['月份'], df['產(chǎn)品A銷量'], color='lightgreen', label='產(chǎn)品A銷量')
plt.bar(df['月份'], df['產(chǎn)品B銷量'], bottom=df['產(chǎn)品A銷量'], color='lightcoral', label='產(chǎn)品B銷量') # 堆疊柱狀圖
plt.title('月度產(chǎn)品銷量對(duì)比')
plt.xlabel('月份')
plt.ylabel('銷量 (件)')
plt.legend()
plt.show()
3.3.4. 直方圖 (Histogram)
用途: 顯示數(shù)值數(shù)據(jù)的分布情況,了解數(shù)據(jù)集中在哪個(gè)范圍,以及分布的形狀。
plt.figure(figsize=(8, 6))
plt.hist(scores, bins=10, color='teal', edgecolor='black', alpha=0.7) # bins參數(shù)控制分組數(shù)量
plt.title('學(xué)生考試分?jǐn)?shù)分布')
plt.xlabel('分?jǐn)?shù)')
plt.ylabel('人數(shù)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
3.3.5. 餅圖 (Pie Chart)
用途: 展現(xiàn)各部分在整體中所占的比例。
plt.figure(figsize=(8, 8))
plt.pie(sales_by_category, labels=categories, autopct='%1.1f%%', startangle=90, colors=sns.color_palette('pastel'))
# autopct='%1.1f%%' 顯示百分比
# startangle=90 從90度開始逆時(shí)針繪制
# colors=sns.color_palette('pastel') 使用Seaborn的調(diào)色板讓餅圖更美觀
plt.title('各產(chǎn)品類別銷售額占比')
plt.axis('equal') # 保證餅圖是正圓
plt.show()
3.3.6. 圖表定制化總結(jié)
Matplotlib提供了豐富的定制選項(xiàng):
plt.figure(figsize=(width, height)): 創(chuàng)建一個(gè)指定大小的畫布。plt.title('標(biāo)題'): 設(shè)置圖表主標(biāo)題。plt.xlabel('X軸標(biāo)簽'),plt.ylabel('Y軸標(biāo)簽'): 設(shè)置坐標(biāo)軸標(biāo)簽。plt.xticks(),plt.yticks(): 設(shè)置坐標(biāo)軸刻度。plt.grid(True): 添加網(wǎng)格線。plt.legend(): 顯示圖例。plt.xlim(),plt.ylim(): 設(shè)置坐標(biāo)軸范圍。color='...',marker='...',linestyle='...',alpha=...: 控制線條顏色、標(biāo)記、樣式和透明度。plt.savefig('my_plot.png'): 保存圖表到文件。
3.4. Seaborn增強(qiáng)繪圖
Seaborn在Matplotlib的基礎(chǔ)上進(jìn)行了封裝,提供了更高級(jí)的API和更美觀的默認(rèn)樣式,尤其擅長(zhǎng)繪制統(tǒng)計(jì)圖表。
為了更好地展示Seaborn的特性,我們加載一個(gè)Seaborn自帶的經(jīng)典數(shù)據(jù)集 tips。
# 加載Seaborn自帶數(shù)據(jù)集
tips = sns.load_dataset('tips')
print("\nSeaborn 'tips' 數(shù)據(jù)集:")
print(tips.head())
3.4.1. 關(guān)系圖 (Relational Plots)
Seaborn的 relplot() 可以方便地創(chuàng)建散點(diǎn)圖和折線圖,并支持通過(guò) col, row, hue, size, style 等參數(shù)創(chuàng)建多維度視圖。
- 散點(diǎn)圖 (
scatterplot)
plt.figure(figsize=(10, 6))
sns.scatterplot(x='total_bill', y='tip', hue='time', style='smoker', size='size', data=tips)
plt.title('用餐總金額與小費(fèi)關(guān)系 (按用餐時(shí)間與吸煙者區(qū)分)')
plt.xlabel('用餐總金額 ($)')
plt.ylabel('小費(fèi) ($)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
3.4.2. 分布圖 (Distribution Plots)
- 直方圖 (
histplot)
plt.figure(figsize=(10, 6))
sns.histplot(data=tips, x='total_bill', kde=True, hue='sex', palette='viridis')
# kde=True 會(huì)在直方圖上疊加核密度估計(jì)曲線
# hue='sex' 按性別進(jìn)行分組顯示
plt.title('用餐總金額分布 (按性別)')
plt.xlabel('用餐總金額 ($)')
plt.ylabel('計(jì)數(shù)')
plt.show()
- 核密度估計(jì)圖 (
kdeplot)
plt.figure(figsize=(10, 6))
sns.kdeplot(data=tips, x='total_bill', hue='time', fill=True, palette='coolwarm')
plt.title('用餐總金額核密度估計(jì) (按用餐時(shí)間)')
plt.xlabel('用餐總金額 ($)')
plt.ylabel('密度')
plt.show()
3.4.3. 分類圖 (Categorical Plots)
- 柱狀圖 (
barplot)
plt.figure(figsize=(10, 6))
sns.barplot(x='day', y='total_bill', hue='sex', data=tips, palette='deep')
plt.title('每日用餐總金額均值 (按性別)')
plt.xlabel('星期幾')
plt.ylabel('用餐總金額均值 ($)')
plt.show()
- 計(jì)數(shù)圖 (
countplot)
plt.figure(figsize=(8, 6))
sns.countplot(x='day', hue='time', data=tips, palette='pastel')
plt.title('每日用餐次數(shù) (按用餐時(shí)間)')
plt.xlabel('星期幾')
plt.ylabel('用餐次數(shù)')
plt.show()
- 箱線圖 (
boxplot)
用途: 顯示數(shù)值數(shù)據(jù)的五數(shù)概括(最小值、下四分位數(shù)、中位數(shù)、上四分位數(shù)、最大值)和異常值。
plt.figure(figsize=(10, 6))
sns.boxplot(x='day', y='total_bill', hue='smoker', data=tips, palette='muted')
plt.title('每日用餐總金額分布 (按吸煙者)')
plt.xlabel('星期幾')
plt.ylabel('用餐總金額 ($)')
plt.show()
- 小提琴圖 (
violinplot)
用途: 結(jié)合了箱線圖和核密度估計(jì)圖的特點(diǎn),更詳細(xì)地展示數(shù)據(jù)的分布形狀。
plt.figure(figsize=(10, 6))
sns.violinplot(x='day', y='tip', hue='sex', data=tips, palette='viridis', inner='quartile')
# inner='quartile' 顯示四分位數(shù)線
plt.title('每日小費(fèi)金額分布 (按性別)')
plt.xlabel('星期幾')
plt.ylabel('小費(fèi) ($)')
plt.show()
3.4.4. 熱力圖 (Heatmap)
用途: 可視化矩陣數(shù)據(jù),尤其適用于展示相關(guān)性矩陣。
# 計(jì)算tips數(shù)據(jù)集中數(shù)值列的相關(guān)性矩陣
correlation_matrix = tips[['total_bill', 'tip', 'size']].corr()
plt.figure(figsize=(8, 7))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=.5)
# annot=True 在熱力圖上顯示數(shù)值
# cmap='coolwarm' 設(shè)置顏色映射
# fmt=".2f" 格式化數(shù)值為兩位小數(shù)
plt.title('用餐數(shù)據(jù)數(shù)值變量相關(guān)性熱力圖')
plt.show()
4. 常見(jiàn)陷阱與注意事項(xiàng)
作為初學(xué)者,在進(jìn)行數(shù)據(jù)可視化時(shí)容易犯一些錯(cuò)誤。了解這些陷阱可以幫助您創(chuàng)建更有效、更準(zhǔn)確的圖表。
- 選擇錯(cuò)誤的圖表類型:
- 錯(cuò)誤: 用餅圖展示多個(gè)類別之間的趨勢(shì)(餅圖只適合展示部分與整體的比例,類別過(guò)多或需要看趨勢(shì)時(shí)應(yīng)避免)。
- 正確: 趨勢(shì)用折線圖,比較用柱狀圖,分布用直方圖/KDE圖,關(guān)系用散點(diǎn)圖。
- 圖表信息不完整:
- 陷阱: 缺少標(biāo)題、X/Y軸標(biāo)簽、單位,或者圖例不清晰。
- 解決方案: 始終為圖表添加清晰、描述性的標(biāo)題和標(biāo)簽,確保讀者無(wú)需額外解釋就能理解圖表內(nèi)容。
- 數(shù)據(jù)量過(guò)大導(dǎo)致重疊 (Overplotting):
- 陷阱: 在散點(diǎn)圖中,如果數(shù)據(jù)點(diǎn)過(guò)多,它們會(huì)相互重疊,導(dǎo)致無(wú)法看清 真實(shí)分布。
- 解決方案: 考慮使用透明度 (
alpha參數(shù)),或者使用hexbin圖、2D核密度估計(jì)圖(sns.kdeplot(..., kind='hist'))等替代方案。
- 誤導(dǎo)性可視化:
- 陷阱: 坐標(biāo)軸沒(méi)有從零開始,或者坐標(biāo)軸范圍設(shè)置不當(dāng),可能夸大或縮小數(shù)據(jù)的差異。
- 解決方案: 除非有充分理由,否則Y軸通常應(yīng)從零開始。謹(jǐn)慎設(shè)置坐標(biāo)軸范圍,確保真實(shí)反映數(shù)據(jù)。
- 顏色選擇不當(dāng):
- 陷阱: 使用過(guò)多顏色,或者顏色對(duì)比度不足,導(dǎo)致圖表難以閱讀,特別是對(duì)于色盲用戶。
- 解決方案: 優(yōu)先使用Seaborn提供的調(diào)色板,它們通常經(jīng)過(guò)優(yōu)化。對(duì)于分類數(shù)據(jù),選擇區(qū)分度高的顏色;對(duì)于連續(xù)數(shù)據(jù),選擇漸變色。
5. 總結(jié)
數(shù)據(jù)可視化是一項(xiàng)實(shí)踐性很強(qiáng)的技能。要真正掌握它,需要不斷地練習(xí)和嘗試。從簡(jiǎn)單的數(shù)據(jù)集開始,嘗試?yán)L制不同類型的圖表,并不斷調(diào)整參數(shù)和樣式,直到您能自信地用圖表講述數(shù)據(jù)的故事。
記住,好的可視化不僅僅是代碼的堆砌,更是對(duì)數(shù)據(jù)洞察的藝術(shù)表達(dá)。祝您在數(shù)據(jù)可視化的旅程中取得豐碩的成果!
以上就是Python使用Matplotlib和Seaborn繪制常用圖表的技巧的詳細(xì)內(nèi)容,更多關(guān)于Python Matplotlib和Seaborn繪制圖表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3字符串輸出常見(jiàn)面試題總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python3字符串輸出常見(jiàn)面試題總結(jié)內(nèi)容,有需要的朋友們可以參考下。2020-12-12
使用python 計(jì)算百分位數(shù)實(shí)現(xiàn)數(shù)據(jù)分箱代碼
這篇文章主要介紹了使用python 計(jì)算百分位數(shù)實(shí)現(xiàn)數(shù)據(jù)分箱代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例
今天小編就為大家分享一篇python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例
今天小編就為大家分享一篇python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
如何給pip更換國(guó)內(nèi)源并配置Python的國(guó)內(nèi)鏡像詳解
pip安裝的包都存在于外國(guó)的服務(wù)器上,速度會(huì)非常慢,可以給pip配置國(guó)內(nèi)鏡像,直接從國(guó)內(nèi)服務(wù)器安裝依賴,這篇文章主要介紹了如何給pip更換國(guó)內(nèi)源并配置Python的國(guó)內(nèi)鏡像的相關(guān)資料,需要的朋友可以參考下2025-04-04
pip 安裝庫(kù)比較慢的解決方法(國(guó)內(nèi)鏡像)
對(duì)于Python開發(fā)用戶來(lái)講,PIP安裝軟件包是家常便飯。但國(guó)外的源下載速度實(shí)在太慢,浪費(fèi)時(shí)間。而且經(jīng)常出現(xiàn)下載后安裝出錯(cuò)問(wèn)題,所以把PIP安裝源替換成國(guó)內(nèi)鏡像,可以大幅提升下載速度,還可以提高安裝成功率2019-10-10

