比较(七)利用python绘制表格
表格(Table)简介
表格是数据在行和列中的结构化排列,允许进行方便的排序、过滤和分析。表格的优点在于可以清晰、有组织的呈现信息,便于快速比较和解读信息。
快速绘制
-
基于pandas
可能需要更新jinja2:pip install --upgrade jinja2
import pandas as pd import matplotlib as mpl import numpy as np # 自定义数据 sample_size = 6 new_york = np.random.uniform(20,60,sample_size) paris = np.random.uniform(20,40,sample_size) london = np.random.uniform(5,30,sample_size) df = pd.DataFrame({'new_york': new_york, 'paris': paris, 'london': london}, index=pd.date_range(start="2020-01-01", periods=sample_size).strftime("%d-%m-%Y")) # 自定义风格函数 def custom_table(styler): styler.background_gradient(cmap="Blues", axis=None) # 色阶 styler.format(precision=2) # 文本格式 styler.applymap(lambda x: 'text-align: center; font-size: 14px;') return styler agg_metrics = df.agg(["mean", "max"]) # 增加统计数据 pd.concat([df, agg_metrics]).style.pipe(custom_table)
-
基于plottable
import matplotlib.pyplot as plt import pandas as pd from plottable import Table # 自定义数据 data = {'Score': [8, 6, 10, 3, 9], 'Value': [50.42, 17.01, 42.90, 6.83, 92.06], 'Comment': ['Nice', 'Cool', 'Fun', 'Bad', 'Okay']} df = pd.DataFrame(data) # 初始布局 fig, ax = plt.subplots(figsize=(5, 5)) # 绘制表 tab = Table(df) plt.show()
-
基于matplotlib
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 自定义数据 data = {'Freeze': [ 66386, 174296, 75131, 577908, 32015], 'Wind': [ 58230, 381139, 78045, 99308, 160454], 'Flood': [ 89135, 80552, 152558, 497981, 603535], 'Quake': [ 78415, 81858, 150656, 193263, 69638], 'Hail': [139361, 331509, 343164, 781380, 52269], 'rows': ['%d year' % x for x in (100, 50, 20, 10, 5)]} df = pd.DataFrame(data) values = np.arange(0, 2500, 500) value_increment = 1000 # 调色板 colors = plt.cm.BuPu(np.linspace(0, 0.5, len(df))) n_rows = len(df) index = np.arange(len(df.columns)-1) + 0.3 bar_width = 0.6 # 条形堆叠图的垂直便宜 y_offset = np.zeros(len(df.columns)-1) # 绘制条形图并为表格创建文本标签列表 cell_text = [] for row in range(n_rows): plt.bar(index, df.iloc[:, row], bar_width, bottom=y_offset, color=colors[row]) y_offset = y_offset + df.iloc[:, row] cell_text.append(['%1.1f' % (x / 1000.0) for x in y_offset]) # 反转颜色和文本标签以在顶部显示最后一个值 colors = colors[::-1] cell_text.reverse() # 在轴的底部添加一个表格 the_table = plt.table(cellText=cell_text, rowLabels=df['rows'], rowColours=colors, colLabels=df.columns, loc='bottom') # 调整布局以为表格腾出空间 plt.subplots_adjust(left=0.1, bottom=0.1) # 修改刻度标签 plt.ylabel(f"Loss in ${value_increment}'s") plt.yticks(values * value_increment, ['%d' % val for val in values]) plt.xticks([]) plt.show()
定制多样化的表格
自定义表格一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
plottable主要利用Table
绘制表格,可以通过plottable了解更多用法
# 导入相关库
import matplotlib.pyplot as plt
import pandas as pd
from plottable import Table
from plottable import ColumnDefinition
from matplotlib.cm import Blues
from plottable.plots import image, circled_image, bar, percentile_bars, percentile_stars, progress_donut
from plottable.formatters import decimal_to_percent
import matplotlib as mpl
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
# 自定义数据
data = {'Score': [8, 6, 10, 3, 9],
'Value': [50.42, 17.01, 42.90, 6.83, 92.06],
'Comment': ['Nice', 'Cool', 'Fun', 'Bad', 'Okay']}
df = pd.DataFrame(data)
df.head()
-
不同的修改行列方式
fig = plt.figure(figsize=(12,4)) # 单列修改:column_definitions plt.subplot(1, 3, 1) column_definitions = [ColumnDefinition(name='Score', title='Score custom', # 自定义列名 textprops={"ha": "left", "weight": "bold"} # 文本格式 )] tab = Table(df, column_definitions=column_definitions) plt.title('单列修改:column_definitions') # 全部列修改:Table参数 plt.subplot(1, 3, 2) tab = Table(df, textprops={"ha": "left", "weight": "bold"}, # 文本格式 row_dividers=False, # 删除行之间的线 footer_divider=True, # 尾部添加参考线 ) plt.title('全部列修改:Table参数') # 细节修改 plt.subplot(1, 3, 3) tab = Table(df) tab.columns["Score"].set_facecolor('lightblue') # 自定义列 tab.rows[1].set_fontcolor('green') # 修改颜色 plt.title('细节修改') plt.show()
-
自定义颜色
fig = plt.figure(figsize=(12,8)) # 修改单列颜色 plt.subplot(3, 2, 1) tab = Table(df) tab.columns['Value'].set_facecolor("lightblue") tab.columns['Score'].set_fontcolor("green") plt.title('修改单列颜色') # 修改全部颜色 plt.subplot(3, 2, 2) tab = Table(df) for col in df.columns: tab.columns[col].set_facecolor("lightblue") tab.columns[col].set_fontcolor("red") plt.title('修改单列颜色') # 修改单行颜色 plt.subplot(3, 2, 3) tab = Table(df) tab.rows[1].set_facecolor("lightblue") tab.rows[2].set_fontcolor("red") plt.title('修改单行颜色') # 修改全部行颜色 plt.subplot(3, 2, 4) tab = Table(df, even_row_color='lightgrey', odd_row_color='orange') plt.title('修改全部行颜色') # 单列渐变色 plt.subplot(3, 2, 5) tab = Table(df, column_definitions=[ColumnDefinition(name="Score", cmap=Blues)]) plt.title('单列渐变色') plt.show()
-
插入图片
# 自定义数据 data = {'Score': [3, 12, 5, 7, 10], 'Comment': ['Fun', 'Okay', 'Nice', 'Bad', 'Cool'], 'Image': ['python', 'apple', 'apple', 'python', 'apple']} df = pd.DataFrame(data) # 修改Image,增加前后缀拼出路径 df['Image'] = df['Image'].apply(lambda x: x+'.png' if '.png' not in x else x) df['Image'] = df['Image'].apply(lambda x: 'pic/'+x if 'pic/' not in x else x) fig = plt.figure(figsize=(8,5)) # 插入图片 plt.subplot(1, 2, 1) plt.title('插入图片') coldef = [ColumnDefinition(name="Image", textprops={"ha": "center"}, width=0.5, plot_fn=image)] tab = Table(df, column_definitions=coldef) # 插入图片-圆形图像 plt.subplot(1, 2, 2) plt.title('插入图片-圆形图像') coldef = [ColumnDefinition(name="Image", textprops={"ha": "center"}, width=0.5, plot_fn=circled_image)] tab = Table(df, column_definitions=coldef) plt.show()
-
在表格中绘图
# 自定义数据 data = {'Score': [82, 68, 17, 39, 91], 'Value': [82, 68, 17, 39, 91], 'Metric': [82, 68, 17, 39, 91], 'KPI': [82, 68, 17, 39, 91]} df = pd.DataFrame(data) df = df/100 fig = plt.figure(figsize=(12,8)) # 绘制bar百分比 plt.subplot(3, 2, 1) plt.title('绘制bar百分比') tab = Table(df, textprops={"ha": "center"}, column_definitions=[ColumnDefinition("Score", plot_fn=percentile_bars, plot_kw={"is_pct": True})] ) # 绘制星星百分比 plt.subplot(3, 2, 2) plt.title('绘制星星百分比') tab = Table(df, cell_kw={"linewidth": 0, "edgecolor": "k"}, textprops={"ha": "center"}, column_definitions=[ColumnDefinition("Value", plot_fn=percentile_stars, plot_kw={"is_pct": True})] ) # 绘制甜甜圈进度 plt.subplot(3, 2, 3) plt.title('绘制甜甜圈进度') tab = Table(df, textprops={"ha": "center"}, column_definitions=[ColumnDefinition("Metric", plot_fn=progress_donut, plot_kw={"is_pct": True, "formatter": "{:.0%}"})]) # 绘制进度条 plt.subplot(3, 2, 4) plt.title('绘制进度条') cmap = plt.get_cmap('viridis') tab = Table(df, textprops={"ha": "center"}, column_definitions=[ColumnDefinition("KPI", plot_fn=bar, plot_kw={"cmap": cmap, "plot_bg_bar": True, "lw": 0.5})] ) # 各种百分比进度条 plt.subplot(3, 2, 5) plt.title('各种百分比进度条') cmap = plt.get_cmap('viridis') col_defs = [ColumnDefinition("Metric", plot_fn=progress_donut, plot_kw={"is_pct": True, "formatter": "{:.0%}"}), ColumnDefinition("Value", plot_fn=percentile_stars, plot_kw={"is_pct": True}), ColumnDefinition("Score", plot_fn=percentile_bars, plot_kw={"is_pct": True}), ColumnDefinition("KPI", plot_fn=bar, plot_kw={"cmap":cmap, "plot_bg_bar": True, "lw": 0.5}) ] tab = Table(df, cell_kw={"linewidth": 0, "edgecolor": "k"}, textprops={"ha": "center"}, column_definitions=col_defs) plt.show()
总结
以上通过pandas的styler
方法绘制独具风格的表格,这里推荐使用plottable快速绘制表格,并通过相关方法和参数自定义多样化的表格。
共勉~