#python #bokeh
#python #боке
Вопрос:
import pandas as pd
from bokeh.palettes import Spectral4
from bokeh.plotting import figure, output_file, show
from bokeh.sampledata.stocks import AAPL, IBM, MSFT, GOOG
p = figure(plot_width=800, plot_height=250, x_axis_type="datetime")
p.title.text = 'Click on legend entries to hide the corresponding lines'
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4):
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
p.line(df['date'], df['close'], line_width=2, color=color, alpha=0.8, legend=name)
p.legend.location = "top_left"
p.legend.click_policy="hide"
output_file("interactive_legend.html", title="interactive_legend.py example")
show(p)
по умолчанию отображаются все строки. Есть ли способ скрыть, например, все строки, кроме «IBM», при создании графика? Какой флаг используется для определения статуса «скрытый» или «не скрытый»?
Ответ №1:
Вы можете использовать renderer.visible = False
, чтобы скрыть некоторые глифы
import pandas as pd
from bokeh.palettes import Spectral4
from bokeh.plotting import figure, show
from bokeh.sampledata.stocks import AAPL, IBM, MSFT, GOOG
p = figure(plot_width = 800, plot_height = 250, x_axis_type = "datetime", title = 'Glyphs hidden by default')
lines = {}
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4):
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
lines[name] = p.line(df['date'], df['close'], line_width = 2, color = color, alpha = 0.8, legend = name)
lines[name].visible = True if name == "IBM" else False
p.legend.location = "top_left"
p.legend.click_policy = "hide"
show(p)
Комментарии:
1. Отлично, спасибо! Вначале у меня это не сработало, так как я использовал click_policy = отключить звук. Там используемый рендерер «приглушен», просто для полноты картины. Но в остальном именно то, что я искал.
2. вы можете использовать «отключить звук», но тогда вам нужно указать параметр типа «muted_alpha= 0.35» в p.line()
3. Я нашел ошибку этого метода для «приглушенного» случая. Если
click_policy='mute'
, то использованиеlines[name].visible = False
приведет к исчезновению строки. Я использовалline[name].muted = True
, и результат — это то, что я хочу.
Ответ №2:
вот пример использования флажка .. (для развлечения):
import pandas as pd
from bokeh.palettes import Spectral4
from bokeh.plotting import figure, output_file, show
from bokeh.sampledata.stocks import AAPL, IBM, MSFT, GOOG
from bokeh.models import CheckboxGroup, CustomJS
from bokeh.layouts import row
code = """
if (0 in checkbox.active) {
l0.visible = true
} else {
l0.visible = false
}
if (1 in checkbox.active) {
l1.visible = true
} else {
l1.visible = false
}
if (2 in checkbox.active) {
l2.visible = true
} else {
l2.visible = false
}
if (3 in checkbox.active) {
l3.visible = true
} else {
l3.visible = false
}
"""
p = figure(plot_width=800, plot_height=250, x_axis_type="datetime")
p.title.text = 'Click on legend entries to hide the corresponding lines'
l=[]
for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4 ):
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
l.append( p.line(df['date'], df['close'], line_width=2, color=color, alpha=0.8, legend=name))
p.legend.location = "top_left"
p.legend.click_policy = "hide"
output_file("interactive_legend.html", title="interactive_legend.py example")
callback = CustomJS(code=code, args={})
checkbox = CheckboxGroup(labels=["AAPL", "IBM", "MSFT", "GOOG"], active=[0, 1, 2, 3], callback=callback, width=100)
callback.args = dict(l0=l[0], l1=l[1], l2=l[2], l3=l[3], checkbox=checkbox)
layout = row(checkbox, p)
show(layout)