如何将Pandas DataFrame绘制成折线子图?
如何将Pandas DataFrame绘制成折线子图?
看起来你遇到了两个核心问题——一是读取JSON数据后没法正常绘图,二是想把数据拆成两部分做子图。我来帮你一步步搞定:
首先,先搞定数据读取和格式的问题
你现在的JSON是时间戳(整数)作为键、数值作为值的结构,直接用pd.read_json()读取会导致Pandas识别错格式,这就是你碰到ValueError: If using all scalar values, you must pass an index的原因。
正确的处理步骤是:
- 先把JSON加载成Python字典
- 转成DataFrame时指定
orient='index',让时间戳成为行索引 - 把整数索引转换成真正的
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
相关产品推荐
相关产品推荐

