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

如何创建以日期为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:38:55