Fundamentals 6 min read

Using plottable to Create Highly Customizable Tables in Python

This article introduces the Python library plottable, which builds highly customizable tables on top of Matplotlib, and provides a complete example showing data loading, column styling, and rendering of a styled table along with additional recommended reading links.

IT Services Circle
IT Services Circle
IT Services Circle
Using plottable to Create Highly Customizable Tables in Python

This article introduces the Python library plottable , which builds highly customizable tables on top of Matplotlib, and demonstrates its usage with a complete example that loads data, defines column styles, and renders a styled table.

Below is the full Python script used in the demonstration:

# 导入相关包
from pathlib import Path

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.colors import LinearSegmentedColormap

from plottable import ColumnDefinition, Table
from plottable.cmap import normed_cmap
from plottable.formatters import decimal_to_percent
from plottable.plots import circled_image

plt.rcParams["font.family"] = ["DejaVu Sans"]
plt.rcParams["savefig.bbox"] = "tight"

# demo数据准备
cols = [
    "team","points","group","spi","global_o","global_d","group_1","group_2","group_3",
    "make_round_of_16","make_quarters","make_semis","make_final","win_league",
]

df = pd.read_csv("data/wwc_forecasts.csv", usecols=cols)

colnames = [
    "Team","Points","Group","SPI","OFF","DEF","1st Place","2nd Place","3rd Place",
    "Make Rd Of 16","Make Quarters","Make Semis","Make Finals","Win World Cup",
]

col_to_name = dict(zip(cols, colnames))

flag_paths = list(Path("country_flags").glob("*.png"))
country_to_flagpath = {p.stem: p for p in flag_paths}

df[["spi","global_o","global_d"]] = df[["spi","global_o","global_d"]].round(1)

df = df.rename(col_to_name, axis=1)
df = df.drop("Points", axis=1)
df.insert(0, "Flag", df["Team"].apply(lambda x: country_to_flagpath.get(x)))

df = df.set_index("Team")

# colormap准备
cmap = LinearSegmentedColormap.from_list(
    name="bugw",
    colors=["#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab"],
    N=256
)

team_rating_cols = ["SPI","OFF","DEF"]
group_stage_cols = ["1st Place","2nd Place","3rd Place"]
knockout_stage_cols = list(df.columns[-5:])

# table列个性化list,例如列名、列宽、字体、磅值等等
col_defs = ([
    ColumnDefinition(
        name="Flag",
        title="Region",
        textprops={"ha": "center"},
        width=0.5,
        plot_fn=circled_image,
    ),
    ColumnDefinition(
        name="Team",
        textprops={"ha": "left","weight":"bold"},
        width=1.5,
    ),
    ColumnDefinition(
        name="Group",
        textprops={"ha": "center"},
        width=0.75,
    ),
    ColumnDefinition(
        name="SPI",
        group="Team Rating",
        textprops={"ha": "center"},
        width=0.75,
    ),
    ColumnDefinition(
        name="OFF",
        width=0.75,
        textprops={"ha":"center","bbox":{"boxstyle":"circle","pad":0.35}},
        cmap=normed_cmap(df["OFF"], cmap=matplotlib.cm.Blues, num_stds=2.5),
        group="Team Rating",
    ),
    ColumnDefinition(
        name="DEF",
        width=0.75,
        textprops={"ha":"center","bbox":{"boxstyle":"circle","pad":0.35}},
        cmap=normed_cmap(df["DEF"], cmap=matplotlib.cm.Greens, num_stds=2.5),
        group="Team Rating",
    ),
] + [
    ColumnDefinition(
        name=group_stage_cols[0],
        title=group_stage_cols[0].replace(" ", "
", 1),
        formatter=decimal_to_percent,
        group="Group Stage Chances",
        border="left",
    )
] + [
    ColumnDefinition(
        name=col,
        title=col.replace(" ", "
", 1),
        formatter=decimal_to_percent,
        group="Group Stage Chances",
    ) for col in group_stage_cols[1:]
] + [
    ColumnDefinition(
        name=knockout_stage_cols[0],
        title=knockout_stage_cols[0].replace(" ", "
", 1),
        formatter=decimal_to_percent,
        cmap=cmap,
        group="Knockout Stage Chances",
        border="left",
    )
] + [
    ColumnDefinition(
        name=col,
        title=col.replace(" ", "
", 1),
        formatter=decimal_to_percent,
        cmap=cmap,
        group="Knockout Stage Chances",
    ) for col in knockout_stage_cols[1:]
])

# plottable的Table方法制作表格
fig, ax = plt.subplots(figsize=(20, 22))
table = Table(
    df,
    column_definitions=col_defs,
    row_dividers=True,
    footer_divider=True,
    ax=ax,
    textprops={"fontsize": 14},
    row_divider_kw={"linewidth":1,"linestyle":(0,(1,5))},
    col_label_divider_kw={"linewidth":1,"linestyle":"-"},
    column_border_kw={"linewidth":1,"linestyle":"-"},
).autoset_fontcolors(colnames=["OFF","DEF"])

At the end of the article, the author also lists several other recommended reading links covering topics such as ARP protocol, JavaScript events, MySQL‑Elasticsearch synchronization, chatroom implementation, regular expressions, and more.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

PythonData visualizationMatplotlibplottableTable Generation
IT Services Circle
Written by

IT Services Circle

Delivering cutting-edge internet insights and practical learning resources. We're a passionate and principled IT media platform.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.