我在Bokeh图中加入了PolyDrawTool,让用户圈出点。当用户在绘图边缘附近绘制一条线时,工具会展开轴,这通常会弄乱形状。当用户在绘图时,有没有办法冻结轴?你知道吗
我用的是bokeh1.3.4
MRE:
import numpy as np
import pandas as pd
import string
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, LabelSet
from bokeh.models import PolyDrawTool, MultiLine
def prepare_plot():
embedding_df = pd.DataFrame(np.random.random((100, 2)), columns=['x', 'y'])
embedding_df['word'] = embedding_df.apply(lambda x: ''.join(np.random.choice(list(string.ascii_lowercase), (8,))), axis=1)
# Plot preparation configuration Data source
source = ColumnDataSource(ColumnDataSource.from_df(embedding_df))
labels = LabelSet(x="x", y="y", text="word", y_offset=-10,x_offset = 5,
text_font_size="10pt", text_color="#555555",
source=source, text_align='center')
plot = figure(plot_width=1000, plot_height=500, active_scroll="wheel_zoom",
tools='pan, box_select, wheel_zoom, save, reset')
# Configure free-hand draw
draw_source = ColumnDataSource(data={'xs': [], 'ys': [], 'color': []})
renderer = plot.multi_line('xs', 'ys', line_width=5, alpha=0.4, color='color', source=draw_source)
renderer.selection_glyph = MultiLine(line_color='color', line_width=5, line_alpha=0.8)
draw_tool = PolyDrawTool(renderers=[renderer], empty_value='red')
plot.add_tools(draw_tool)
# Add the data and labels to plot
plot.circle("x", "y", size=0, source=source, line_color="black", fill_alpha=0.8)
plot.add_layout(labels)
return plot
if __name__ == '__main__':
plot = prepare_plot()
show(plot)
PolyDrawTool
实际上更新了一个ColumnDataSource
来驱动一个glyph来绘制用户所指示的内容。您看到的行为是这个事实的自然结果,再加上Bokeh的默认自动范围DataRange1d
(默认情况下,在计算自动边界时也会考虑每个glyph)。所以,你有两个选择:完全不要使用
DataRange1d
,例如,调用figure
时可以提供固定轴边界:或者你可以在事后设置它们:
当然,使用这种方法,您将不再获得任何自动范围;您需要将轴范围精确设置为所需的起点/终点。
通过显式设置其
renderers
属性,使DataRange1d
更具选择性:现在
DataRange
模型在计算自动范围的开始/结束时只考虑圆渲染器。相关问题 更多 >
编程相关推荐