【问题标题】:How to set bar width with datetime values on x axis?如何在 x 轴上使用日期时间值设置条形宽度?
【发布时间】:2020-09-11 21:11:05
【问题描述】:

问题:

我在这里找到了很多关于这个主题的答案,但没有一个有效。我读到 matplotlib 将日期轴转换为范围对象。因此,当我有每月数据时,条形图 width=1 表示宽度为 1 个月,实际上效果很好:

但是一旦我设置width=0.99 或任何低于 1 的值,我就会得到一个完全混乱的条形图,我只是希望能够精确控制条形宽度或至少在每个条形之间添加一些间隙,因此甚至可以在月度数据图中添加季度条形图。

其中 data 是以每月日期为索引值的 pandas 系列。

MWE:

                chart1  chart2
Date                                                                         
2019-01-31                                    0.208545               0.117835
2019-02-28                                    1.045836               0.008659
2019-03-31                                    1.977714               0.996313
2019-04-30                                    3.647403               1.528709
2019-05-31                                    3.583291               2.079429
2019-06-30                                    4.593321               4.294865
2019-07-31                                    6.617398               6.073648
2019-08-31                                    9.189794               8.488473
2019-09-30                                   10.216717               8.845000
2019-10-31                                    9.994394               8.200474
2019-11-30                                    9.636940               6.949948
2019-12-31                                   10.294149               6.437733
2020-01-31                                   11.038578               6.785553
2020-02-29                                   13.008305               8.519324
2020-03-31                                    9.460242               7.218570
2020-04-30                                   11.023622               5.639113
2020-05-31                                   11.779224               6.159791

复制此数据框,然后使用以下代码

import pandas as pd
data = pd.read_clipboard(sep='\s\s+')
data.index = pd.to_datetime(data.index)
fig, ax = plt.subplots(nrows=1, ncols=1)
ax.plot(data.index, data['chart1'].to_list())
ax.bar(data.index, data['chart2'].to_list(), width=0.99)

解决方案:

问题似乎是因为 DatetimeIndex 对象的频率设置为每月'M',所以无法选择小于该频率的条形宽度。如果您想让 Bars 更小,您需要先更改该频率:

data.index.freq = None

数据本身保持不变,但现在柱形 width 的单位设置为天,您可以使用 1 到 30 之间的任何数字来设置柱形之间的间隔。

【问题讨论】:

  • 您能提供一份 MWE 吗?但是从您的描述来看,定义小于 1 的区间并没有真正意义。您的问题实际上是关于这些区间的视觉表示而不是更改区间本身吗?
  • 我添加了一个工作 MWE。问题来自日期时间索引。将索引读取为字符串值,条形宽度是可调整的。但我需要日期时间索引,因为我可能会将季度数据与月度数据等混合在一起。
  • 谢谢!如果您的 MWE 确实有效,请尝试迭代地更改它以匹配您的实际代码并检查行为发生变化的时间点。这应该会让您更接近于发现问题。
  • 我现在让 MWE 工作,所以错误是可重现的。通过这样做,我也弄清楚了问题所在。我需要更改用于创建 x 轴的 DatetimeIndex 对象的频率。我也为这个问题添加了一个解决方案。
  • 很高兴你知道了!您可以自己发布解决方案作为答案并接受它。据我所知,这实际上是推荐的方法。

标签: python matplotlib bar-chart


【解决方案1】:

问题在于 DatetimeIndex 对象的频率设置为每月'M',因为数据也是每月一次。 无法选择小于该频率的条宽。如果您想让 Bars 更小,您需要先更改该频率:

data.index.freq = None

其他选项为“W”、“M”、“Q”、“A”或“D”。您始终可以使用 None(这意味着每天),其余选项需要与数据相匹配。如果您使用 None,数据本身将保持不变,但现在 bar width 的单位设置为天,您可以使用 1 到 30 之间的任何数字在您的 bar 之间创建间隔。

import pandas as pd
import matplotlib.pyplot as plt
data.index = pd.to_datetime(data.index)
data.index.freq = None
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(15.6/2.54, 12/2.54))
ax.plot(data.index, data['chart1'].to_list())
ax.bar(data.index, data['chart2'].to_list(), width=20)

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多