Как использовать Hovertool для нескольких строк? - PullRequest
0 голосов
/ 29 июня 2019

У меня есть следующий код:

from bokeh.models import HoverTool, ColumnDataSource
from bokeh.plotting import figure, output_file, show

if __name__ == '__main__':
    year = [1960, 1970, 1980, 1990, 2000, 2010]
    pop_pakistan = [44.91, 58.09, 78.07, 107.7, 138.5, 170.6]
    pop_india = [449.48, 553.57, 696.783, 870.133, 1000.4, 1309.1]

    output_file('line.html', mode='inline')
    plot = figure(title='Population Graph of India and Pakistan', x_axis_label='Year',
                  y_axis_label='Population in million')

    source1 = ColumnDataSource(data=dict(
        year=year,
        population=[pop_pakistan, pop_india],
    ))
    print(source1.data)

    hover = HoverTool()
    hover.tooltips = """
    <div style=padding=5px>Data</div>
    """
    plot.add_tools(hover)
    plot.line(year, pop_pakistan, line_width=2, line_color='green', legend='Pakistan')
    plot.circle(year, pop_pakistan, fill_color="green", line_color='green', size=8)
    plot.line(year, pop_india, line_width=2, line_color='orange', legend='India')
    plot.circle(year, pop_india, fill_color="orange", line_color='orange', size=8)
    show(plot)

Я хочу показать данные при наведении курсора.Я получаю следующее предупреждение

BokehUserWarning: ColumnDataSource's columns must be of the same length. Current lengths: ('population', 2), ('year', 6)

Как использовать Hovertool для нескольких осей Y?

Спасибо

Обновление

Основываясь на ответе @bigreddot, я внес следующие изменения:

plot.line('year', 'pop_pakistan', line_width=2, line_color='green', legend='Pakistan', source=source)
    plot.circle('year', 'pop_pakistan', fill_color="green", line_color='green', size=8, source=source)

    plot.line('year', 'pop_india', line_width=2, line_color='orange', legend='India', source=source)
    plot.circle('year', 'pop_india', fill_color="orange", line_color='orange', size=8, source=source)
    show(plot)

Но я не могу показать соответствующие данные при наведении курсора для соответствующей страны.

1 Ответ

1 голос
/ 29 июня 2019

Это сообщение связано с тем, что длины столбцов в вашем ColumnDataSource не одинаковы. ColumnDataSource - это табличная структура, похожая на Pandas DataFrame. Это не имеет смысла для столбцов разной длины. В вашем случае у вас есть:

year = [1960, 1970, 1980, 1990, 2000, 2010] # length 6

и

population = [pop_pakistan, pop_india] # length 2

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

source = ColumnDataSource(data=dict(
    year=year,
    pop_pakistan=pop_pakistan, 
    pop_india=pop_india
))

Что бы создать CS с тремя столбцами, длиной 6 *.

Затем следующее наблюдение заключается в том, что вы создаете CDS, но фактически никогда не используете его. Чтобы использовать источник данных, вы должны фактически передать его функциям глифа и обратиться к столбцам по имени, например,

# pass the source argument and refer to columns by name (strings)

plot.line('year', 'pop_pakistan', source=source, ...)
plot.circle('year', 'pop_pakistan, source=source, ...)

plot.line('year', 'pop_india', source=source, ...)
plot.circle('year', 'pop_india', source=source, ...)

Наконец, ваша спецификация подсказки ничего не делает, за исключением того, что всегда печатает один и тот же текст "Data" и ничего больше. Обычно вы хотите использовать синтаксис @ для отображения значений из источника данных, например, "@year" ot `" @pop_india "где-то внутри текста всплывающей подсказки. См. Документацию HoverTool для получения дополнительной информации.

...