Pandas 提供了便捷的視覺化功能,可以直接從 Series 和 DataFrame 物件生成圖表,大幅簡化資料探索和分析流程。利用 plot 方法,搭配 kind 引數,可以快速產生線圖、長條圖、面積圖、圓餅圖等基本圖表。此外,Pandas 也支援直方圖和核密度估計圖 (KDE),方便分析資料分佈。對於更進階的圖表客製化需求,可以結合 Matplotlib 進行更細緻的調整,例如設定標題、顏色、網格、軸標籤等。針對多變數分析,散佈圖和散佈矩陣是強大的視覺化工具,可以展現變數之間的關係和趨勢,更深入地理解資料。
資料視覺化:探索性資料分析與呈現的關鍵
在進行探索性資料分析、報告製作或應用程式開發時,視覺化是一項至關重要的技能。探索性資料分析通常在小團隊或個人進行,需要快速生成圖表以深入瞭解資料。視覺化有助於識別異常值和缺失資料,或引發其他有趣的問題,從而進行進一步的分析和視覺化。這型別的視覺化通常不考慮終端使用者的需求,主要目的是幫助分析者更好地理解資料。
資料視覺化的重要性
良好的資料視覺化可以讓觀眾在提取資訊的過程中獲得愉悅的體驗。優秀的視覺化作品就像電影一樣,能夠吸引觀眾並激發興趣。Pandas 函式庫提供了 pd.Series.plot 和 pd.DataFrame.plot 方法,用於快速生成圖表。這些方法預設呼叫 Matplotlib 後端。
安裝 Matplotlib 和 PyQt5
在開始之前,需要安裝 Matplotlib 和 PyQt5。可以使用以下命令進行安裝:
python -m pip install matplotlib pyqt5
所有程式碼範例都假設已執行以下匯入:
import matplotlib.pyplot as plt
plt.ion()
plt.ion() 命令啟用 Matplotlib 的互動模式,每次執行繪圖命令時都會自動建立和更新圖表。
從聚合資料建立圖表
Pandas 函式庫使得視覺化 pd.Series 和 pd.DataFrame 物件中的資料變得非常容易。本文將介紹如何使用 pd.Series.plot 和 pd.DataFrame.plot 方法建立基本的線圖、長條圖、面積圖和圓餅圖。
建立簡單的 pd.Series
首先,建立一個簡單的 pd.Series,表示 7 天內的書籍銷售量:
ser = pd.Series(
(x ** 2 for x in range(7)),
name="book_sales",
index=(f"Day {x + 1}" for x in range(7)),
dtype=pd.Int64Dtype(),
)
ser
輸出結果:
Day 1 0
Day 2 1
Day 3 4
Day 4 9
Day 5 16
Day 6 25
Day 7 36
Name: book_sales, dtype: Int64
繪製線圖
直接呼叫 pd.Series.plot 方法會生成線圖,X 軸標籤來自行索引,Y 軸值對應於 pd.Series 中的資料:
ser.plot()
繪製長條圖
傳遞 kind="bar" 引數給 pd.Series.plot 方法,可以生成長條圖:
ser.plot(kind="bar")
繪製水平長條圖
使用 kind="barh" 引數,可以生成水平長條圖:
ser.plot(kind="barh")
繪製面積圖
傳遞 kind="area" 引數,會生成面積圖,填充線下方的區域:
ser.plot(kind="area")
繪製圓餅圖
使用 kind="pie" 引數,可以生成圓餅圖,每個標籤代表圓餅的一個切片:
ser.plot(kind="pie")
對 pd.DataFrame 的支援
對於 pd.DataFrame,API 保持一致,但可能需要提供更多的關鍵字引數來取得所需的視覺化效果。
建立 pd.DataFrame
擴充套件資料以顯示書籍銷售量和退貨量:
df = pd.DataFrame({
"book_sales": (x ** 2 for x in range(7)),
"book_returns": [3, 2, 1, 0, 1, 2, 3],
}, index=(f"Day {x + 1}" for x in range(7)))
df = df.convert_dtypes(dtype_backend="numpy_nullable")
df
輸出結果:
book_sales book_returns
Day 1 0 3
Day 2 1 2
Day 3 4 1
Day 4 9 0
Day 5 16 1
Day 6 25 2
Day 7 36 3
預設呼叫 pd.DataFrame.plot 方法會生成線圖,每列代表一條線。
df.plot()
傳遞 kind="bar" 引數,可以生成長條圖。預設情況下,Pandas 將每列顯示為圖表上的單獨長條。
df.plot(kind="bar")
傳遞 stacked=True 引數,可以將列堆積疊在彼此之上:
df.plot(kind="bar", stacked=True)
詳細解說:
- 在上述範例中,我們展示瞭如何使用 Pandas 的
plot方法來建立各種圖表,包括線圖、長條圖、面積圖和圓餅圖。 - 使用
kind引數可以指定要生成的圖表型別。 - 在處理
pd.DataFrame時,可以透過stacked引數控制是否堆積疊列。 使用 Plantuml 圖表呈現流程和架構
書籍銷售和退貨的流程:
圖表翻譯:
此圖表呈現了書籍銷售和退貨的流程。首先,書籍銷售會產生銷售資料和退貨資料。這些資料會被收集並用於進行資料分析。最後,分析結果會透過視覺化呈現出來。
在未來的章節中,我們將進一步探討更進階的視覺化技術,包括使用 Seaborn 和其他工具來建立更複雜和更具吸引力的視覺化作品。同時,我們也將討論如何根據不同的資料型別和分析目標選擇合適的視覺化方法。
下一步計畫:
- 探索更多進階的視覺化技術。
- 使用 Seaborn 和其他工具建立複雜的視覺化作品。
- 研究不同資料型別和分析目標下的視覺化方法選擇。
透過不斷學習和實踐,我們可以提升資料視覺化的技能,更有效地傳達資料背後的洞察和故事。
資料視覺化:深入探索 pandas 繪圖功能
在資料分析的過程中,視覺化是一個非常重要的步驟。藉由視覺化,我們可以更直觀地理解資料的分佈、趨勢和模式。pandas 提供了一系列強大的繪圖功能,讓我們能夠輕鬆地建立各種圖表。
自定義圖表外觀
在建立圖表的過程中,我們可能需要對圖表的外觀進行自定義。pandas 提供了多種引數,讓我們能夠控制圖表的標題、顏色、網格等。
設定圖表標題
要為圖表新增標題,可以使用 title 引數:
ser.plot(kind="bar", title="每日書籍銷售量")
自定義顏色
可以使用 color 引數來更改線條、條形和標記的顏色。顏色可以使用 RGB 十六進位制程式碼或 Matplotlib 命名顏色來表示:
ser.plot(kind="bar", title="每日書籍銷售量", color="seagreen")
當使用 pd.DataFrame 時,可以傳遞一個字典來控制不同列的顏色:
df.plot(kind="bar", title="書籍指標", color={"book_sales": "slateblue", "book_returns": "#7D5260"})
控制網格顯示
可以使用 grid 引數來控制是否顯示網格線:
ser.plot(kind="bar", title="每日書籍銷售量", color="teal", grid=False)
自定義軸標籤
可以使用 xlabel 和 ylabel 引數來控制 x 軸和 y 軸的標籤:
ser.plot(kind="bar", title="每日書籍銷售量", color="darkgoldenrod", grid=False, xlabel="日期", ylabel="銷售量")
使用子圖
當使用 pd.DataFrame 時,pandas 預設會將所有列的資料繪製在同一個圖表中。但是,可以使用 subplots=True 來建立單獨的子圖:
df.plot(kind="bar", title="書籍表現", grid=False, subplots=True)
在子圖中,可以使用 legend=False 來隱藏圖例:
df.plot(kind="bar", title="書籍表現", grid=False, subplots=True, legend=False)
此外,還可以使用 sharey=True 來分享 y 軸的範圍:
df.plot(kind="bar", title="書籍表現", grid=False, subplots=True, legend=False, sharey=True)
繪製資料分佈
視覺化可以幫助我們快速理解資料的分佈。直方圖是一種常用的繪製資料分佈的方法。
直方圖
可以使用 kind="hist" 來建立直方圖:
ser.plot(kind="hist")
直方圖會將資料分成多個區間,並計算每個區間中的資料數量。
控制區間數量
可以使用 bins 引數來控制直方圖的區間數量:
ser.plot(kind="hist", bins=100)
不同的區間數量會對視覺化結果產生不同的影響。
核密度估計(KDE)圖
KDE 圖是一種更強大的視覺化工具,可以用來估計資料的機率密度函式。
圖表示例
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Pandas資料視覺化技巧與圖表應用
package "資料視覺化流程" {
package "資料準備" {
component [資料載入] as load
component [資料清洗] as clean
component [資料轉換] as transform
}
package "圖表類型" {
component [折線圖 Line] as line
component [長條圖 Bar] as bar
component [散佈圖 Scatter] as scatter
component [熱力圖 Heatmap] as heatmap
}
package "美化輸出" {
component [樣式設定] as style
component [標籤註解] as label
component [匯出儲存] as export
}
}
load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export
note right of scatter
探索變數關係
發現異常值
end note
@enduml圖表翻譯: 此圖示展示了使用 pandas 進行資料視覺化的流程,從資料準備到建立圖表、自定義外觀、使用子圖和繪製資料分佈,每一步都是視覺化過程中不可或缺的一部分。
資料視覺化:超越直方圖的限制
在資料分析中,直方圖是一種常見的視覺化工具,用於展示資料的分佈情況。然而,直方圖的分箱(binning)策略可能會對資料的解讀產生影響。幸運的是,有一種類別似但更強大的視覺化工具,不需要選擇分箱策略,即核密度估計(Kernel Density Estimate, KDE)圖。
使用核密度估計(KDE)圖
要使用KDE圖,需要安裝SciPy:
python -m pip install scipy
安裝SciPy後,可以透過將kind="kde"傳遞給pd.Series.plot來建立KDE圖:
ser.plot(kind="kde")
對於pd.DataFrame,KDE圖可以清晰地展示出兩個不同的分佈:
df.plot(kind="kde")
內容解密:
ser.plot(kind="kde"):使用KDE圖展示ser的分佈情況,無需選擇分箱策略。df.plot(kind="kde"):對於DataFrame,KDE圖能夠展示多個變數的分佈,並清晰地辨識出不同的分佈模式。
使用Matplotlib進行進一步的圖表自定義
Matplotlib是一個強大的視覺化工具,可以對圖表進行細緻的自定義。首先,需要了解Matplotlib中的一些基本術語:figure指的是繪圖區域,而axes或subplot則是figure中的繪圖區域。
建立多個子圖
ser = pd.Series(
(x ** 2 for x in range(7)),
name="book_sales",
index=(f"Day {x + 1}" for x in range(7)),
dtype=pd.Int64Dtype(),
)
fig, axes = plt.subplots(nrows=1, ncols=3)
ser.plot(ax=axes[0])
ser.plot(kind="bar", ax=axes[1])
ser.plot(kind="pie", ax=axes[2])
內容解密:
plt.subplots(nrows=1, ncols=3):建立一個包含1行3列的子圖的figure。ser.plot(ax=axes[0]):在第一個子圖中繪製線圖。ser.plot(kind="bar", ax=axes[1]):在第二個子圖中繪製條形圖。ser.plot(kind="pie", ax=axes[2]):在第三個子圖中繪製餅圖。
使用GridSpec進行更靈活的佈局
為了更好地控制子圖的佈局,可以使用Matplotlib的GridSpec:
from matplotlib.gridspec import GridSpec
fig = plt.figure()
gs = GridSpec(2, 2, figure=fig)
ax0 = fig.add_subplot(gs[0, 0])
ax1 = fig.add_subplot(gs[0, 1])
ax2 = fig.add_subplot(gs[1, :])
ser.plot(ax=ax0)
ser.plot(kind="bar", ax=ax1)
ser.plot(kind="pie", ax=ax2)
內容解密:
GridSpec(2, 2, figure=fig):建立一個2x2的網格佈局。fig.add_subplot(gs[0, 0]):在網格的第一行第一列新增一個子圖。ser.plot(kind="pie", ax=ax2):在第二行的整個列中繪製餅圖。
自定義子圖屬性
可以進一步自定義每個子圖的屬性,例如旋轉標籤、移除標籤、更改標題等:
ax1.set_xticklabels(ax1.get_xticklabels(), rotation=45)
ax2.legend(ser.index, bbox_to_anchor=(1, -0.2, 0.5, 1), prop={"size": 6})
ax2.set_title("Pie Chart")
ax2.set_ylabel(None)
內容解密:
ax1.set_xticklabels(ax1.get_xticklabels(), rotation=45):將條形圖的x軸標籤旋轉45度。ax2.legend(ser.index, bbox_to_anchor=(1, -0.2, 0.5, 1), prop={"size": 6}):為餅圖新增自定義的圖例,並調整其位置和字型大小。ax2.set_ylabel(None):移除餅圖的y軸標籤。
探索散點圖
散點圖是一種強大的視覺化工具,可以用來展示兩個變數之間的關係、測量個別資料點的規模,甚至觀察這些關係和規模在不同類別中的變化。
建立散點圖
df = pd.DataFrame({
"var_a": [1, 2, 3, 4, 5],
"var_b": [1, 2, 4, 8, 16],
"var_c": [500, 200, 600, 100, 400],
"var_d": ["blue", "orange", "gray", "blue", "gray"],
})
df = df.convert_dtypes(dtype_backend="numpy_nullable")
內容解密:
pd.DataFrame({...}):建立一個包含四個不同欄位的DataFrame。df.convert_dtypes(dtype_backend="numpy_nullable"):將DataFrame的資料型別轉換為支援空值的NumPy型別。
資料視覺化:散佈圖與散佈矩陣的應用
在資料分析中,視覺化是一種強大的工具,能夠幫助我們理解資料之間的關係與趨勢。本篇文章將探討如何使用 Python 的 pandas 函式庫來建立散佈圖和散佈矩陣,以分析美國能源部發布的汽車燃油經濟性資料集。
散佈圖的基本應用
散佈圖是一種用於展示兩個變數之間關係的視覺化工具。在 pandas 中,我們可以使用 df.plot(kind="scatter") 來建立散佈圖。例如,若要分析城市裡程(city miles-per-gallon)與高速公路里程(highway miles-per-gallon)之間的關係,可以使用以下程式碼:
df.plot(
kind="scatter",
x="city08",
y="highway08",
)
內容解密:
kind="scatter"指定了繪製散佈圖。x="city08"和y="highway08"分別指定了 X 軸和 Y 軸的資料欄位。
增強散佈圖的功能
為了進一步分析資料,我們可以為散佈圖新增更多的維度,例如使用不同的顏色來表示不同的汽車類別。首先,需要確保 VClass 欄位是分類別資料型別:
classes_ser = pd.Series(car_classes, dtype=pd.StringDtype())
cat = pd.CategoricalDtype(classes_ser)
df["VClass"] = df["VClass"].astype(cat)
然後,可以使用 c 引數來指定顏色的來源:
df.plot(
kind="scatter",
x="city08",
y="highway08",
c="VClass",
colormap="Dark2",
)
內容解密:
c="VClass"指定了根據VClass欄位的值來決定資料點的顏色。colormap="Dark2"指定了使用的顏色對映方案。
調整資料點的大小
我們還可以根據某個變數(例如年度燃油成本 fuelCost08)來調整資料點的大小:
df.assign(
scaled_fuel_cost=lambda x: x["fuelCost08"] / 25,
).plot(
kind="scatter",
x="city08",
y="highway08",
c="VClass",
colormap="Dark2",
s="scaled_fuel_cost",
alpha=0.4,
)
內容解密:
s="scaled_fuel_cost"指定了根據scaled_fuel_cost欄位的值來決定資料點的大小。alpha=0.4設定了資料點的透明度,以避免過度密集的資料點遮擋彼此。
散佈矩陣的應用
散佈矩陣是一種能夠展示多個連續變數之間兩兩關係的視覺化工具。可以使用 scatter_matrix 函式來建立:
from pandas.plotting import scatter_matrix
scatter_matrix(df)
內容解密:
scatter_matrix(df)對df中的連續變數生成兩兩之間的散佈圖,形成一個矩陣。