Более эффективный способ построения многопроходного кода Шепли в matplotlib

#python #matplotlib #shapley

Вопрос:

Я успешно построил фигуру matplotlib, которая отображает объекты с несколькими развертываниями Шепли <shapely.readthedocs.io> на основе значения ползунка. Каждый раз, когда значение ползунка изменяется, при выполнении функций обновления(val) программа очищает свою единственную ось и перерисовывает заголовок, метки, линии сетки и все полигоны внутри Мультиполигона.

Это текущая рабочая версия (смотрите комментарии):

»’

     fig, ax = plt.subplots()
    plt.subplots_adjust(left=0.2, bottom=0.2)

    ax_slider = plt.axes([0.25, 0.1, 0.65, 0.03])
    slider = Slider(
        ax=ax_slider,
        label="Epsilon",
        valmin=min_epsilon,
        valmax=max_epsilon,
        valstep=precision,
        valinit=max_epsilon-precision,
        color='red'
    )

    def update(val):
        #TITLES ONLY SHOW IF I RE-PLOT THEM IN UPDATE FUNCTION
        ax.clear()
        ax.set_facecolor('tab:gray')
        ax.set_title("Freespace Diagram")
        ax.set_xlabel(f2)
        ax.set_ylabel(f1)

        #GRIDLINES ONLY SHOW IF I RE-PLOT IN UPDATE FUNCTION
        ax.set_xticks(self.__x_edges)
        ax.set_yticks(self.__y_edges)
        ax.set_yticklabels([])
        ax.set_xticklabels([])
        ax.grid(color='black', linewidth = 0.25, alpha = 0.4)

        for geom in multipolygons[int(val)].geoms:
            xs, ys = geom.exterior.xy
            ax.fill(xs, ys, alpha=0.75, fc='w', ec='none')
        fig.canvas.draw_idle()

    update(max_epsilon-precision)
    slider.on_changed(update)

    plt.gca().set_aspect('equal', adjustable='datalim')
    plt.show()
 

»’

Я не знаю, как это сделать, хотя я предполагаю, что возможно иметь две разные оси, где я могу очистить и перерисовать мультиполигоны отдельно.

Как эта концепция (посмотрите в комментариях):

»’

     fig, ax = plt.subplots()
    plt.subplots_adjust(left=0.2, bottom=0.2)

    ax_slider = plt.axes([0.25, 0.1, 0.65, 0.03])
    slider = Slider(
        ax=ax_slider,
        label="Epsilon",
        valmin=min_epsilon,
        valmax=max_epsilon,
        valstep=precision,
        valinit=max_epsilon-precision,
        color='red'
    )

    #SET TITLE AND LABLES ONLY ONCE
    ax.set_facecolor('tab:gray')
    ax.set_title("Freespace Diagram")
    ax.set_xlabel(f2)
    ax.set_ylabel(f1)

    #SET GRIDLINES ONLY ONCE
    ax.set_xticks(self.__x_edges)
    ax.set_yticks(self.__y_edges)
    ax.set_yticklabels([])
    ax.set_xticklabels([])
    ax.grid(color='black', linewidth = 0.25, alpha = 0.4)

    #HAVE ANOTHER AXIS OR SOMETHING WHERE MULTIPOLYGONS CAN BE PLOTTED
    ax_2 = some.axis.overlapping.first.axis.with.grid.and.title

    def update(val):
        ax_2.clear()
        for geom in multipolygons[int(val)].geoms:
            xs, ys = geom.exterior.xy
            ax_2.fill(xs, ys, alpha=0.75, fc='w', ec='none')
        fig.canvas.draw_idle()

    update(max_epsilon-precision)
    slider.on_changed(update)

    plt.gca().set_aspect('equal', adjustable='datalim')
    plt.show()
 

»’

The code directly above is only a concept. I am looking for any solution where I do not need to clear the title, labels and gridlines anytime the slider updates.

Thanks!