零基礎(chǔ)學(xué)習(xí) Python 可視化:Matplotlib、Seaborn、Plotly 基礎(chǔ)教學(xué)
在這個(gè)“數(shù)據(jù)爆炸”的時(shí)代,我們每天都會(huì)接觸到大量數(shù)據(jù)——比如手機(jī)里的運(yùn)動(dòng)步數(shù)、電商平臺(tái)的購(gòu)物記錄、公司的銷(xiāo)售報(bào)表。但 raw data(原始數(shù)據(jù))本身是枯燥的,就像一堆散落的拼圖碎片,無(wú)法直接告訴我們“發(fā)生了什么”“為什么發(fā)生”。
而數(shù)據(jù)可視化就是把這些碎片拼成一幅完整的畫(huà)。它用圖表、圖形、互動(dòng)元素代替冰冷的數(shù)字,讓數(shù)據(jù)“說(shuō)話”。比如:
- 用折線圖看銷(xiāo)量的月度趨勢(shì),一眼就能發(fā)現(xiàn)“618”或“雙11”的峰值;
- 用散點(diǎn)圖看身高與體重的關(guān)系,能快速識(shí)別“肥胖”或“偏瘦”的群體;
- 用熱力圖看用戶在網(wǎng)頁(yè)上的點(diǎn)擊分布,能優(yōu)化產(chǎn)品的界面設(shè)計(jì)。
Python作為當(dāng)前最流行的編程語(yǔ)言之一,憑借豐富的可視化庫(kù)(Matplotlib、Seaborn、Plotly等)、簡(jiǎn)單的語(yǔ)法(比Java、C++容易上手)和強(qiáng)大的生態(tài)(與Pandas、Numpy等數(shù)據(jù)處理庫(kù)無(wú)縫銜接),成為數(shù)據(jù)可視化的“首選工具”。
哪怕你是完全沒(méi)接觸過(guò)編程的新手,只要跟著這篇文章一步步做,也能在1個(gè)月內(nèi)掌握Python可視化的核心技能,用數(shù)據(jù)講故事。
一、準(zhǔn)備工作:搭建你的可視化環(huán)境
在開(kāi)始之前,我們需要先搭建Python的開(kāi)發(fā)環(huán)境。對(duì)于新手來(lái)說(shuō),Anaconda是最佳選擇——它自帶了Python解釋器、常用庫(kù)(如Matplotlib、Pandas、Seaborn)和開(kāi)發(fā)工具(Jupyter Notebook),省去了手動(dòng)安裝的麻煩。
1. 安裝Anaconda
- 下載地址:Anaconda官方網(wǎng)站(選擇對(duì)應(yīng)系統(tǒng)的版本,比如Windows、macOS);
- 安裝步驟:雙擊安裝包,一路點(diǎn)擊“Next”(注意勾選“Add Anaconda to PATH”,方便在命令行中使用)。
2. 驗(yàn)證環(huán)境是否安裝成功
打開(kāi)Anaconda Prompt(Windows)或終端(macOS),輸入以下命令:
python --version # 查看Python版本,應(yīng)該顯示3.8及以上
conda list matplotlib # 查看Matplotlib是否安裝,顯示版本號(hào)即成功
3. 選擇開(kāi)發(fā)工具
推薦使用Jupyter Notebook(Anaconda自帶),它能將代碼、圖表、注釋放在同一個(gè)文檔中,非常適合學(xué)習(xí)和展示。啟動(dòng)方式:
- 打開(kāi)Anaconda Navigator,點(diǎn)擊“Jupyter Notebook”;
- 在瀏覽器中會(huì)打開(kāi)Jupyter界面,點(diǎn)擊“New”→“Python 3”,創(chuàng)建一個(gè)新的 Notebook。
二、基礎(chǔ)篇:用Matplotlib畫(huà)第一個(gè)圖表
Matplotlib是Python中最基礎(chǔ)、最常用的可視化庫(kù),被稱為“可視化界的Photoshop”——它能繪制幾乎所有類(lèi)型的圖表,且高度可定制。
1. 第一個(gè)折線圖:展示銷(xiāo)量趨勢(shì)
假設(shè)我們有一組2024年上半年的銷(xiāo)量數(shù)據(jù),想看看每月的增長(zhǎng)趨勢(shì)。步驟如下:
(1) 導(dǎo)入庫(kù)
首先需要導(dǎo)入Matplotlib的pyplot模塊(通??s寫(xiě)為plt):
import matplotlib.pyplot as plt
(2) 準(zhǔn)備數(shù)據(jù)
用列表存儲(chǔ)月份和銷(xiāo)量數(shù)據(jù):
months = ['1月', '2月', '3月', '4月', '5月', '6月'] # x軸:月份
sales = [120, 150, 180, 200, 220, 250] # y軸:銷(xiāo)量(萬(wàn)元)
(3) 繪制折線圖
用plt.plot()函數(shù)繪制折線圖,參數(shù)說(shuō)明:
- months:x軸數(shù)據(jù);
- sales:y軸數(shù)據(jù);
- marker='o':在折線上添加圓形標(biāo)記(方便看每個(gè)點(diǎn)的數(shù)值);
- color='b':折線顏色為藍(lán)色(b=blue);
- label='銷(xiāo)量趨勢(shì)':圖例標(biāo)簽(用于說(shuō)明圖表內(nèi)容)。
代碼:
plt.plot(months, sales, marker='o', color='b', label='銷(xiāo)量趨勢(shì)')
(4) 添加圖表元素
為了讓圖表更清晰,需要添加x軸標(biāo)簽、y軸標(biāo)簽、標(biāo)題和圖例:
plt.xlabel('月份') # x軸標(biāo)簽
plt.ylabel('銷(xiāo)量(萬(wàn)元)') # y軸標(biāo)簽
plt.title('2024年上半年銷(xiāo)量趨勢(shì)') # 圖表標(biāo)題
plt.legend() # 顯示圖例(對(duì)應(yīng)label參數(shù))
(5) 顯示圖表
最后用plt.show()函數(shù)顯示圖表:
plt.show()
(6) 效果展示
運(yùn)行以上代碼,會(huì)彈出一個(gè)窗口,顯示一張藍(lán)色折線圖:折線上的每個(gè)點(diǎn)都有圓形標(biāo)記,x軸是月份,y軸是銷(xiāo)量,標(biāo)題清晰,圖例說(shuō)明“銷(xiāo)量趨勢(shì)”。從圖中可以明顯看到,銷(xiāo)量從1月的120萬(wàn)元穩(wěn)步增長(zhǎng)到6月的250萬(wàn)元,增長(zhǎng)趨勢(shì)明顯。
2. 擴(kuò)展:繪制其他基礎(chǔ)圖表
Matplotlib支持多種圖表類(lèi)型,以下是幾個(gè)常用的例子:
(1) 柱狀圖:比較不同產(chǎn)品的銷(xiāo)量
用plt.bar()函數(shù)繪制柱狀圖,適合比較類(lèi)別數(shù)據(jù)(如不同產(chǎn)品、不同地區(qū)的銷(xiāo)量):
products = ['產(chǎn)品A', '產(chǎn)品B', '產(chǎn)品C', '產(chǎn)品D'] # 產(chǎn)品類(lèi)別
product_sales = [300, 250, 400, 350] # 各產(chǎn)品銷(xiāo)量
plt.bar(products, product_sales, color=['r', 'g', 'b', 'y']) # 柱狀圖,不同產(chǎn)品用不同顏色
plt.xlabel('產(chǎn)品類(lèi)別')
plt.ylabel('銷(xiāo)量(萬(wàn)元)')
plt.title('2024年上半年產(chǎn)品銷(xiāo)量對(duì)比')
plt.show()
(2) 散點(diǎn)圖:看身高與體重的相關(guān)性
用plt.scatter()函數(shù)繪制散點(diǎn)圖,適合展示兩個(gè)變量之間的關(guān)系(如身高與體重、廣告投入與銷(xiāo)售額):
height = [160, 165, 170, 175, 180] # 身高(cm)
weight = [50, 55, 60, 65, 70] # 體重(kg)
plt.scatter(height, weight, marker='s', color='purple', s=100) # 散點(diǎn)圖,正方形標(biāo)記,紫色,大小100
plt.xlabel('身高(cm)')
plt.ylabel('體重(kg)')
plt.title('身高與體重的相關(guān)性')
plt.show()
(3) 餅圖:展示產(chǎn)品銷(xiāo)量占比
用plt.pie()函數(shù)繪制餅圖,適合展示各部分占總體的比例(如產(chǎn)品銷(xiāo)量占比、用戶來(lái)源占比):
product_sales = [300, 250, 400, 350] # 各產(chǎn)品銷(xiāo)量
products = ['產(chǎn)品A', '產(chǎn)品B', '產(chǎn)品C', '產(chǎn)品D'] # 產(chǎn)品類(lèi)別
plt.pie(product_sales, labels=products, autopct='%1.1f%%', startangle=90) # 餅圖,顯示百分比,起始角度90度
plt.title('2024年上半年產(chǎn)品銷(xiāo)量占比')
plt.show()
三、進(jìn)階篇:用Seaborn讓圖表更“專(zhuān)業(yè)”
Matplotlib的優(yōu)點(diǎn)是靈活,但缺點(diǎn)是默認(rèn)樣式不夠美觀,而且繪制統(tǒng)計(jì)圖表(如直方圖、箱線圖)需要寫(xiě)較多代碼。這時(shí),Seaborn就派上用場(chǎng)了——它是基于Matplotlib的高級(jí)可視化庫(kù),自帶漂亮的默認(rèn)樣式,且能快速繪制統(tǒng)計(jì)圖表。
1. Seaborn的優(yōu)勢(shì)
- 默認(rèn)樣式美觀:Seaborn的默認(rèn)顏色搭配和布局比Matplotlib更符合現(xiàn)代審美;
- 代碼更簡(jiǎn)潔:繪制統(tǒng)計(jì)圖表只需一行代碼,無(wú)需手動(dòng)設(shè)置太多參數(shù);
- 支持統(tǒng)計(jì)分析:能快速計(jì)算數(shù)據(jù)的分布、相關(guān)性等統(tǒng)計(jì)指標(biāo),并可視化。
2. 安裝Seaborn
如果Anaconda沒(méi)自帶Seaborn,可以用以下命令安裝:
conda install seaborn
3. 用Seaborn繪制統(tǒng)計(jì)圖表
(1) 直方圖:展示數(shù)據(jù)分布
用seaborn.histplot()函數(shù)繪制直方圖,適合展示連續(xù)變量的分布(如身高、體重、銷(xiāo)售額的分布):
import seaborn as sns
import matplotlib.pyplot as plt
# 加載Seaborn自帶的iris數(shù)據(jù)集(鳶尾花數(shù)據(jù),包含花瓣長(zhǎng)度、寬度等特征)
iris = sns.load_dataset('iris')
# 繪制花瓣長(zhǎng)度的直方圖, bins=20表示將數(shù)據(jù)分成20個(gè)區(qū)間
sns.histplot(iris['petal_length'], bins=20, color='green', kde=True) # kde=True表示添加核密度估計(jì)曲線
plt.xlabel('花瓣長(zhǎng)度(cm)')
plt.ylabel('數(shù)量')
plt.title('鳶尾花花瓣長(zhǎng)度分布')
plt.show()
(2) 箱線圖:展示數(shù)據(jù)的離散程度
用seaborn.boxplot()函數(shù)繪制箱線圖,適合展示數(shù)據(jù)的中位數(shù)、四分位數(shù)、異常值(如不同產(chǎn)品銷(xiāo)量的離散程度):
# 用iris數(shù)據(jù)集的花瓣長(zhǎng)度,按物種分組繪制箱線圖
sns.boxplot(x='species', y='petal_length', data=iris, palette='Set2') # palette='Set2'表示使用Set2顏色 palette
plt.xlabel('物種')
plt.ylabel('花瓣長(zhǎng)度(cm)')
plt.title('不同物種鳶尾花花瓣長(zhǎng)度分布')
plt.show()
(3) 配對(duì)圖:探索多變量關(guān)系
用seaborn.pairplot()函數(shù)繪制配對(duì)圖,適合展示多個(gè)變量之間的兩兩關(guān)系(如iris數(shù)據(jù)集中四個(gè)特征的相關(guān)性):
# 繪制配對(duì)圖,按物種分組(hue='species'),不同物種用不同顏色
sns.pairplot(iris, hue='species', palette='husl')
plt.title('鳶尾花特征配對(duì)圖')
plt.show()
(4) 效果展示
Seaborn的圖表默認(rèn)樣式非常漂亮,比如配對(duì)圖中,每個(gè)子圖展示兩個(gè)特征的關(guān)系,不同物種用不同顏色標(biāo)記,能快速發(fā)現(xiàn)“ versicolor 物種的花瓣長(zhǎng)度比 setosa 長(zhǎng)”這樣的規(guī)律。
四、高級(jí)篇:用Plotly做交互式可視化
前面的Matplotlib和Seaborn繪制的是靜態(tài)圖表,無(wú)法與用戶互動(dòng)。而Plotly是一個(gè)交互式可視化庫(kù),能繪制可縮放、可 hover、可點(diǎn)擊的圖表,非常適合做網(wǎng)頁(yè)展示或報(bào)告。
1. Plotly的優(yōu)勢(shì)
- 交互式:鼠標(biāo) hover 能看到具體數(shù)值,縮放、拖動(dòng)圖表能查看細(xì)節(jié);
- 跨平臺(tái):能導(dǎo)出為HTML文件,在瀏覽器中打開(kāi),無(wú)需安裝任何軟件;
- 支持復(fù)雜圖表:如熱力圖、地圖、3D圖表等。
2. 安裝Plotly
用以下命令安裝Plotly:
conda install plotly
3. 用Plotly繪制交互式圖表
(1) 交互式折線圖:展示各國(guó)GDP增長(zhǎng)趨勢(shì)
用plotly.express.line()函數(shù)繪制交互式折線圖,數(shù)據(jù)用Plotly自帶的gapminder數(shù)據(jù)集(包含各國(guó)的GDP、人口等數(shù)據(jù)):
import plotly.express as px
# 加載gapminder數(shù)據(jù)集
gapminder = px.data.gapminder()
# 繪制交互式折線圖:x軸是年份,y軸是GDP per Capita,按國(guó)家分組(color='country')
fig = px.line(gapminder, x='year', y='gdpPercap', color='country', title='各國(guó)GDP per Capita增長(zhǎng)趨勢(shì)')
# 顯示圖表(在瀏覽器中打開(kāi))
fig.show()
(2) 交互式散點(diǎn)圖:展示GDP與預(yù)期壽命的關(guān)系
用plotly.express.scatter()函數(shù)繪制交互式散點(diǎn)圖,添加大小(表示人口)和顏色(表示 continent):
# 繪制交互式散點(diǎn)圖:x軸是GDP per Capita,y軸是預(yù)期壽命,大小表示人口,顏色表示 continent
fig = px.scatter(gapminder, x='gdpPercap', y='lifeExp', size='pop', color='continent', hover_name='country', title='GDP與預(yù)期壽命的關(guān)系')
# 顯示圖表
fig.show()
(3) 交互式地圖:展示各地區(qū)銷(xiāo)量分布
用plotly.express.choropleth()函數(shù)繪制交互式地圖,適合展示地理數(shù)據(jù)(如各地區(qū)的銷(xiāo)量、人口):
# 假設(shè)我們有一組地區(qū)銷(xiāo)量數(shù)據(jù)(地區(qū)是國(guó)家名稱,銷(xiāo)量是數(shù)值)
region_sales = pd.DataFrame({
'地區(qū)': ['China', 'India', 'United States', 'Indonesia', 'Brazil'],
'銷(xiāo)量': [1000, 800, 1200, 600, 700]
})
# 繪制交互式地圖:顏色表示銷(xiāo)量,locationmode='country names'表示地區(qū)是國(guó)家名稱
fig = px.choropleth(region_sales, locations='地區(qū)', locationmode='country names', color='銷(xiāo)量', title='各地區(qū)總銷(xiāo)量分布')
# 顯示圖表
fig.show()
(4) 效果展示
運(yùn)行以上代碼,會(huì)在瀏覽器中打開(kāi)一個(gè)交互式圖表。比如交互式散點(diǎn)圖,鼠標(biāo) hover 到某個(gè)點(diǎn),會(huì)顯示國(guó)家名稱、GDP、預(yù)期壽命和人口;點(diǎn)擊圖例中的“Asia”,會(huì)隱藏亞洲國(guó)家的數(shù)據(jù);縮放x軸,能查看某段GDP區(qū)間的國(guó)家分布。
五、實(shí)戰(zhàn)篇:用Python可視化分析電商銷(xiāo)售數(shù)據(jù)
現(xiàn)在,我們將用前面學(xué)的三個(gè)庫(kù)(Matplotlib、Seaborn、Plotly),結(jié)合Pandas(數(shù)據(jù)處理庫(kù)),分析一個(gè)真實(shí)的電商銷(xiāo)售數(shù)據(jù)集,完成一個(gè)完整的可視化項(xiàng)目。
1. 數(shù)據(jù)準(zhǔn)備
我們使用Kaggle上的“E-commerce Sales Dataset”(電商銷(xiāo)售數(shù)據(jù)集),包含以下字段:
- Order ID:訂單ID;
- Date:訂單日期;
- Product Category:產(chǎn)品類(lèi)別;
- Region:地區(qū);
- Sales:銷(xiāo)量(美元)。
2. 數(shù)據(jù)導(dǎo)入與清洗
首先用Pandas導(dǎo)入數(shù)據(jù),并處理缺失值和日期格式:
import pandas as pd
# 導(dǎo)入數(shù)據(jù)(假設(shè)數(shù)據(jù)文件在當(dāng)前目錄下)
sales_data = pd.read_csv('ecommerce_sales.csv')
# 查看數(shù)據(jù)前5行
print(sales_data.head())
# 處理缺失值:用均值填充銷(xiāo)量列的缺失值
sales_data['Sales'] = sales_data['Sales'].fillna(sales_data['Sales'].mean())
# 處理日期格式:將Date列轉(zhuǎn)換為datetime類(lèi)型
sales_data['Date'] = pd.to_datetime(sales_data['Date'])
# 新增月份列(用于按月份統(tǒng)計(jì))
sales_data['Month'] = sales_data['Date'].dt.to_period('M')
3. 可視化分析
(1) 用Matplotlib畫(huà)月度銷(xiāo)量趨勢(shì)圖
import matplotlib.pyplot as plt
# 按月份統(tǒng)計(jì)總銷(xiāo)量
monthly_sales = sales_data.groupby('Month')['Sales'].sum().reset_index()
# 繪制折線圖
plt.figure(figsize=(12, 6)) # 設(shè)置圖表大小
plt.plot(monthly_sales['Month'].astype(str), monthly_sales['Sales'], marker='o', color='orange', linewidth=2)
plt.xlabel('月份')
plt.ylabel('總銷(xiāo)量(美元)')
plt.title('2024年電商月度銷(xiāo)量趨勢(shì)')
plt.xticks(rotation=45) # 旋轉(zhuǎn)x軸標(biāo)簽,避免重疊
plt.grid(True) # 顯示網(wǎng)格線
plt.show()
(2) 用Seaborn畫(huà)產(chǎn)品類(lèi)別銷(xiāo)量箱線圖
import seaborn as sns
# 繪制箱線圖:按產(chǎn)品類(lèi)別分組,展示銷(xiāo)量的離散程度
plt.figure(figsize=(12, 6))
sns.boxplot(x='Product Category', y='Sales', data=sales_data, palette='viridis')
plt.xlabel('產(chǎn)品類(lèi)別')
plt.ylabel('銷(xiāo)量(美元)')
plt.title('不同產(chǎn)品類(lèi)別銷(xiāo)量分布')
plt.xticks(rotation=45)
plt.show()
(3) 用Plotly畫(huà)交互式地區(qū)銷(xiāo)量地圖
import plotly.express as px
# 按地區(qū)統(tǒng)計(jì)總銷(xiāo)量
region_sales = sales_data.groupby('Region')['Sales'].sum().reset_index()
# 繪制交互式地圖:顏色表示銷(xiāo)量,locationmode='country names'表示地區(qū)是國(guó)家名稱
fig = px.choropleth(region_sales, locations='Region', locationmode='country names', color='Sales', title='2024年電商地區(qū)銷(xiāo)量分布')
fig.show()
本文通過(guò)基礎(chǔ)案例帶大家熟悉Matplotlib、Seaborn、Plotly可視化的基礎(chǔ)操作,大家如果想進(jìn)一步學(xué)習(xí)可以多查閱官方文檔及案例。