使用pandas+matplotlib绘制散点图选50-81行无显示如何解决
问题原因
核心bug是代码里残留了调试用的var = var.head()语句。
pandas的head()方法默认仅返回数据集的前5行,执行完这行后,原本1000行的全量数据会被截断为仅含索引0-4的5行数据。后续再调用iloc[50:81]切片时,选取的行范围完全超出当前DataFrame的索引边界,得到的是空表,自然无法渲染出任何数据点。之前0-5行区间能正常出图,本质是刚好匹配了head()返回的5行数据范围。
另外代码最后plt.show(ax1 == ax2 == ax3)属于错误传参:plt.show()不需要传入任何参数,传入三个坐标轴对象的相等判断结果(布尔值)在部分matplotlib版本下会触发警告或运行异常。
修复方案
- 删除调试残留的
var = var.head()行,保留全量读取的数据集。 - 移除
plt.show()里的多余传参,直接调用即可。 - (可选优化)读取Excel时可直接指定需要加载的列,省去二次构造DataFrame的冗余步骤。
- 注意
iloc切片遵循左闭右开规则:如果需要取到索引为81的行,切片结束位置需要写为82,iloc[50:81]实际只会取到索引80的行。
修复后完整代码
import pandas as pd import matplotlib.pyplot as plt testproject = r"C:\Users\223070186\Documents\PleaseWork.xlsx" # 读取时直接加载需要的列 df = pd.read_excel(testproject, sheet_name="Test1", usecols=["Time", "PM1", "PM3", "AFS"]) # 提取目标行区间,如需包含索引81的行请将结束值改为82 df2 = df.iloc[50:82, :] ax1 = df2.plot(kind="scatter", x="Time", y="PM1", color="r", label="PM1") ax2 = df2.plot(kind="scatter", x="Time", y="PM3", color="b", ax=ax1, label="PM3") df2.plot(kind="scatter", x="Time", y="AFS", color="g", ax=ax2, label="AFS") plt.xlabel("Time") plt.ylabel("PM1, PM3, AFS") plt.title("Time vs PM1, PM3, AFS splits") plt.legend() plt.show()
排查补充
如果运行修复后代码仍无法显示数据,先执行print(df2)确认切片结果非空,再检查Time/PM1/PM3/AFS四列的数据类型是否为数值型,存在字符串格式的数值或大量空值时,散点图也会出现渲染异常。
内容的提问来源于stack exchange,提问作者kingjcp44
相关产品推荐
相关产品推荐

