如何使用pandas在同比例坐标轴的同图中绘制不同列的数值曲线
实现方案
1. 等长DataFrame绘图
要求用pandas实现且共用坐标轴刻度,最优方式是先对齐两个DataFrame的时间轴再绘图,具体代码如下:
import pandas as pd import matplotlib.pyplot as plt # 构造参考数据 data1 = {'time': [0.973841, 1.000934, 1.027918, 1.055180, 1.082246], 'value1': [0.483, 0.494, 0.468, 0.477, 0.460]} data2 = {'time': [0.779984, 0.801439, 0.823164, 0.844759, 0.866461], 'value2': [0.027, 0.036, 0.030, 0.030, 0.035]} df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 外连接合并两个表,对齐时间轴 merged_df = pd.merge(df1, df2, on='time', how='outer') # 设置time为索引,直接调用pandas plot方法 merged_df.set_index('time').plot() plt.show()
上述代码自动使用相同坐标轴刻度,两条曲线分别对应value1和value2。
2. 不等长DataFrame绘图
不需要额外适配长度差异,沿用上面的外连接合并逻辑即可,缺失值绘图时会自动忽略,具体代码如下:
import pandas as pd import matplotlib.pyplot as plt # 构造不等长参考数据 data1 = {'time': [0.973841, 1.000934, 1.027918, 1.055180, 1.082246], 'value1': [0.483, 0.494, 0.468, 0.477, 0.460]} data3 = {'time': [0.779984, 0.801439, 0.823164, 0.844759, 0.866461, 1.0, 2.0], 'value3': [0.027, 0.036, 0.030, 0.030, 0.035, 0.04, 0.045]} df1 = pd.DataFrame(data1) df3 = pd.DataFrame(data3) # 同样使用外连接合并,自动对齐所有时间点 merged_df = pd.merge(df1, df3, on='time', how='outer') merged_df.set_index('time').plot() plt.show()
该方案不管参与绘图的DataFrame长度是否一致都通用,合并后所有曲线共用同一套坐标轴刻度,不需要手动调整刻度。
关键说明
- 合并时使用
how='outer'是为了保留所有输入表的时间点,不会截断任何曲线的有效数据 - pandas的DataFrame.plot()方法默认所有列共享同一套坐标轴,刻度比例自动统一,无需手动配置
- 合并产生的空值(NaN)在绘图时会被自动跳过,不会影响曲线的连续性
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

