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

如何将Pandas DataFrame绘制成折线子图?

如何将Pandas DataFrame绘制成折线子图?

看起来你遇到了两个核心问题——一是读取JSON数据后没法正常绘图,二是想把数据拆成两部分做子图。我来帮你一步步搞定:

首先,先搞定数据读取和格式的问题

你现在的JSON是时间戳(整数)作为键、数值作为值的结构,直接用pd.read_json()读取会导致Pandas识别错格式,这就是你碰到ValueError: If using all scalar values, you must pass an index的原因。

正确的处理步骤是:

  1. 先把JSON加载成Python字典
  2. 转成DataFrame时指定orient='index',让时间戳成为行索引
  3. 把整数索引转换成真正的datetime类型(不然x轴会是一串看不懂的大数字)

代码示例:

import pandas as pd
import matplotlib.pyplot as plt
import json

# 读取JSON文件为字典
with open('somedata.json', 'r') as json_file:
    data_pairs = json.load(json_file)

# 转成DataFrame,orient='index'让键作为索引,columns指定列名
df = pd.DataFrame.from_dict(data_pairs, orient='index', columns=['数值'])
# 把毫秒级时间戳转成datetime类型(你的时间戳是13位,所以用unit='ms')
df.index = pd.to_datetime(df.index, unit='ms')

接下来,绘制拆分后的子图

现在数据格式正确了,我们可以用plt.subplots()创建2行1列的子图,分别绘制前5组数据和剩余数据:

# 创建2行1列的子图,设置图大小让内容更清晰
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))

# 第一个子图:前5条数据
df.iloc[:5].plot(kind='line', ax=ax1, legend=False)
ax1.set_title('前5组数据')
ax1.set_ylabel('数值')
ax1.tick_params(axis='x', rotation=45)  # 旋转x轴标签避免重叠

# 第二个子图:剩余的数据
df.iloc[5:].plot(kind='line', ax=ax2, legend=False)
ax2.set_title('剩余数据')
ax2.set_xlabel('时间')
ax2.set_ylabel('数值')
ax2.tick_params(axis='x', rotation=45)

# 自动调整子图间距,避免标题和标签挤在一起
plt.tight_layout()
plt.show()

为啥之前的代码不行?

你之前直接用pd.read_json()后调用df.plot.line()报错,是因为Pandas把你的JSON键值对当成了列而不是行,导致DataFrame是一堆零散的标量值,没有正确的行索引,不符合绘图的要求。用from_dict(orient='index')就把键转成了行索引,值转成了列,这样就满足Pandas绘图的条件啦。

哦对了,把索引转成datetime类型超重要——不然x轴会显示成一串长长的整数时间戳,可读性极差,转成datetime后,Pandas会自动帮你格式化x轴的时间标签,看起来直观多了。

备注:内容来源于stack exchange,提问作者binary_assemble

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:49:50