如何用Matplotlib绘制以二维数组值为标记大小的散点图?
解决Matplotlib Scatter绘制索引坐标+元素值为尺寸的问题
你的代码目前只绘制了单个点,因为plt.scatter(z,z, s=z_combo[i,j])里的z,z是单个坐标,z_combo[i,j]是循环结束后的最后一个元素值,完全没遍历所有数组元素。要实现你要的效果,得把所有索引对作为坐标,对应元素值作为点的大小,步骤如下:
问题核心修正
- 需要生成所有网格点的x、y坐标数组,而非单个坐标值
- 把二维的
z_combo展平成一维数组,对应每个点的尺寸 - 原始组合数数值偏小,需乘以缩放因子让点的大小更直观
修正后的完整代码
# -*- coding: utf-8 -*- import matplotlib.pyplot as plt import numpy as np z = 11 z_combo = np.zeros((z,z)) z_combo[0,0] = 1 # 生成杨辉三角(帕斯卡三角),修正边界索引错误 for i in range(1,z): for j in range(z): if j == 0: z_combo[i,j] = z_combo[i-1,j] else: z_combo[i,j] = z_combo[i-1,j-1] + z_combo[i-1,j] # 生成所有点的x、y坐标:用meshgrid创建网格,再展平成一维数组 x, y = np.meshgrid(np.arange(z), np.arange(z)) x_flat = x.flatten() y_flat = y.flatten() # 把组合数值展平,乘以缩放因子让点大小更明显 sizes = z_combo.flatten() * 10 # 绘制散点图 plt.scatter(x_flat, y_flat, s=sizes, alpha=0.7, color='#1f77b4') # 调整坐标轴和样式 plt.xlim(-0.5, z-0.5) plt.ylim(-0.5, z-0.5) plt.xlabel('X 索引') plt.ylabel('Y 索引') plt.title('基于数组索引和元素值的散点图') plt.grid(True, linestyle='--', alpha=0.5) plt.show()
关键说明
- 坐标生成:
np.meshgrid生成z×z的网格坐标矩阵,flatten()将其转为一维数组,刚好对应每个数组元素的索引位置 - 尺寸处理:
z_combo.flatten()把二维数组转成和坐标长度一致的一维数组,乘以10是因为原始组合数直接作为size会导致点过小,可根据需求调整缩放因子 - 边界修正:原循环中j=0时会出现负索引错误,新增判断保证杨辉三角生成正确
- 样式优化:
alpha设置透明度避免重叠点遮挡,网格线方便对应索引位置
运行后就能得到你想要的效果:每个点的位置对应数组的(i,j)索引,点的大小由z_combo[i,j]的数值决定。
内容的提问来源于stack exchange,提问作者Luke Kelly
相关产品推荐
相关产品推荐

