Bokeh Adjust верхний отступ глифа - PullRequest
0 голосов
/ 30 марта 2020

У меня есть мультибар, построенный с помощью Bokeh, используя метод vbar glyph. Сюжет хорош, но когда я пытаюсь добавить метки, они «выталкиваются» за пределы рисунка и становятся нечитаемыми. Есть ли способ отрегулировать верхний отступ между глифом и рисунком?

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

categories = ['1', '2', '3', '4', '5']
sets = ['full', 'train', 'test']

data = {
    'x' : categories,
    'full' : full_dset_count,
    'train' : train_dset_count,
    'test' : test_dset_count,
    'empty':['']*5
}

x = [ (cat, set_) for cat in categories for set_ in sets ]
counts = sum( zip( data['full'], data['train'], data['test'] ), () )
colors = ['#3cba54', "#f4c20d", "#db3236"]*5

full_p = sum(zip( round(data['full'], 4), data['empty'], data['empty']), ())
train_p = sum(zip( data['empty'], round(data['train'], 4), data['empty']), ())
test_p = sum(zip( data['empty'], data['empty'], round(data['test'], 4)), ())


source = ColumnDataSource(data=dict(
    x=x, counts=counts, colors=colors,
    full_p=full_p, train_p=train_p, test_p=test_p

))

plt = figure(
    x_range=FactorRange(*x),
    plot_height=500,
    plot_width=900,
    title="Distribuzione dei valori delle recensioni per l'insieme totale, di training e di test",
    x_axis_label="Valore delle recensioni",
    y_axis_label="Percentuale delle osservazioni"
)

plt.vbar(
    x='x',
    top='counts',
    width=0.5,
    color='colors',
    source=source    
)

plt.y_range.start = 0
plt.x_range.range_padding = 0.1
plt.xaxis.major_label_orientation = 1
plt.xgrid.grid_line_color = None

full_labels = LabelSet(
    x='x', y='counts', text='full_p', level='glyph',
    x_offset=-30, y_offset=0, source=source, render_mode='canvas'
)
train_labels = LabelSet(
    x='x', y='counts', text='train_p', level='glyph',
    x_offset=-20, y_offset=15, source=source, render_mode='canvas'
)

test_labels = LabelSet(
    x='x', y='counts', text='test_p', level='glyph',
    x_offset=-10, y_offset=30, source=source, render_mode='canvas'
)

plt.add_layout(full_labels)
plt.add_layout(train_labels)
plt.add_layout(test_labels)

show(plt)

Значения full_dset_count, train_dset_count и test_dset_count почти идентичны , Чтобы воспроизвести проблему, можно использовать следующие значения: [ 7.23934138, 9.58753275, 18.32419776, 35.79029432, 29.05863379]

1 Ответ

1 голос
/ 30 марта 2020

Вы можете настроить его, но только в единицах данных - вы уже используете его для диапазона X с plt.x_range.range_padding. Одна из проблем этого подхода - он не будет работать для всех размеров меток и графиков, поскольку эти размеры указаны в единицах экрана, а не в единицах данных. Это не имеет большого значения, если вы можете установить эти размеры заранее и убедиться, что метки подходят.

Другой подход состоит в том, чтобы использовать 2 набора меток вместо каждого. Один набор будет для этикеток за пределами стержней, когда они могут поместиться там. Другой набор будет для меток внутри столбцов - они перемещаются туда для столбцов, которые слишком высоки. Аналогично тому, как это обрабатывается на этом изображении из документации Matplotlib: enter image description here

...