如何动态绘制Seaborn KDE图?

时间:2018-10-29 13:46:32

标签: python matplotlib seaborn kernel-density

我正在尝试在某些背景图像上显示kde图。为此,我在matplotlib图上显示背景图像,然后在上面重叠seaborn kde图。最后,我希望此图可以交互工作,每当用户更改滑块值或单击淡入/生动按钮时,我只想重绘seaborn kde图,而不是从头开始绘制整个图。
目前,我已经实现了一些逻辑,其中每当用户单击淡入/活动按钮或更改滑块值时,它都会从头开始绘制整个图,而且由于数据量巨大,这也需要时间。

这是绘图功能:

def draw_heatmap_on_floor_plan(self, slider_value=4, img_alpha=None, valinit=4):
    #self.trans_point is pandas dataframe which read value from csv
    new_points = self.trans_point[self.trans_point["hours"].between(slider_value,
                                                                    slider_value, inclusive=True)]
    img = plt.imread(os.path.join("input", "level_2.png"))
    fig, ax = plt.subplots()
    ax.imshow(img, alpha=img_alpha)
    sns.kdeplot(new_points["x"], new_points["y"], cmap="jet", shade=True, ax=ax,
              alpha=0.8, beta=0.4)
    ax.collections[0].set_alpha(0)
    #axis for vivid button
    axnext = plt.axes([0.81, 0.05, 0.1, 0.040])
    #axis for fade button
    axprev = plt.axes([0.81, 0.1, 0.1, 0.040])
    #axis for heatmap slider
    ax_slider = plt.axes([0.2, 0.05, 0.49, 0.040])
    heatmap_slider = Slider(ax=ax_slider, label='hours', valmin=4, valmax=11, valinit=valinit, valstep=1)
    ax.set_xticks([])
    ax.set_yticks([])
    ax.set_xlabel('')
    ax.set_ylabel('')
    heatmap_slider.on_changed(self.heatmap_change)
    vivid_button = Button(axnext, 'Vivid Map')
    fade_button = Button(axprev, 'Fade Map')
    vivid_button.on_clicked(self.vivid_image)
    fade_button.on_clicked(self.fade_image)
    mng = plt.get_current_fig_manager()
    mng.window.state('zoomed')
    plt.show()

渐变按钮单击事件的代码:

def fade_image(self, event):
    plt.close()
    self.draw_heatmap_on_floor_plan(slider_value=self.slider_value, img_alpha=0.3, valinit=self.slider_value)

生动的按钮单击验证代码:

def vivid_image(self, event):
    plt.close()
    self.draw_heatmap_on_floor_plan(slider_value=self.slider_value, img_alpha=None, valinit=self.slider_value)

滑块更改事件的代码:

def heatmap_change(self, slider_value):
    plt.close()
    self.slider_value = slider_value
    self.draw_heatmap_on_floor_plan(self.slider_value, img_alpha=None, valinit=slider_value)

0 个答案:

没有答案