Как ширина должна быть установлена ​​для бара в matplotlib? - PullRequest
0 голосов
/ 08 ноября 2018

Я использую 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()

Как мне автоматически установить ширину полос? Как это я получаю следующее:

no width set[1]

Если я установлю ширину 0,0006, то для данных примера это будет выглядеть хорошо:

width manually set to 0.0006[2]

из которого я понял, что matplotlib измеряет ось х в днях (поскольку 0,0007 дней - это почти ровно 1 минута, что соответствует моим временным интервалам, а 0,0006 - промежутки между барами), но это не хорошо, если я получу ежечасные значения или секунды, или недели и т. д. Конечно, есть возможность обрабатывать это автоматически?

1 Ответ

0 голосов
/ 08 ноября 2018

Если вы хотите, чтобы ширина бара не превышала разницу между любыми последовательными датами, вы можете вычислить это число и передать его в аргумент 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")

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...