You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用matplotlib或seaborn自动生成Crosstab交叉表图?

如何用Matplotlib/Seaborn自动生成十字交叉(Crosstab)图

我希望用Matplotlib或Seaborn生成类似十字交叉的Crosstab图,使用以下DataFrame:

import pandas as pd

data = [['A', 'C', 2], ['A', 'D', 8], ['B', 'C', 25], ['B', 'D', 30]]
df = pd.DataFrame(data=data, columns=['col', 'row', 'val'])

DataFrame内容:

col row  val
0   A   C    2
1   A   D    8
2   B   C   25
3   B   D   30

我尝试过用Matplotlib的plt.gca()和add_patch手动添加矩形,但效果很差,代码如下:

from matplotlib.patches import Rectangle
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
plt.xlim(-10, 40)
plt.ylim(-40, 40)
plt.rcParams['figure.figsize'] = (10,16)

someX, someY = 0, 0
currentAxis = plt.gca()
currentAxis.add_patch(Rectangle((someX, someY), 30, 30, facecolor="purple"))
ax.text(15, 15, '30')
currentAxis.add_patch(Rectangle((someX, someY), 25, -25, facecolor="blue"))
ax.text(12.5, -12.5, '25')
currentAxis.add_patch(Rectangle((someX, someY), -2, -2, facecolor="red"))
ax.text(-1, -1, '2')
currentAxis.add_patch(Rectangle((someX, someY), -8, 8, facecolor="green"))
ax.text(-4, 4, '8')

想问有没有办法用Matplotlib或Seaborn自动生成这种十字交叉图?


可以通过对数据分组映射象限规则,循环自动绘制图形元素,避免手动逐个添加。以下是Matplotlib的实现方案:

自动绘制实现代码

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

# 原始数据
data = [['A', 'C', 2], ['A', 'D', 8], ['B', 'C', 25], ['B', 'D', 30]]
df = pd.DataFrame(data=data, columns=['col', 'row', 'val'])

# 定义每个(col, row)组合对应的象限方向、填充色
quad_config = {
    ('A', 'C'): {'x_sign': -1, 'y_sign': -1, 'color': 'red'},
    ('A', 'D'): {'x_sign': -1, 'y_sign': 1, 'color': 'green'},
    ('B', 'C'): {'x_sign': 1, 'y_sign': -1, 'color': 'blue'},
    ('B', 'D'): {'x_sign': 1, 'y_sign': 1, 'color': 'purple'}
}

# 初始化画布与坐标轴
plt.figure(figsize=(10, 10))
ax = plt.gca()
max_val = df['val'].max()
ax.set_xlim(-max_val - 5, max_val + 5)
ax.set_ylim(-max_val - 5, max_val + 5)
# 绘制十字中线
ax.axhline(0, color='black', linewidth=2)
ax.axvline(0, color='black', linewidth=2)

# 遍历数据自动生成矩形和文本
for _, row in df.iterrows():
    col_cat, row_cat, val = row['col'], row['row'], row['val']
    config = quad_config[(col_cat, row_cat)]
    x_sign, y_sign, color = config['x_sign'], config['y_sign'], config['color']
    
    # 计算矩形左下角坐标与尺寸
    x_start = 0 if x_sign == 1 else -val
    y_start = 0 if y_sign == 1 else -val
    rect_width = val * x_sign
    rect_height = val * y_sign
    
    # 添加矩形
    rect = Rectangle((x_start, y_start), rect_width, rect_height, facecolor=color, alpha=0.7)
    ax.add_patch(rect)
    # 添加居中文本
    text_x = x_start + rect_width / 2
    text_y = y_start + rect_height / 2
    ax.text(text_x, text_y, str(val), fontsize=14, ha='center', va='center', color='white')

# 保证坐标轴比例一致,避免矩形变形
plt.axis('equal')
plt.show()

方案说明

  • 通过quad_config统一配置分组对应的象限规则,避免重复手动代码
  • 自动计算矩形的位置与尺寸,确保每个矩形从原点延伸至对应数值的位置
  • 十字中线强化交叉效果,axis('equal')保证图形比例正确
  • 文本自动居中显示在矩形内部,无需手动计算坐标

内容的提问来源于stack exchange,提问作者Quinten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:40:49