You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:06:31