Динамическая ось Y Matplotlib на основе минимума в списке - PullRequest
0 голосов
/ 04 октября 2018

У меня есть привязанные к сетке данные о температуре для конкретной точки, включенной в список, и я строю ее на гистограмме следующим образом:

Example Bar Graph

Температура этого набора данных с сеткой неизбежно упадет ниже 0 градусов, и я рассчитываю масштабировать ось Y таким образом, чтобы смесь столбцов как с положительными, так и с отрицательными значениями поднималась к верхней части изображения.

Я посмотрел пример кода, найденного здесь , однако, насколько я понимаю, этот код предполагает, что все значения в массиве отрицательны, и набор данных, с которым я работаю, будетне иметь.

Код, собранный для генерации приведенного ниже графика (исключая построение начального списка), выглядит следующим образом:

objects = (''+ mon0 +' '+ date0 +'', ''+ mon1 +' '+ date1 +'', ''+ mon2 +' '+ date2 +'', ''+ mon3 +' '+ date3 +'', ''+ mon4 +' '+ date4 +'', ''+ mon5 +' '+ date5 +'', ''+ mon6 +' '+ date6 +'', ''+ mon7 +' '+ date7 +'', ''+ mon8 +' '+ date8 +'', ''+ mon9 +' '+ date9 +'', ''+ mon10 +' '+ date10 +'')
y_pos = np.arange(len(objects))

fig, ax = plt.subplots(figsize=(14,8))

bar_width = 0.40

rects = plt.bar(y_pos, btv_list, bar_width, color='#cc0000', edgecolor='black')
plt.xticks(y_pos, objects)
plt.ylabel('Temperature (°F)')
plt.xticks(y_pos, objects)

for rect in rects:
    y_value = rect.get_height()
    x_value = rect.get_x() + rect.get_width() / 2
    space = 3
    va = 'bottom'
    label = y_value
    plttxt = plt.annotate(label, (x_value, y_value), xytext=(0, space), textcoords="offset points", ha='center', va=va)
    plttxt.set_fontsize(14)
    plttxt.set_weight('semibold')

fig.tight_layout()

1 Ответ

0 голосов
/ 04 октября 2018

Это то, что вы пытаетесь получить?

h = np.random.normal(size=(10,))
min_val = min(h)

plt.figure()
rects = plt.bar(x=range(10),height=h-min_val, bottom=min_val)
plt.axhline(0.,ls='--', lw=1, color='grey', zorder=-1)

for rect in rects:
    y_value = rect.get_height()+min_val
    x_value = rect.get_x() + rect.get_width() / 2
    space = 3
    va = 'bottom'
    label = '{:.2f}'.format(y_value)
    plttxt = plt.annotate(label, (x_value, y_value), xytext=(0, space), textcoords="offset points", ha='center', va=va)
    plttxt.set_fontsize(8)
    plttxt.set_weight('semibold')

enter image description here

...