Как обновить график рассеяния Matplotlib без очистки других линий (т.е. всей фигуры)? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть фигура, встроенная в окно Tkinter, и всякий раз, когда я играю с ползунком, я хочу обновить один из графиков рассеяния, но не остальные. Вот как выглядит моя фигура:

enter image description here

Цветные «линии» на самом деле являются множественными точками рассеяния между каждой синей точкой. Я хочу, чтобы обновлялись только цветные линии и синие точки, больше ничего (т.е. черный график позади, его синие точки и цветная полоса не будут очищены). Вот мой код для генерации этой фигуры:

def plot():
    global ENL
    global figStress
    global figDisp
    global dispx
    global dispy
    global horizontal

    n = np.size(ENL,0)
    num = 1
    newlist = []
    count = True
    for e in range(0,n):
        dispx = ENL[e,8] * horizontal.get()
        dispy = ENL[e,9] * horizontal.get()
        netdisp = math.sqrt(dispx**2+dispy**2)
        x = ENL[e,0] + dispx
        y = ENL[e,1] + dispy
        newlist.append((num,x,y,netdisp))
        if count:
            disparray = np.array([netdisp])
            count = False
        else:
            disparray = np.hstack([disparray,netdisp])
        figDisp.add_subplot(111).plot(x,y,'o', markersize=10, markeredgecolor='k',markerfacecolor='deepskyblue', alpha=1,zorder=10)
        num +=1
    generalmaxdisp = disparray.max()
    generalmindisp = disparray.min()
    for a in range(0,np.size(EL,0)):
        node1 = EL[a,0]
        node2 = EL[a,1]
        for el in newlist:
            if node1 == el[0]:
                x1 = el[1]
                y1 = el[2]
                disp1 = el[3]
            if node2 == el[0]:
                x2 = el[1]
                y2 = el[2]
                disp2 = el[3]
        ax = figDisp.add_subplot(111)


        m = (y2-y1)/(x2-x1)
        x = np.linspace(x1,x2,100)
        y = m*(x-x1)+y1

        maxdisp = np.array([disp1,disp2]).max()
        mindisp = np.array([disp1,disp2]).min()

        norm = Normalize(generalmindisp, generalmaxdisp)

        compare = np.array([generalmindisp,mindisp,maxdisp,generalmaxdisp])
        for i in range(0,len(compare)):
            compare[i] = (compare[i] - generalmindisp) / (generalmaxdisp - generalmindisp)

        cmap = truncate_colormap(plt.get_cmap("jet"), compare[1], compare[2])
        c = np.linspace(compare[0],compare[3],100)

        ax.scatter(x,y, c=c/c.max(),cmap = cmap, s=3, edgecolor='none')  
        if x1 == x2:
            x = np.linspace(x1,x2,100)
            y = np.linspace(y1,y2,100)
            ax.scatter(x,y, c=c,cmap = cmap, s=3, edgecolor='none')

    cb = figDisp.colorbar(ScalarMappable(norm=norm,cmap=plt.get_cmap('jet')))
    canvasDisp.draw()

Редактировать: добавление графиков, которые я хочу удалить в список, и сохранение остальных, похоже, решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...