Python 如何使用x轴上的日期时间值设置栏宽?

Python 如何使用x轴上的日期时间值设置栏宽?,python,matplotlib,bar-chart,Python,Matplotlib,Bar Chart,问题: chart1 chart2 Date 2019-01-31 0.208545 0.117835 2019-02-28 1.045836

问题:

                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
我在这里找到了很多关于这个话题的答案,但没有一个有效。我读到matplotlib将日期轴转换为范围对象。因此,我有每月的数据,一个条形码宽度=1意味着一个月的宽度,这实际上非常有效:

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

其中数据是以每月日期为索引值的系列

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)
解决方案:

                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
问题似乎是因为每月DatetimeIndex对象的频率设置为
'M'
,因此无法选择小于该频率的条形宽度。如果要使条形图变小,需要先更改该频率:

data.index.freq = None
data.index.freq = None

数据本身保持不变,但现在条码宽度的单位设置为天,您可以使用1到30之间的任何数字来确定条码之间的间距

问题在于,DatetimeIndex对象的频率设置为每月一次,因为数据也是每月一次。 无法选择小于该频率的条形宽度。如果要使条形图变小,需要先更改该频率:

data.index.freq = None
data.index.freq = None
其他选项有“W”、“M”、“Q”、“A”或“D”。您可以始终使用None(即每日),其余选项需要与数据匹配。如果不使用,则数据本身保持不变,但现在条形码宽度的单位设置为天,您可以使用1到30之间的任何数字在条形码之间创建间隙


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