Matplotlib散点图绘制求助:多列数据按列映射可视化需求
嘿,我完全懂你的需求啦——虽然刚接触Matplotlib,但这个散点图的需求其实很好实现!咱们直接上干货,一步步来:
核心思路
你要的是把每一列的所有数值,都对应到它们所在的列位置(比如第1列的所有点都在x=1的位置,第2列在x=2,以此类推)来画散点。本质就是给每个数据点匹配对应的x坐标,然后批量绘制。
完整代码示例
假设你已经用numpy.loadtxt把数据加载成了二维数组data(形状是(100000, 9)),直接用下面的代码就能搞定:
import numpy as np import matplotlib.pyplot as plt # 加载数据(你已经完成这一步了,这里只是示意) data = np.loadtxt("你的数据文件路径.txt") # 1. 生成每个数据点对应的x坐标:把列索引重复对应行数的次数 # 如果你想让x从1开始(而不是默认的0),就改成 np.arange(1, data.shape[1]+1) x_coords = np.repeat(np.arange(data.shape[1]), data.shape[0]) # 2. 把所有列的数值平铺成一维数组,和x坐标一一对应 y_values = data.flatten() # 3. 绘制散点图 plt.scatter(x_coords, y_values, s=1) # s=1是设置点的大小,数据量太大,小点才能看清分布 # 优化可视化:设置x轴刻度对应每一列 plt.xticks(np.arange(data.shape[1])) # 同样,x从1开始的话就改成 np.arange(1, data.shape[1]+1) # 添加标签让图更清晰 plt.xlabel('列位置') plt.ylabel('数值') plt.title('各列数值分布散点图') # 显示图像 plt.show()
关键代码解释
np.repeat(np.arange(data.shape[1]), data.shape[0]):比如你有9列,这个函数会把[0,1,2,...,8]里的每个数重复10万次,生成一个90万长度的数组,刚好和所有数据点的x位置对应。data.flatten():把二维数组“拍扁”成一维,这样x和y的长度完全一致,Matplotlib才能正确绘制。s=1:因为你有90万个数据点,点太大的话会重叠成黑块,调小尺寸才能看出每列数值的分布规律。
大数据量优化方案
如果直接画散点图有点卡顿(毕竟数据量不小),可以用六边形分箱图替代,它能更高效地展示数据密度,也不会卡:
plt.hexbin(x_coords, y_values, gridsize=50, cmap='viridis') plt.colorbar(label='数据点密度') # 颜色越深代表该区域点越多 plt.xticks(np.arange(data.shape[1])) plt.xlabel('列位置') plt.ylabel('数值') plt.title('各列数值密度分布图') plt.show()
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

