Подтвердить что ты не робот

Заключительные окна

Final Edit:

То, что я обнаружил по поводу закрытия окон для пиропанов, заключается в том, что это, вероятно, не должно быть сделано с использованием pyplot. SRK дает отличный пример того, как обрабатывать графики, которые будут обновлены в его ответе ниже. Кроме того, я наткнулся на то, как поместить графики в окно Tkinter, а Tkinter гораздо более разбирается в открытии и закрытии окон, чем в pyplot. Здесь заключается в том, как поместить заговор с пиплом в окно Tk и это хороший пример.

/Final Edit

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

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

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

Любой вход будет оценен, спасибо.

import matplotlib.pyplot as plt

a = range(0,10)
b = range(0,20,2)
c = range(0,30,3)
d = range(0,40,4)

plot1 = plt.figure()
plt.plot(a,b, 'r-o')

plt.show()

plt.close()

plot2 = plt.figure()
plt.plot(c,d, 'b-o')

plt.show()
plt.close() 

Изменить код: это тоже не сработало.

plot1 = plt.figure(1)
plt.plot(a,b, 'r-o')

plot2 = plt.figure(2)
plt.plot(c,d, 'b-o')
#plt.close(1)
#this will prevent plot1 from being displayed
plt.show()
plt.close(1)  # or ('all') or (plot1)
4b9b3361

Ответ 1

plt.close() закроет текущий экземпляр.

plt.close(2) закроет цифру 2

plt.close(plot1) закроет цифру с примером plot1

plt.close('all') закроет все fiures

Найден здесь.

Помните, что plt.show() является блокирующей функцией, поэтому в приведенном выше примере код plt.close() не выполняется, пока окно не будет закрыто, что делает его излишним.

Вы можете использовать plt.ion() в начале вашего кода, чтобы сделать его неблокирующим, хотя это имеет другие последствия.

Пример

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

Ниже я создаю сюжет:

fig = plt.figure(figsize=plt.figaspect(0.75))
ax = fig.add_subplot(1, 1, 1)
....
par_plot, = plot(x_data,y_data, lw=2, color='red')

В этом случае ax выше - дескриптор пары осей. Всякий раз, когда я хочу что-то сделать с этими осями, я могу изменить свой текущий набор осей на этот конкретный набор, вызвав axes(ax).

par_plot - это дескриптор экземпляра line2D. Это называется художником. Если я хочу изменить свойство строки, например изменить ydata, я могу сделать это, обратившись к этому дескриптору.

Я также могу создать виджет слайдера, выполнив следующие действия:

axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)

Первая строка создает новые оси для слайдера (называется axsliderA), вторая строка создает экземпляр слайдера sA, который помещается в оси, а третья строка указывает функцию для вызова, когда значение ползунка изменения (update).

Моя функция обновления может выглядеть примерно так:

def update(val):
    A = sA.val
    B = sB.val
    C = sC.val
    y_data = A*x_data*x_data + B*x_data + C
    par_plot.set_ydata(y_data)
    draw()

par_plot.set_ydata(y_data) изменяет свойство ydata объекта Line2D с помощью дескриптора par_plot.

Функция draw() обновляет набор осей текущий.

Объединяя все это:

from pylab import *
import matplotlib.pyplot as plt
import numpy

def update(val):
    A = sA.val
    B = sB.val
    C = sC.val
    y_data = A*x_data*x_data + B*x_data + C
    par_plot.set_ydata(y_data)
    draw()


x_data = numpy.arange(-100,100,0.1);

fig = plt.figure(figsize=plt.figaspect(0.75))
ax = fig.add_subplot(1, 1, 1)
subplots_adjust(top=0.8)

ax.set_xlim(-100, 100);
ax.set_ylim(-100, 100);
ax.set_xlabel('X')
ax.set_ylabel('Y')

axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)

axsliderB = axes([0.43, 0.85, 0.16, 0.075])
sB = Slider(axsliderB, 'B', -30, 30.0, valinit=2)
sB.on_changed(update)

axsliderC = axes([0.74, 0.85, 0.16, 0.075])
sC = Slider(axsliderC, 'C', -30, 30.0, valinit=1)
sC.on_changed(update)

axes(ax)
A = 1;
B = 2;
C = 1;
y_data = A*x_data*x_data + B*x_data + C;

par_plot, = plot(x_data,y_data, lw=2, color='red')

show()

Замечание об этом: Когда я запускаю приложение, код запускается последовательно справа (он хранит функцию update в памяти, я думаю), пока не ударит show(), которая блокирует. Когда вы вносите изменения в один из ползунков, он запускает функцию обновления из памяти (я думаю?).

Именно поэтому show() реализуется так, как есть, поэтому вы можете изменять значения в фоновом режиме, используя функции для обработки данных.