from plottable import ColumnDefinition
column_defs = [
ColumnDefinition(name='地区', width=0.2, textprops={'weight': 'bold'}),
ColumnDefinition(name='人口', formatter='{:.0f}', cmap='Blues'),
ColumnDefinition(name='增长率', plot_fn=bar_chart)
]
import matplotlib.pyplot as plt
import pandas as pd
from plottable import Table, ColumnDefinition
from plottable.plots import bar, progress_donut
from matplotlib.colors import LinearSegmentedColormap
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
try:
df = pd.read_excel('2022 和 2023 年杭州市人口主要数据公报.xlsx')
except FileNotFoundError:
data = {
'index': [1, 2],
'地区': ['上城区', '西湖区'],
'常住人口(万人)': [100, 150],
'城镇化率(%)': [95, 80],
'常住人口(万人).1': [105, 160],
'城镇化率(%).1': [96, 82],
'人口增长率': [0.05, 0.07]
}
df = pd.DataFrame(data)
if '城镇化率(%).1' in df.columns:
df['城镇化率(%)'] = df['城镇化率(%)'] / 100
df['城镇化率(%).1'] = df['城镇化率(%).1'] / 100
df['人口增长率'] = (df['常住人口(万人).1'] - df['常住人口(万人)']) / df['常住人口(万人)']
cmap = LinearSegmentedColormap.from_list(
name="growth_cmap",
colors=["#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab"],
N=256
)
fig, ax = plt.subplots(figsize=(10, 12))
tab = Table(df, ax=ax,
odd_row_color='#a5d8ff',
even_row_color='white',
footer_divider=True,
textprops={'ha': 'center'},
column_definitions=[
ColumnDefinition(name='index',
title="",
width=0,
textprops={"ha": "right", 'color':'w'}),
ColumnDefinition(name='地区',
textprops={"ha": "center", 'fontsize': 12}),
ColumnDefinition(name='常住人口(万人)',
group='2022 年',
textprops={'weight': 'bold'}),
ColumnDefinition(name='城镇化率(%)',
title='城镇化率',
group='2022 年',
plot_fn=progress_donut,
plot_kw={"is_pct": True,
"formatter": "{:.2f}",
'radius': 0.48,
'textprops':{'fontsize':8}}),
ColumnDefinition(name='常住人口(万人).1',
title='常住人口(万人)',
group='2023 年',
textprops={'weight': 'bold'}),
ColumnDefinition(name='城镇化率(%).1',
title='城镇化率',
group='2023 年',
plot_fn=bar,
plot_kw={"cmap": cmap,
"plot_bg_bar": True,
"annotate": True,
"height": 0.8,
"lw": 0.5,
"formatter": "{:.1%}"}),
ColumnDefinition(name='人口增长率',
formatter="{:.1%}",
textprops={'color': 'g', 'weight': 'bold'})
]
)
plt.savefig('杭州市人口数据公报.png', dpi=600, bbox_inches='tight')
plt.show()