Как отобразить текст над столбцами на гистограмме в matplotlib?

У меня есть гистограмма, и я хочу, чтобы в каждом столбце отображался текст, как я могу это сделать?


person IordanouGiannis    schedule 14.09.2011    source источник


Ответы (1)


Я считаю, что это укажет вам правильное направление:

http://matplotlib.sourceforge.net/examples/pylab_examples/barchart_demo.html .

Часть, которая вас больше всего интересует, это:

def autolabel(rects):
    for rect in rects:
        height = rect.get_height()
        plt.text(rect.get_x()+rect.get_width()/2., 1.05*height, '%d'%int(height),
                ha='center', va='bottom')

Размещение текста определяется функцией высоты или высотой столбца, а число, помещаемое в начало каждого столбца, записывается как: '%d' %int(height). Поэтому все, что вам нужно сделать, это создать массив строк с именем «имя», который вы хотите разместить в верхней части столбцов, и выполнить итерацию. Обязательно измените формат на строку (%s), а не на двойное число.

def autolabel(rects):
# attach some text labels
    for ii,rect in enumerate(rects):
        height = rect.get_height()
        plt.text(rect.get_x()+rect.get_width()/2., 1.02*height, '%s'% (name[ii]),
                ha='center', va='bottom')
autolabel(rects1)

Это должно сделать это!

person cosmosis    schedule 14.09.2011
comment
Я пытался понять это, но я хочу отобразить строку, и это меня беспокоит. Я запутался с ней, но я не могу изменить ее в соответствии со своим случаем. - person IordanouGiannis; 15.09.2011
comment
@cosmosis 1.02*height на самом деле не работает, если значения y сильно различаются (например, минимум 0 и максимум 1300). Какие-либо предложения? - person tobip; 01.07.2014
comment
@ta.ft. Если использование процентиля не работает, попробуйте добавить простое число, например height+20. Другим решением было бы настроить цикл if внутри цикла for, где вы указываете height1 = height * 1.02, если высота ‹ 300, и height1 = height + 20, если высота > 300. Затем в plt.text замените вызов height на height1. - person cosmosis; 01.07.2014
comment
@cosmosis Это хороший обходной путь, но он все же не гарантирует, что расстояние между полосой и текстом всегда будет одинаковым. - person tobip; 02.07.2014
comment
@ ta.ft Тогда я предлагаю вам просто использовать «высота + 20» или что-то подобное, если вы хотите гарантировать, что расстояние всегда будет одинаковым. - person cosmosis; 02.07.2014
comment
Итак, вы передаете plt, и все же в функции у вас есть предопределенный массив меток? Разве это не должно принимать два аргумента? - person Dhruv Ghulati; 06.09.2016
comment
Я также получаю height = plt.get_height() AttributeError: 'module' object has no attribute 'get_height' - person Dhruv Ghulati; 06.09.2016
comment
@DhruvGhulati Это не проходит в графике, он создает текст над графиком гистограммы на определенной высоте, где plt является сокращением для import matplotlib.pyplot as plt. Метки в нижней функции не нужно считывать, потому что они перечисляются вместе с гистограммой rects и, следовательно, их не нужно считывать. - person cosmosis; 06.09.2016