Как правильно расположить бары на гистограмме - PullRequest
0 голосов
/ 25 октября 2018

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

def makebarplot(bins, values, title = None, export = False,
              path = None, file_name = None):
    '''
    This function will take the outputs
    of np.histogram results and make a 
    barplot of it.
    '''
    #creating the object
    img, ax1 = plt.subplots(figsize = (13,8))

    ax1.bar(bins[:-1],values)

    #adjusting the graphic
    ax1.set_xscale('log')
    ax1.set_yscale('log')
    ax1.set_xlabel('Values')
    ax1.set_xticks(bins)
    ax1.set_ylabel('Frequency')
    ax1.set_title(title)

    plt.show()

    if export is True:
        #saving figure
        img.savefig(path+file_name, bbox_inches = 'tight')

    #closing the plot    
    #plt.close()

    return

#the bins I'm using
bins = [1e1**i for i in range(2,20)]

#the values I'm entering they are the frequency of
# values in between each of the corresponding 
#bins defined above
values = [0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 
          1.000000e+00, 1.000000e+01, 1.100000e+02, 8.870000e+02, 
          6.582000e+03, 4.542300e+04, 2.630240e+05, 1.090866e+06, 
          2.281769e+06, 1.199336e+06, 4.057230e+05,
          6.878300e+04, 1.211000e+03]

makebarplot(bins,ar_values)

В результате я получаю: current attempt

Этот график должен выглядеть примерно как барная версияоб этом: enter image description here

Что я пропускаю?

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

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

1 Ответ

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

Только потому, что вы называете позиции баров bins, не означает, что они становятся корзинами.(Как и в «Я назвал свой автомобиль« Ferrari », но он не стал красным».)

Итак, что здесь происходит, так это то, что полосы расположены по краям левого бункера (как вы указали bins[:-1]как позиции).Однако ширина полос не указана, поэтому matplotlib по умолчанию принимает ширину полосы в 1 единицу.Одна единица в масштабе, охватывающем более 20 порядков, действительно крошечная;на самом деле на рисунке шириной 13 дюймов с разрешением 100 точек на дюйм ваше разрешение примерно равно 7e14 единиц на пиксель, что намного больше, чем 1.

В конце, возможно, имеет смысл определить ширинубары также.Затем вам также необходимо выровнять стержни по их левому краю.

ax1.bar(bins[:-1],values, width=np.diff(bins), align="edge", ec="k")

(Здесь np равно numpy)

enter image description here

Обратите внимание, что первые 4 столбца отсутствуют, поскольку их высота равна 0, что не определено в логарифмическом масштабе.

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