如何创建以日期为X轴的非堆叠条形图?含日期轴配置问题
解决非堆叠条形图与日期轴格式化问题
你遇到的核心问题是两个条形系列使用了完全相同的x轴位置,导致它们重叠在一起,而非真正的非堆叠并排显示。另外我们可以优化日期轴的处理逻辑,确保格式化和定位器正常工作。下面是完整的解决方案:
步骤说明
- 为每个条形系列添加x轴偏移量:因为你设置了
width=0.1,我们可以将第二个条形的x轴位置向后偏移这个宽度对应的天数(matplotlib会自动将datetime转换为数值处理)。 - 保留datetime类型的x轴数据:不需要转成list,直接使用DataFrame中的datetime列即可,这样日期定位器能更好地识别。
- 添加图例:明确区分不同的元素系列,提升可读性。
修改后的完整代码
import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas as pd import numpy as np # 示例DataFrame(模拟你的数据结构) data = { 'Date start': pd.date_range(start='2024-01-01', periods=5, freq='D'), 'Container': [1,1,1,1,1], 'Aluminum (Al)\nppb': [12, 15, 18, 14, 20], 'Barium (Ba)\nppb': [8, 10, 12, 9, 15] } df = pd.DataFrame(data) fig, ax = plt.subplots(1,1, figsize=(15,8)) fig.suptitle('ICP: Time standing', fontsize=25, fontweight='bold') # 筛选容器1的数据 filtered_df = df[df['Container'] == 1] dates = filtered_df['Date start'] bar_width = 0.1 # 绘制第一个条形,x轴为原始日期 ax.bar(dates, filtered_df['Aluminum (Al)\nppb'], width=bar_width, label='Aluminum (Al) ppb') # 绘制第二个条形,x轴偏移bar_width对应的天数 ax.bar(dates + pd.Timedelta(days=bar_width), filtered_df['Barium (Ba)\nppb'], width=bar_width, label='Barium (Ba) ppb') # 配置x轴日期格式 myFmtx = mdates.DateFormatter("%d/%m") ax.xaxis.set_major_locator(mdates.DayLocator(interval=1)) ax.xaxis.set_major_formatter(myFmtx) fig.autofmt_xdate() # 自动旋转日期标签,避免重叠 # 添加图例和轴标签 ax.legend(fontsize=12) ax.set_xlabel('Date', fontsize=14) ax.set_ylabel('Concentration (ppb)', fontsize=14) plt.tight_layout() plt.show()
效果说明
- 两个元素的条形会并排显示而非堆叠,每个日期对应两个相邻的条形。
- x轴会按每天显示一个刻度,格式为
dd/mm,标签自动旋转避免重叠。 - 图例清晰标注每个条形对应的元素,图表整体可读性更强。
内容的提问来源于stack exchange,提问作者Offir Inbar
相关产品推荐
相关产品推荐

