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对象的频率。我还为这个问题添加了一个解决方案。很高兴你找到了答案!你可以自己发布解决方案作为答案并接受它。据我所知,这实际上是推荐的方法。