Как построить несколько источников данных на одной фигуре в боке, Python 3,6? - PullRequest
0 голосов
/ 05 февраля 2020

Я делаю PC-би-сюжет в python с Боке. Я хочу сделать так, чтобы текст добавлялся к рисунку так, чтобы он более или менее выглядел как на изображении (игнорируя красные линии):

enter image description here). Однако я не могу понять, как это сделать в Боке.

Если я пытаюсь создать один источник данных, подобный этому:

data = {'PC1': x_scale*xs, 'PC2':  y_scale*ys , 'cluster': [str(x) for x in comments_df.kmeans_10], 
    'C1': components[0,:], 'C2': components[1,:], 'words':wordlist}
source = ColumnDataSource(data)

Начинает жаловаться, что у меня разные длины столбцов (о которых я знаю). И это не создаст сюжет

BokehUserWarning: ColumnDataSource's columns must be of the same length. Current lengths: ('C1', 5775), ('C2', 5775), ('PC1', 16555), ('PC2', 16555), ('cluster', 16555), ('words', 5775)

Моя другая мысль заключалась в создании двух источников данных:

data = {'PC1': x_scale*xs, 'PC2':  y_scale*ys , 'cluster': [str(x) for x in comments_df.kmeans_10]}
source = ColumnDataSource(data)

data2 = {'C1': components[0,:], 'C2': components[1,:], 'words':wordlist}
source2 = ColumnDataSource(data2)

Однако в этом случае я получаю ошибку при построении графика. Мой код:

plot = Plot(plot_width=600, plot_height=600, tools = [PanTool(), WheelZoomTool(), BoxZoomTool(), ResetTool()])


## PCA loadings
glyph = Circle(x="PC1", y="PC2", fill_color=cmap)
plot.add_glyph(source, glyph)

xaxis = LinearAxis()
plot.add_layout(xaxis, 'below')
plot.xaxis.axis_label = 'PC1'

yaxis = LinearAxis()
plot.add_layout(yaxis, 'left')
plot.yaxis.axis_label = 'PC2'

plot.add_layout(Grid(dimension=0, ticker=xaxis.ticker))
plot.add_layout(Grid(dimension=1, ticker=yaxis.ticker))

## PCA components
word_glyph = Text(x="C1", y="C2", text="words", text_color="red")
plot.add_glyph(source2, glyph)

# Show
show(plot)

Ошибка:

ERROR:bokeh.core.validation.check:E-1001 (BAD_COLUMN_NAME): Glyph refers to nonexistent column name. This could either be due to a misspelling or typo, or due to an expected column being missing. : key "fill_color" value "cluster", key "x" value "PC1" (closest match: "C1"), key "y" value "PC2" (closest match: "C2") [renderer: GlyphRenderer(id='2028', ...)]

Возможно, я что-то пропускаю или ищу неправильные термины, поэтому, если кто-нибудь скажет мне, что делать, было бы здорово. Спасибо!

1 Ответ

1 голос
/ 05 февраля 2020

Вы настраиваете первый глиф дважды, во второй раз с неверным источником данных:

plot.add_glyph(source2, glyph)

Предположительно, вы намереваетесь:

plot.add_glyph(source2, word_glyph)

В качестве отступления вы используете очень низкий уровень bokeh.models API, который очень многословен. Существует более высокий уровень API bokeh.plotting, который, как правило, всегда намного меньше кода для эквивалентного вывода, а также делает невозможным множество или такие ошибки (поскольку он координирует глифы и источники данных для вас).

...