我正在尝试在某些背景图像上显示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)