“Pandas 的 DataFrame 提供了強大的樣式功能,可以通過 Styler 對象實現類似 Excel 的條件著色效果。此外,Pandas 內置的繪圖方法支持多種圖表類型,輕松滿足數據可視化需求?!?/p>
1. 表格和樣式
Pandas 的 DataFrame 提供了強大的樣式功能,可以通過 Styler 對象實現類似 Excel 的條件著色效果。以下是關鍵方法和示例:
1.1. ?基礎樣式設置
通過 DataFrame.style 訪問樣式功能,支持鏈式調用:
df.style.set_caption("標題").set_properties(**{'background-color': 'lightgray'})

1.2. ?條件著色
1.2.1. 單列條件著色
def color_negative_red(val):
color = 'red' if val < 0.2 else 'black'
return f'color: {color}'
df.style.applymap(color_negative_red)

1.2.2. 多列條件著色
df.style.apply(lambda x: ['background: yellow' if v > 0.2 else '' for v in x],
subset=['A', 'C'])

1.2.3. ?極值高亮
df.style.highlight_max(color='lightgreen').highlight_min(color='pink')

1.2.4. 漸變色背景
df.style.background_gradient(cmap='Blues', subset=['B'])

1.2.5. 條形圖樣式
df.style.bar(subset=['C'], color='#5fba7d')

1.2.6. 自定義表格樣式
headers = {
'selector': 'th',
'props': 'background-color: #5e17eb; color: white;'}
df.style.set_table_styles([headers])

1.2.7. 動態條件著色(復雜邏輯)?
def highlight_risk(row):
# 當A列>90且B列<50時標黃
return ['background: yellow' if (row['A']>0.3) & (row['B']<0.5) else ''
for _ in row] # 返回與行等長的樣式列表
df.style.apply(highlight_risk, axis=1) # axis=1表示按行處理

!!! Notes
- 樣式僅在 Jupyter Notebook 或導出為 HTML 時生效,不支持直接修改原始數據。
- 使用 subset 參數可限定著色范圍。
- 漸變色 (background_gradient) 支持調整色域范圍 (low=0.2, high=0.8)。
2. Pandas 內置繪圖功能
在 pandas 中,我們可能有多列數據,還有行標簽和列標簽。pandas 自身就有內置的方法,用于簡化從 DataFrame 和 Series 繪制圖形。
2.1. 線形圖
Series 和 DataFrame 都有一個 plot 屬性,用于繪制基本圖表。默認情況下,plot() 生成的是線形圖。
s = pd.Series(np.random.standard_normal(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()

該 Series 對象的索引會被傳給matplotlib,并用于繪制 x 軸??梢酝ㄟ^ use_index=False 來禁用索引。x 軸的刻度和界限可以通過 xtick 和 xlim 選項進行調節,y 軸用 yticks 和 ylim 調節。plot 參數的部分列表參見下表:
| 參數 | 說明 |
|---|---|
| alpha | 圖形填充透明度(0~1 之間) |
| ax | matplotlib 的 Axes 對象,默認為當前 Axes (gca()) |
| colormap | 指定顏色映射(如 'viridis') |
| 參數 | 說明 |
|---|---|
| figsize | 圖像尺寸,格式為 (寬度, 高度)(單位:英寸) |
| fontsize | 刻度標簽字體大小 |
| grid | 是否顯示網格線(默認為 None,遵循 matplotlib 默認樣式) |
| kind | 圖形類型,可選:'line'(折線圖,默認)、'bar'(柱狀圖)、'barh'(橫向柱狀圖)、'hist'(直方圖)、'box'(箱線圖)、'kde'/'density'(核密度估計)、'area'(面積圖)、'pie'(餅圖) |
| label | 圖例標簽名稱 |
| legend | 是否顯示圖例(默認為 False) |
| logx/logy | 是否對 x/y 軸使用對數刻度(默認為 False) |
| loglog | 是否對 x/y 軸同時使用對數刻度 |
| position | 柱狀圖的柱子位置(需避免與 kind='bar' 沖突) |
| rot | 刻度標簽旋轉角度(如 45 表示 45 度) |
| secondary_y | 是否使用右側的第二個 y 軸(默認為 False) |
| style | 線條樣式(如 'k--' 表示黑色虛線) |
| table | 是否在圖表下方顯示數據表格(默認為 False) |
| title | 圖表標題(字符串) |
| use_index | 是否使用 Series 的索引作為 x 軸刻度標簽(默認為 True) |
| xerr/yerr | 為柱狀圖添加誤差線 |
| xlim/ylim | 設置 x/y 軸顯示范圍(格式:(min, max)) |
| xticks/yticks | 自定義 x/y 軸刻度值(列表) |
| **kwds | 其他 matplotlib 繪圖參數(如 color='red') |
pandas 的大部分繪圖方法都接收一個可選的 ax 參數,它可以是 matplotlib 的子圖對象,這使你能夠在網格布局中更為靈活地處理子圖的位置。
DataFrame 的 plot 方法將各個列繪制成同一子圖中的線,并自動創建圖例。
df = pd.DataFrame(np.random.standard_normal((10, 4)).cumsum(0),
columns=['A', 'B', 'C', 'D'],
index=np.arange(0, 100, 10))
plt.style.use('grayscale')
df.plot()

!!! Notes
這里使用了 plt.style.use('grayscale') 將配色模式設置為灰度模式。
對于不同的繪圖類型,plot 屬性包含很多方法。例如,df.plot() 等價于 df.plot.line()。
!!! Notes
plot 的額外關鍵字參數會傳遞給相應的 matplotlib 繪圖函數,所以要更進一步自定義圖表,就必須學習更多有關matplotlib API的知識。
DataFrame 還有一些用于對列進行靈活處理的選項。例如:要將所有列都繪制到同一個子圖中還是分別創建各自的子圖。下表展示了專屬于DataFrame的plot參數:
| 參數 | 說明 |
|---|---|
| subplots | 是否為每一列數據創建子圖,默認為 False |
| sharex | 如果 subplots=True,是否共享 x 軸,默認為 True(當 ax=None 時) |
| sharey | 如果 subplots=True,是否共享 y 軸,默認為 False |
| layout | 子圖的行列布局,格式為 (rows, columns) |
| legend | 添加子圖圖例(默認為True) |
| sort_columns | 是否按列名排序,默認為 False |
2.2. 柱狀圖
plot.bar() 和 plot.barh() 分別用于繪制水平柱狀圖和垂直柱狀圖。對于柱狀圖,Series 或 DataFrame 的索引將被用作x軸(bar)或y軸(barh)的刻度。
fig, axes = plt.subplots(2,1)
data = pd.Series(np.random.uniform(size=16), index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)

對于 DataFrame,柱狀圖會將每一行的值分為一組,并排顯示。
df = pd.DataFrame(np.random.uniform(size=(6, 4)),
index=["one", "two", "three", "four", "five", "six"],
columns=pd.Index(["A", "B", "C", "D"], name="Genus"))
df.plot.bar()

注意,DataFrame 各列的名稱“Genus”被用作圖例標題。
傳入stacked=True即可為DataFrame生成堆積柱狀圖,這樣每行的值就會水平堆積在一起。
df.plot.bar(stacked=True,alpha=0.5)

浙公網安備 33010602011771號