Python Bqplot在动画中的每个步骤渲染新条,而不是移动原始条

Python Bqplot在动画中的每个步骤渲染新条,而不是移动原始条,python,bqplot,Python,Bqplot,我正在尝试在Bqplot中设置条形图的动画。我想能够更新的x和y值的酒吧,并有他们调整顺利。 下面的代码在我的图表中的三个条形图中有两个的行为与预期的一样,但第三个条形图在每个时间步都会完全重新绘制 我最初只是用两个小节来尝试这个。第一个条的行为与预期一致,但第二个条将在每个时间步重新绘制。我添加了第三条来尝试解决这个问题 initialIndex = 0 idxSlider3 = IntSlider(min=0, max=20, step=1, description='Index'

我正在尝试在Bqplot中设置条形图的动画。我想能够更新的x和y值的酒吧,并有他们调整顺利。 下面的代码在我的图表中的三个条形图中有两个的行为与预期的一样,但第三个条形图在每个时间步都会完全重新绘制

我最初只是用两个小节来尝试这个。第一个条的行为与预期一致,但第二个条将在每个时间步重新绘制。我添加了第三条来尝试解决这个问题

initialIndex = 0
idxSlider3 = IntSlider(min=0, max=20, step=1, 
    description='Index',value=initialIndex)

''' I want to update the bar chart with this function '''
def update_chart3(change):
    with bar3.hold_sync():
        bar3.x = [idxSlider3.value, 
             idxSlider3.value + 1, 
             idxSlider3.value + 2]
        bar3.y = [idxSlider3.value, idxSlider3.value, idxSlider3.value] 

idxSlider3.observe(update_chart3, 'value')  

fig3 = plt.figure(animation_duration=1000)

bar3 = plt.bar(x=[0, 1, 2], y=[1, 1, 0])

play_button3 = Play(min=0, max=20, step=1, interval=1000, initial_value=0)
jslink((play_button3, 'value'), (idxSlider3, 'value'))

VBox([HBox([idxSlider3, play_button3]), fig3])

当您平稳地说“调整”时,您希望条向右移动,而不重新绘制?我不认为你会像那样“移动”酒吧。新条形图1和2的数据已经存在(因为它们被绘制为旧条形图2和3),因此不会重新绘制。新的bar 3数据以前不存在,这需要从头开始绘制。这会产生“移动”条的外观

作为一个不同的示例,请观察当将这些条移动一个单位,但它们的间距两个单位时会发生什么。每次都应该看到所有的条形图都是从头开始绘制的

from ipywidgets import *
import bqplot.pyplot as plt

initialIndex = 0
idxSlider3 = IntSlider(min=0, max=20, step=1, 
    description='Index',value=initialIndex)

''' I want to update the bar chart with this function '''
def update_chart3(change):
    with bar3.hold_sync():
        bar3.x = [idxSlider3.value, 
             idxSlider3.value + 2, 
             idxSlider3.value + 4]
        bar3.y = [idxSlider3.value, idxSlider3.value, idxSlider3.value] 

idxSlider3.observe(update_chart3, 'value')  

fig3 = plt.figure(animation_duration=1000)

bar3 = plt.bar(x=[0, 1, 2], y=[1, 1, 0])

play_button3 = Play(min=1, max=20, step=1, interval=1000, initial_value=0)
jslink((play_button3, 'value'), (idxSlider3, 'value'))

VBox([HBox([idxSlider3, play_button3]), fig3])

下面是一种使“条”在x中很好地动画化的方法。酒吧是做不到的。相反,我使用了线标记——这是一种黑客行为。但你有灵活性。我更喜欢在对象模型中使用Bqplot(而不是pyplot方式)

将bqplot导入为bq
从ipywidgets导入*
将numpy作为np导入
initialIndex=0
xBar=[0,2,4]
yBar=[1,1,0]
零Y=0
条宽=1
idxSlider3=IntSlider(最小值=0,最大值=20,步长=1,
description='Index',value=initialIndex)
''我想用此函数更新条形图''
def更新图表3(更改):
xBar=[idxSlider3.value,
idxSlider3.value+2,
idxSlider3.value+4]
np.random.rand()
yBar=[idxSlider3.value+np.random.rand()*2,idxSlider3.value+np.random.rand()*2,idxSlider3.value+np.random.rand()*2]
xList,yList=getLineCoordsFromBarLike(xBar,yBar)
lines.x=xList
lines.y=yList
idxSlider3.观察(更新图表3“值”)
x_sc=bq.LinearScale()
y_sc=bq.LinearScale()
x_ax1=bq.轴(标签='',刻度=x_sc,数字刻度=3)
y轴=bq轴(标签='',比例=y轴,方向=垂直)
def getLineCoordsFromBarLike(xBar、yBar):
“”“将单个条形坐标列表转换为描述矩形形状的二维线坐标数组
xBar:1D条形图中心x位置的数字列表
yBar:1D条形图振幅数字列表(必须与xBar长度相同)
retrns x坐标系2D数组,y坐标系2D数组。
"""
xList=[]
yList=[]
对于num,枚举中的x(xBar):
y=yBar[num]
xList.append([x-barWidth/2,x-barWidth/2,x+barWidth/2,x+barWidth/2,]))
附加([zeroY,y,y,zeroY])
x_ax1.tick_值=xBar
返回xList,yList
xList,yList=getLineCoordsFromBarLike(xBar,yBar)
行=bq.行(x=xList,y=yList,
比例={'x':x_sc,'y':y_sc},
颜色=['黑色'],
显示图例=真,
#工具提示=def_tt,
笔划宽度=.5,
关闭路径=真,
填充='内部',
填充颜色=bq.colorschemes.CATEGORY10*10
)
页边距=dict(顶部=10,底部=40,左侧=50,右侧=30)
图3=bq.图(标记=[线],轴=[x_ax1,y_ax1],图_边距=边距,动画_持续时间=1000)
图3.layout.width='600px'
图3.layout.height='600px'
#工具提示(字段=['name',],格式=['',],标签=['id',]))
播放按钮3=播放(最小值=1,最大值=20,步长=1,间隔=1000,初始值=0)
jslink((play_button3,'value'),(idxSlider3,'value'))
VBox([HBox([idxSlider3,播放按钮3]),图3])

谢谢,这很有道理。太好了,完全回答了我的问题。然而,我最终希望做的是得到一个“堆叠”条形图。然后能够将杆的顶部构件从一个杆移动到另一个杆。我认为这种方法不允许我在x轴上相对移动条形图?你可以做一个堆叠条形图,然后移动每个条形图。只需更改代码即可调整顶点的坐标。有了适当的Python技能,就可以在BQplot中真正发挥创造力,而无需编写Javascript。这就是为什么我是BQplot和iPyWidget的超级粉丝。