如何在Pandas DataFrame表格的col2列添加Excel式条件格式数据条
实现Matplotlib表格单元格的数据条条件格式
直接上解决方案:我们可以在自定义的render_mpl_table函数里新增逻辑,针对指定列绘制数据条。核心思路是先渲染基础表格,再遍历目标列的单元格,根据数值相对大小绘制填充矩形,模拟Excel的数据条效果。
完整代码示例
import pandas as pd import matplotlib.pyplot as plt from matplotlib.patches import Rectangle def render_mpl_table(data, col_width=3.0, row_height=0.625, font_size=14, header_color='#40466e', row_colors=['#f1f1f2', 'w'], edge_color='w', bbox=[0, 0, 1, 1], header_columns=0, ax=None, data_bar_col=None): # 新增参数指定要加数据条的列 if ax is None: size = (col_width * data.shape[1], row_height * data.shape[0]) fig, ax = plt.subplots(figsize=size) ax.axis('off') # 渲染基础表格 mpl_table = ax.table(cellText=data.values, colLabels=data.columns, bbox=bbox, colWidths=[col_width]*data.shape[1]) mpl_table.auto_set_font_size(False) mpl_table.set_fontsize(font_size) # 设置表格基础样式 for k, cell in mpl_table._cells.items(): cell.set_edgecolor(edge_color) if k[0] == 0: cell.set_text_props(weight='bold', color='w') cell.set_facecolor(header_color) else: cell.set_facecolor(row_colors[k[0]%len(row_colors)]) # 绘制数据条逻辑 if data_bar_col is not None: col_idx = data.columns.get_loc(data_bar_col) # 归一化目标列数值到0-1区间,用于计算数据条宽度比例 col_values = data[data_bar_col].values norm_vals = (col_values - col_values.min()) / (col_values.max() - col_values.min()) # 遍历目标列的每个单元格(跳过表头行) for row_idx in range(1, data.shape[0]+1): cell = mpl_table[(row_idx, col_idx)] # 获取单元格的位置和尺寸 x, y, w, h = cell.get_bbox().bounds # 加边距避免数据条贴满单元格 padding = 0.05 * w bar_width = (w - 2*padding) * norm_vals[row_idx-1] # 创建数据条矩形 bar = Rectangle((x + padding, y + padding*2), bar_width, h - padding*4, facecolor='#56b4e9', alpha=0.7) ax.add_patch(bar) # 确保单元格文字显示在数据条上方 cell.set_zorder(1) return ax # 测试用DataFrame df = pd.DataFrame({ 'col1': ['A', 'B', 'C', 'D', 'E'], 'col2': [12, 45, 23, 78, 36] }) # 生成带col2数据条的表格 render_mpl_table(df, data_bar_col='col2') plt.show()
关键细节说明
- 通过
data_bar_col参数指定目标列,灵活适配不同需求 - 数值归一化处理,保证数据条宽度能准确反映该列数值的相对大小
- 加入边距优化视觉效果,避免数据条与单元格边界过度贴合
- 设置单元格
zorder确保文字不会被数据条遮挡 - 数据条的颜色、透明度可通过
facecolor和alpha参数自定义调整
内容的提问来源于stack exchange,提问作者Giampaolo Levorato
相关产品推荐
相关产品推荐

