如何使用Python和matplotlib在子图中绘制多条线并绑定多列dataframe
实现方法
pandas内置的plot方法支持指定目标axes对象,你不需要修改原方案的子图创建逻辑,直接把多列DataFrame绘制到对应子图的ax上即可,步骤如下:
- 先按照原方案的结构创建共享x轴的子图对象,同时提前整理好对应子图的数据集:
import matplotlib.pyplot as plt import pandas as pd # 示例数据集结构,索引为日期格式,列对应每个要绘制的线条 # 顶部子图数据集:包含IBM股价、30日移动平均线两列 top_df = pd.DataFrame({ "IBM股价": ibm_close_series, "30日移动平均线": ma_30_series }, index=date_index) # 底部子图数据集:包含30日方差、180日方差两列 bottom_df = pd.DataFrame({ "30日方差": vol_30_series, "180日方差": vol_180_series }, index=date_index) # 创建共享x轴的双行子图,和原方案结构完全一致 fig, (ax0, ax1) = plt.subplots(nrows=2, ncols=1, sharex=True, figsize=(10,7))
- 调用对应DataFrame的
plot方法,通过ax参数指定要绘制到的子图对象,pandas会自动把所有列绘制成独立线条,索引作为x轴:
# 顶部子图绘制两条线 top_df.plot(ax=ax0) # 底部子图绘制两条线 bottom_df.plot(ax=ax1)
- 如果需要和原方案一样拿到单个线条对象做样式调整,直接从
ax.lines属性按列顺序取即可:
# 顺序和DataFrame的列顺序一一对应 line_price, line_ma30 = ax0.lines line_vol30, line_vol180 = ax1.lines # 可直接调整线条属性,和原方案的操作逻辑完全兼容 line_price.set_color("darkblue") line_ma30.set_color("orange")
补充说明
- 你也可以直接在
plot方法中统一设置线条样式,比如top_df.plot(ax=ax0, color=["darkblue", "orange"], linewidth=2),无需后续单独调整 - 原方案的共享x轴逻辑完全不受影响,pandas会自动对齐两个DataFrame的日期索引,x轴仅在底部显示
内容的提问来源于stack exchange,提问作者user6090578
相关产品推荐
相关产品推荐

