如何创建带归一化标记透明度的散点图并修正图表形状
问题解决
1. 修正图表形状(解决行顺序颠倒/疑似转置问题)
Matplotlib默认y轴原点在左下角,而你的DataFrame行索引是从上到下排列的,直接用行索引作为y值会导致第0行出现在图表最下方,和原DataFrame的布局颠倒。解决方式是反转y轴的数值,让第0行对应图表最上方:
- 将生成y的代码改为
y = np.tile(ox[::-1], (len(df), 1)),实现行索引的反转映射。
x对应DataFrame的列索引,保持原有生成逻辑即可,这样每个点的位置会和DataFrame单元格的位置完全匹配。
2. 根据数值调整透明度
把DataFrame的数值归一化到0-1区间,数值越低透明度越浅(alpha越小),越高透明度越深(alpha越大)。手动计算归一化后的alpha值:
alpha_vals = (df.values - df.values.min()) / (df.values.max() - df.values.min())
然后在plt.scatter()中指定alpha=alpha_vals.ravel()(scatter要求传入一维数组)。
完整修正代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np rng = np.random.default_rng(seed=111) rints = rng.integers(low=0, high=1000, size=(5,5)) df = pd.DataFrame(rints) ox = np.arange(len(df)) # x对应列索引,保持原有逻辑 x = np.tile(ox[:, np.newaxis], (1, len(ox))) # y对应反转后的行索引,匹配DataFrame的行顺序 y = np.tile(ox[::-1], (len(df), 1)) # 计算归一化的透明度值 alpha_vals = (df.values - df.values.min()) / (df.values.max() - df.values.min()) plt.scatter(x, y, marker='o', color='tab:orange', ec='k', ls='--', s=df.values.ravel(), alpha=alpha_vals.ravel()) # 添加单元格数值标注 for ix, iy, v in zip(x.ravel(), y.ravel(), df.values.ravel()): plt.annotate(str(v), (ix, iy), textcoords='offset points', xytext=(0,10), ha='center') plt.axis("off") plt.margins(y=0.2) plt.show()
关键说明
- 反转y轴索引后,图表行顺序和DataFrame完全一致,第0行在最上方,第4行在最下方;
- 透明度归一化后,数值最小的单元格(如83)颜色最浅,数值最大的(如968)颜色最深;
s=df.values.ravel()确保标记大小和单元格数值的对应逻辑不变。
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

