如何在同一图表中叠加两个结构匹配的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
相关产品推荐
相关产品推荐

