matplotlib 中的条应该如何设置宽度?

maz*_*zz0 2 matplotlib

我使用的是 python 2,下面的代码只是使用了一些示例数据,我的实际数据可能有不同的长度,可能不是很详细。

  import numpy as np
  import datetime  
  import matplotlib
  import matplotlib.pyplot as plt  

  fig, ax = plt.subplots()  

  x_values = [datetime.datetime(2018, 11, 8, 11, 16), 
    datetime.datetime(2018, 11, 8, 11, 17), 
    datetime.datetime(2018, 11, 8, 11, 18), 
    datetime.datetime(2018, 11, 8, 11, 19), 
    datetime.datetime(2018, 11, 8, 11, 20), 
    datetime.datetime(2018, 11, 8, 11, 21), 
    datetime.datetime(2018, 11, 8, 11, 22), 
    datetime.datetime(2018, 11, 8, 11, 23), 
    datetime.datetime(2018, 11, 8, 11, 24), 
    datetime.datetime(2018, 11, 8, 11, 25), 
    datetime.datetime(2018, 11, 8, 11, 26), 
    datetime.datetime(2018, 11, 8, 11, 27), 
    datetime.datetime(2018, 11, 8, 11, 28), 
    datetime.datetime(2018, 11, 8, 11, 29), 
    datetime.datetime(2018, 11, 8, 11, 30), 
    datetime.datetime(2018, 11, 8, 11, 31)]
  y_values = [1392.1017964071857,
    1392.2814371257484,
    1392.37125748503,
    1227.6802721088436,
    1083.1,
    1317.0461538461539,
    1393.059880239521,
    1393.4011976047905,
    1393.491017964072,
    1393.8502994011976,
    1318.3461538461538,
    1229.4965986394557,
    1394.2095808383233,
    1394.3892215568862,
    1394.6586826347304,
    1394.688622754491]

  rects1 = ax.bar(x_values, y_values)
  fig.tight_layout()
  plt.show()
Run Code Online (Sandbox Code Playgroud)

我应该如何自动设置条形的宽度?照原样,我得到以下信息:

没有设置宽度[1]

如果我将宽度设置为 0.0006,那么示例数据看起来不错:

宽度手动设置为 0.0006[2]

我从中计算出 matplotlib 以天为单位测量 x 轴(因为 0.0007 天几乎正好是 1 分钟,这与我的时间间隔相匹配,而 0.0006 给出了条形之间的间隙)但是如果我得到每小时值或几秒钟,或几周,等等。当然有一个选项可以自动处理这个问题吗?

Imp*_*est 6

如果您希望条形宽度不大于任何连续日期时间之间的差异,您可以计算该数字并将其提供给条形width参数。

import matplotlib.dates as mdates 

width = np.min(np.diff(mdates.date2num(x_values)))
ax.bar(x_values, y_values, width=width, ec="k")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明