Я пытаюсь показать график kde поверх некоторого фонового изображения. Для этого я показываю фоновое изображение на сюжете matplotlib, а затем накладываю на него участок seaborn kde. В конце я хочу, чтобы этот график работал в интерактивном режиме, всякий раз, когда пользователь изменяет значение ползунка или нажимает кнопку исчезновения / яркости, я хочу перерисовывать график морского 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)
Код для яркого нажатия кнопки evnt:
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)