不同频率pandas时间序列合并绘制折线与分组柱状图问题问询
不同频率时间序列合并绘制折线+分组柱状图解决方案
问题根源
你当前的显示异常核心原因是两个子图使用了完全不匹配的X轴坐标体系:折线图的X轴是实际日期格式的连续刻度,而你绘制柱状图时用np.arange(len(date_operations_monthly))生成了0~106的整数索引作为X轴,两者没有对应关系,所以合并后显示错乱。
解决方案
统一使用datetime类型作为两个图表的X轴坐标,让月度数据的柱状图直接映射到实际日期位置上即可,具体实现代码如下:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates import numpy as np # 第一步:先把所有日期列统一转换为pandas datetime格式 df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date']) # 第二步:绘制日度汇率折线图,保留datetime格式的X轴 fig, ax1 = plt.subplots(figsize=(15,6)) ax1.plot(df1['Date'], df1['exchange_rate_daily'], color="k", label="Exchange rate (daily)", linewidth=2) ax1.set_ylabel('Daily Exchange Rate', fontsize=12) ax1.legend(loc = "upper left") # 第三步:绘制月度分组柱状图,直接用月度日期做X轴,调整偏移量适配日期轴 # 日期轴默认单位是天,柱子宽度设为12天,两个柱子分别向月度日期前后偏移6天避免重叠 ax2 = ax1.twinx() width = 12 rects1 = ax2.bar(df2['Date'] - pd.Timedelta(days=6), df2['intervention_monthly'], width=width, label='Intervention (monthly)', color='#ff7f0e') rects2 = ax2.bar(df2['Date'] + pd.Timedelta(days=6), df2['client_monthly'], width=width, label='Client operation (monthly)', color='#2ca02c') ax2.set_ylabel('Monthly Operation Value', fontsize=12) ax2.legend(loc = "upper right") # 可选:优化X轴刻度显示,避免标签拥挤 ax1.xaxis.set_major_locator(mdates.MonthLocator()) ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) plt.xticks(rotation=70) plt.tight_layout() plt.show()
注意事项
如果你的数据时间跨度较大,可以适当调整柱子宽度和偏移量,也可以把X轴主刻度修改为季度/年度显示,进一步优化可读性。
内容的提问来源于stack exchange,提问作者Petr_k
相关产品推荐
相关产品推荐

