代码之家  ›  专栏  ›  技术社区  ›  Qaswed

如何直接更改散景“figure.renderers”元素的“_property_values”?

  •  0
  • Qaswed  · 技术社区  · 4 年前

    怎么能 _property_values 散景元素 figure.renderers 直接改变?我了解到 renderers 有身份证,所以我希望做类似的事情 renderers['12345'] 。但由于它是一个列表(更精确地说是PropertyValueList),这不起作用。相反,我找到的唯一解决方案是迭代列表,将正确的元素存储在新的指针(?)中,修改指针,从而修改原始元素。

    这是我的玩具示例,其中直方图中的垂直线根据某个小部件的值进行更新:

    import hvplot.pandas
    import ipywidgets as widgets
    import numpy as np
    from bokeh.io import push_notebook, show, output_notebook
    from bokeh.models import Span
    from bokeh.plotting import figure
    
    %matplotlib inline
    
    hist, edges = np.histogram([1, 2, 2])
    
    p = figure()
    r = p.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:])
    vline = Span(location=0, dimension='height')
    p.renderers.extend([vline])
    
    def update_hist(x):    
        myspan = [x for x in p.renderers if x.id==vline.id][0]
        myspan._property_values['location'] = x
        show(p, notebook_handle=True)
    
    widgets.interact(update_hist, x = widgets.FloatSlider(min=1, max=2))
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Qaswed    4 年前

    Bigreddot 为我指明了正确的方向:我不必更新 p 直接,但用于生成的元素 p (这里 Span ). 通过这个,我发现了 this question 其中代码承载解决方案:update vline.location .

    完整代码:

    import hvplot.pandas
    import ipywidgets as widgets
    import numpy as np
    from bokeh.io import push_notebook, show, output_notebook
    from bokeh.models import Span
    from bokeh.plotting import figure
    
    %matplotlib inline
    
    hist, edges = np.histogram([1, 2, 2])
    
    p = figure()
    r = p.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:])
    vline = Span(location=0, dimension='height')
    p.renderers.extend([vline])
    show(p, notebook_handle=True)
    
    def update_hist(x):    
        vline.location = x
        push_notebook()
    
    widgets.interact(update_hist, x = widgets.FloatSlider(min=1, max=2, step = 0.01))
    

    作为一名Python初学者,我仍然经常监督 Python does not have variables 因此,我们可以更改一个元素 x 通过改变 y .

    x = ['alice']
    y = x
    y[0] = 'bob'
    x  # is now ['bob] too