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

如何在同一图表中叠加两个结构匹配的DataFrame数据?

嘿,这个需求其实挺常见的,用Python里的pandas和matplotlib就能轻松实现同图叠加展示!我给你分两种常用方法来讲解,你可以根据自己的需求选:

方法一:用Pandas自带的绘图功能(简单快捷)

Pandas的DataFrame自带plot()方法,能快速生成图表,叠加不同DataFrame的列只需要连续调用就行。首先记得把Date列转换成datetime格式,不然X轴的日期会乱序:

import pandas as pd
import matplotlib.pyplot as plt

# 先把两个DataFrame的Date列转成datetime类型
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

# 可选:把Date设为索引,这样X轴直接显示日期,不用额外指定x参数
df1.set_index('Date', inplace=True)
df2.set_index('Date', inplace=True)

# 叠加绘制Close列(你也可以换成Open/High/Low等其他列)
df1['Close'].plot(label='第一个DataFrame 收盘价', figsize=(12, 6))
df2['Close'].plot(label='第二个DataFrame 收盘价')

# 添加图表元素
plt.title('两个DataFrame收盘价对比')
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend()  # 显示图例区分两条线
plt.show()

方法二:用Matplotlib手动控制(更灵活)

如果需要自定义更多细节(比如线型、颜色、透明度),直接用Matplotlib的axes对象来绘制会更灵活:

import pandas as pd
import matplotlib.pyplot as plt

# 同样先转换日期格式
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

# 创建画布和坐标轴
fig, ax = plt.subplots(figsize=(12, 6))

# 分别绘制两个DataFrame的Close列,自定义样式
ax.plot(df1['Date'], df1['Close'], label='DF1 收盘价', color='#1f77b4', linewidth=2)
ax.plot(df2['Date'], df2['Close'], label='DF2 收盘价', color='#ff7f0e', linestyle='--', linewidth=2)

# 设置图表属性
ax.set_title('收盘价叠加对比', fontsize=14)
ax.set_xlabel('日期', fontsize=12)
ax.set_ylabel('价格', fontsize=12)
ax.legend(fontsize=12)

# 旋转X轴日期标签,避免重叠
plt.xticks(rotation=45)
plt.tight_layout()  # 自动调整布局,防止标签被截断
plt.show()

额外技巧:双Y轴展示不同量级指标(比如价格+成交量)

如果要叠加的是不同量级的指标(比如价格和成交量),可以用双Y轴来避免其中一条线被压缩:

import pandas as pd
import matplotlib.pyplot as plt

df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

fig, ax1 = plt.subplots(figsize=(12, 6))

# 左侧Y轴绘制收盘价
ax1.plot(df1['Date'], df1['Close'], label='DF1 收盘价', color='blue')
ax1.plot(df2['Date'], df2['Close'], label='DF2 收盘价', color='orange')
ax1.set_xlabel('日期')
ax1.set_ylabel('价格')
ax1.legend(loc='upper left')

# 创建右侧Y轴绘制成交量
ax2 = ax1.twinx()
ax2.plot(df1['Date'], df1['Volume'], label='DF1 成交量', color='green', alpha=0.5)
ax2.plot(df2['Date'], df2['Volume'], label='DF2 成交量', color='red', alpha=0.5)
ax2.set_ylabel('成交量')
ax2.legend(loc='upper right')

plt.title('价格与成交量叠加展示')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

关键注意点:

  • 一定要确保两个DataFrame的Date列是datetime类型,并且排序一致(你已经说Date列取值完全一致,所以这步没问题)
  • 用label参数给每条曲线命名,再通过legend()显示图例,方便区分
  • 如果需要叠加多列,只需要继续调用plot()方法就行

内容的提问来源于stack exchange,提问作者Kevin Riordan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:18:34