Python 如何使用CSV数据沿X轴并排绘制条形图

Python 如何使用CSV数据沿X轴并排绘制条形图,python,pandas,matplotlib,Python,Pandas,Matplotlib,我正在尝试创建一个条形图,其中一个X轴刻度(日期)上有两个条形,表示两组数据。但是,我无法使它跨越图形到其他x轴刻度 这是我的密码: simsubs = pd.read_csv('simsubs.csv') fig, axs = plt.subplots(4, sharex=True, figsize=(11,9)) bar_width = 0.35 x = simsubs.Date axs[3].bar(x, simsubs['CPS1 Deletes'], width=bar_wid

我正在尝试创建一个条形图,其中一个X轴刻度(日期)上有两个条形,表示两组数据。但是,我无法使它跨越图形到其他x轴刻度

这是我的密码:

simsubs = pd.read_csv('simsubs.csv')

fig, axs = plt.subplots(4, sharex=True, figsize=(11,9))

bar_width = 0.35

x = simsubs.Date

axs[3].bar(x, simsubs['CPS1 Deletes'], width=bar_width, zorder=2, label='Deletes', color='#A31214')
axs[3].bar(bar_width, simsubs['CPS1 Total'], width=bar_width, zorder=2, label='Deletes', color='blue')

plt.xticks(rotation=45)

plt.show()
simsubs.Date
指向我希望沿X轴绘制的CSV中的日期,但这是我的代码生成的img:

提前感谢您的帮助。一般来说,我对社区和python编码都是新手,如果我的术语或帖子可能令人困惑,我深表歉意

axs[3].bar(bar_width, simsubs['CPS1 Total'], width=bar_width, zorder=2, label='Deletes', color='blue')
这里的x值是固定的,即所有数据都绘制在
x=bar\u width=0.35
上。您应该将条形图宽度更改为x+条形图宽度(即第二个条形图的x位置由第一个条形图宽度偏移),因此看起来如下所示:

axs[3].bar(x + bar_width, simsubs['CPS1 Total'], width=bar_width, zorder=2, label='Deletes', color='blue')
编辑:

由于您的x值是时间戳,因此我通过首先将这些时间戳值更改为DateTime对象来实现您想要的功能,如下所示:

simsubs['Date'] = simsubs['Date'].apply(pd.to_datetime)
然后应用必须调整的偏移量,如下所示:

x_offset = simsubs['Date'] + pd.Timedelta(offset, units)
这应该是有效的,因为X值是均匀分布的(相隔7天),所以我建议
offset=3.5
units='days'
。在第二个条形图中将此x_偏移用作x值


我已经尝试过将这些DateTime对象重置为时间戳(如果日期分布不均匀,使用时间戳会更好),但绘图对我来说总是一团糟。

您需要以相同的比例创建条形图。一种简单的方法是创建x值,只需对数据进行计数并对其进行适当的偏移。如果需要,可以使用
setxticklabels
标记x轴

X = np.arange(len(x))
bar_width = 0.25
offset = bar_width / 2

axs[3].bar(X - offset, simsubs['CPS1 Deletes'], width=bar_width, color='#A31214')
axs[3].bar(X + offset, simsubs['CPS1 Total'], width=bar_width, color='blue')
axs[3].set_xticks(X)
axs[3].set_xticklabels(x)
如果对
bar
的两个调用都使用了相同的
zorder
label
,则如果这些是您正在打印的唯一数据,则会破坏它们的预期用途


或者,您可以使用以下命令:

simsubs[['CPS1 Deletes', 'CPS1 Total']].plot.bar()

我尝试将其更改为x+bar_width,但我得到了以下错误:TypeError:只能将str(而不是“float”)连接到strI。我看不到错误,但我明白为什么会有问题-您的索引是日期格式,而偏移量是浮点数字。谢谢提示!我试过了,但仍然收到超出范围的错误。我的坏消息是,看到你没有正确偏移,没有看到你的索引是时间戳。幸运的是@busybear写了一个很好的答案(顺便说一句,如果你对他的答案感到满意,一定要把它当作正确的答案来接受:)