最近github上發現了一個庫(`plottable`),可以用簡單的方式就設置出花哨的 `DataFrame` 樣式。 github上的地址:[https://github.com/znstrider/plottable](https://github.com/znstrider/plottabl ...
最近github上發現了一個庫(plottable
),可以用簡單的方式就設置出花哨的 DataFrame
樣式。
github上的地址:https://github.com/znstrider/plottable
1. 安裝
通過 pip
安裝:
pip install plottable
2. 行的顏色
使用 plottable
的API,調整背景和字體的顏色非常方便。
2.1. 奇偶行不同顏色
奇偶行設置不同的顏色,讓表格看起來有層次感。
import numpy as np
from plottable import Table
data = np.random.random((5, 5))
data = data.round(2)
df = pd.DataFrame(data, columns=["A", "B", "C", "D", "E"])
tbl = Table(df,
odd_row_color="#f0f0f0",
even_row_color="#e0f6ff"
)
2.2. 背景和字體顏色
對於複雜的顯示要求,可以逐行設置背景色和字體的顏色。
import numpy as np
from plottable import Table
data = np.random.random((5, 5))
data = data.round(2)
df = pd.DataFrame(data, columns=["A", "B", "C", "D", "E"])
tbl = Table(df)
tbl.rows[0].set_facecolor("red")
tbl.rows[0].set_fontcolor("white")
tbl.rows[1].set_facecolor("blue")
tbl.rows[1].set_fontcolor("white")
tbl.rows[2].set_facecolor("green")
tbl.rows[2].set_fontcolor("white")
tbl.rows[3].set_facecolor("gray")
tbl.rows[3].set_fontcolor("white")
tbl.rows[4].set_facecolor("purple")
tbl.rows[4].set_fontcolor("white")
上例中每一行的背景設置了不同的顏色,字體都設置為白色。
3. 值的顯示
調整顏色,字體屬於基本的設置,plottable
強大之處在於可用圖形化的方式來顯示數據,
讓我們可以一眼看出數據的大小和差距。
比如,下麵的示例用 ColumnDefinition
來使用 plottable
內置的數據顯示方式。
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from plottable import ColumnDefinition, Table
from plottable.formatters import decimal_to_percent
from plottable.plots import bar, percentile_bars, percentile_stars, progress_donut
data = np.random.random((5, 5))
data = data.round(2)
df = pd.DataFrame(data, columns=["A", "B", "C", "D", "E"])
print(df) # 顯示原始數據
cmap = LinearSegmentedColormap.from_list(
name="bugw", colors=["#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab"], N=256
)
tab = Table(
df,
textprops={"ha": "center"},
column_definitions=[
ColumnDefinition("index", textprops={"ha": "left"}),
ColumnDefinition("A", plot_fn=percentile_bars, plot_kw={"is_pct": True}),
ColumnDefinition(
"B", width=1.5, plot_fn=percentile_stars, plot_kw={"is_pct": True}
),
ColumnDefinition(
"C",
plot_fn=progress_donut,
plot_kw={"is_pct": True, "formatter": "{:.0%}"},
),
ColumnDefinition(
"D",
width=1.25,
plot_fn=bar,
plot_kw={
"cmap": cmap,
"plot_bg_bar": True,
"annotate": True,
"height": 0.5,
"lw": 0.5,
"formatter": decimal_to_percent,
},
),
],
)
原始數據顯示:
plottable
強化之後顯示:
4. 圖文混合
最後,演示一個通過 plottable
在表格中插入圖片的示例。
其中數據來源是 2023 王者榮耀春季賽各個戰隊的數據。
主要為了演示表格中插入圖片(圖片是各個戰隊的logo),所以只挑選了4個列來展示。
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from plottable import ColumnDefinition, Table
from plottable.formatters import decimal_to_percent
from plottable.plots import bar, percentile_bars, percentile_stars, progress_donut
from plottable.plots import circled_image
matplotlib.rcParams["font.sans-serif"] = ["Microsoft YaHei Mono"]
matplotlib.rcParams["axes.unicode_minus"] = False
df = pd.read_csv("d:/share/data.csv")
df = df.set_index("排名")
df["勝率"] = df["勝場"] / df["比賽場次"]
df["logo"] = "d:/share/wzry-logos/" + df["戰隊"] + ".png"
df = df.drop(columns=["勝場", "比賽場次", "場均KDA"])
fig, ax = plt.subplots(figsize=(12, 12))
col_defs = [
ColumnDefinition("排名", textprops={"ha": "left"}),
ColumnDefinition(
name="logo",
title="",
textprops={"ha": "center"},
width=0.5,
plot_fn=circled_image,
),
ColumnDefinition("戰隊", textprops={"ha": "center"}),
ColumnDefinition(
"勝率",
plot_fn=progress_donut,
plot_kw={"is_pct": True, "formatter": "{:.0%}"},
),
]
tbl = Table(
df,
ax=ax,
textprops={"ha": "center", "fontsize": 20},
column_definitions=col_defs,
)
上面示例中用到的數據和logo圖標分享在:
https://url11.ctfile.com/f/45455611-870642180-a094e4?p=6872 (訪問密碼: 6872)
有興趣可以試試看上面的示例,或者繼續深入探索 plottable
的強大顯示功能。