如何使用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
相关产品推荐
相关产品推荐

