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

2024-09-30 00:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个条形图,其中一个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:

Image

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


Tags: csvdatebarpltwidthlabelcolor条形图
2条回答

您需要以相同的比例创建条形图。一种简单的方法是创建x值,只需对数据进行计数并对其进行适当的偏移。如果需要,可以使用set_xticklabels标记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的两个调用都使用相同的zorderlabel,那么如果这些是您正在绘制的唯一数据,则会破坏它们的预期用途


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

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

这里的x值是固定的,即所有数据都绘制在x = bar_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.5units = 'days'。在第二个条形图中将此x_偏移用作x值

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

相关问题 更多 >

    热门问题