如何基于列1数值范围筛选数据并绘制列2、3或列2直方图
数据筛选与绘图实现方案
问题说明
处理一个3列20000行的文本数据文件,需完成:
- 绘制列2与列3的散点图,或列2的直方图
- 仅保留列1数值在100-250范围内的数据
数据样本:
174.2227 0.1624629285511385E+03 -0.6292327918805374E+02 96.5364 0.9382981565234142E+02 -0.2269888520085278E+02 170.4995 0.1255471456652923E+03 -0.1153603193263530E+03 70.3605 0.5622579821326531E+02 -0.4229968593987883E+02 70.3641 0.1705414793985607E+02 -0.6826609764576108E+02 245.6546 0.1009630870343540E+03 -0.2239478772161106E+03 247.0803 0.2428952541481390E+03 -0.4528334882548071E+02 240.4885 0.1898105937624483E+03 -0.1476708453344265E+03 190.4206 0.2201049326187159E+01 -0.1904078537576801E+03 58.0858 0.2315296872737939E+02 -0.5327192955482575E+02 263.4021 0.2480699465562589E+03 -0.8855483744759709E+02 52.9697 0.1776581942067039E+02 -0.4990154780891378E+02 135.9583 0.1774572342000289E+02 -0.1347952056648868E+03 79.8317 0.5762263417747670E+02 -0.5525152449053701E+02 155.5004 0.1506111928119825E+03 -0.3868642911295389E+02
原尝试代码:
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np file1 = "data1.txt" a1 = np.loadtxt(file1,usecols=[0]) b1 = np.loadtxt(file1,usecols=[1]) c1 = np.loadtxt(file1,usecols=[2]) while 100 < a1 < 200: plt.plot(b1,c1,'k.') plt.show()
问题分析
- 多次调用
np.loadtxt加载同一文件,IO效率低下,尤其针对20000行数据 while循环逻辑错误:数组无法直接用100 < a1 < 200做比较,会返回布尔数组而非单个布尔值,导致循环无法正常执行- 未正确筛选数据,直接绘制全部数据不符合需求
正确实现代码
1. 加载并筛选数据
import matplotlib.pyplot as plt import numpy as np file1 = "data1.txt" # 一次加载所有3列数据 data = np.loadtxt(file1) # 拆分各列 col1, col2, col3 = data[:, 0], data[:, 1], data[:, 2] # 生成筛选掩码:保留col1在100到250之间的数据 mask = (col1 >= 100) & (col1 <= 250) # 应用掩码筛选数据 filtered_col2 = col2[mask] filtered_col3 = col3[mask]
2. 绘制列2与列3的散点图
plt.figure(figsize=(8, 6)) plt.scatter(filtered_col2, filtered_col3, c='k', marker='.', label='筛选后数据') plt.xlabel('列2数值') plt.ylabel('列3数值') plt.title('列2 vs 列3(列1∈[100,250])') plt.legend() plt.grid(True, alpha=0.3) plt.show()
3. 绘制列2的直方图
plt.figure(figsize=(8, 6)) plt.hist(filtered_col2, bins=20, edgecolor='black', alpha=0.7) plt.xlabel('列2数值') plt.ylabel('频数') plt.title('列2直方图(列1∈[100,250])') plt.grid(True, alpha=0.3) plt.show()
内容的提问来源于stack exchange,提问作者jord
相关产品推荐
相关产品推荐

