Юля и Пиплот - окно закрыто - PullRequest
3 голосов
/ 03 мая 2020

Hej,

Я использую пакет PyPlot в Julia, и у меня возникла небольшая проблема, на которую я не смог найти ответ.

По сути, я хочу иметь окно графика, которое будет обновляться во время итеративного расчета. (Я не использую графическую панель Atom, а скорее внешнее графическое окно в стиле matplotlib с интерактивными элементами управления для масштабирования, панорамирования и т. Д. c.)

Мой код примерно такой

import PyPlot
const plt = PyPlot
ax1 = plt.subplot(1,2,1)
ax2 = plt.subplot(1,2,2)
...
while (x < y)
    ... calculation of x and y...
    ax1.plot(x)
    ax2.plot(y)
end

Это работает, более или менее, как и ожидалось: изначально открывается окно со всеми вспомогательными участками, но без кривых. После выполнения расчета отображаются мои кривые, и я вижу их. Все идет нормально. Однако, , пока расчет выполняется, окно графика заблокировано, и я не могу использовать «интерактивные» инструменты. Как только итерация будет завершена, она обновит график, и все входные данные, которые я сделал в течение периода «заморозки», будут выполнены. Но для практических целей это как 10-секундная (или более длительная, в зависимости от того, сколько времени занимает взаимодействие) пауза, прежде чем я получу ответ.

Есть ли способ сохранить отзывчивость окна во время выполнения вычисления, или это встроенное замораживание, которое невозможно предотвратить?

Спасибо за любые подсказки и извините, если это дубликат.

Best, pohly

1 Ответ

2 голосов
/ 03 мая 2020

Если я правильно понимаю ваш вопрос, один из подходов, которые вы можете использовать, - это использовать функцию pause:

help?> Plt.pause

Pause for *interval* seconds.

If there is an active figure, it will be updated and displayed before the
pause, and the GUI event loop (if any) will run during the pause.

This can be used for crude animation.  For more complex animation, see
:mod:`matplotlib.animation`.

Notes
-----
This function is experimental; its behavior may be changed or extended in a
future release.

Вот пример кода:

import PyPlot

const plt = PyPlot

ax1 = plt.subplot(1,2,1)
ax2 = plt.subplot(1,2,2)

x = rand(1)
y = rand(1)
for i in 1:100
    push!(x, rand())
    push!(y, rand())
    ax1.plot(x)
    ax2.plot(y)
    plt.pause(0.01)
end

это то, что вы хотели?

РЕДАКТИРОВАТЬ

Если ваши вычисления дороги, то вы можете используйте многопоточность, чтобы получить то, что вы хотите. Вот пример (функция f требует большого объема вычислений и должна выполняться в отдельном потоке):

import PyPlot

function f()
    for i in 1:10^9 # just run some expensive task
        rand()
    end
    return rand()
end

const plt = PyPlot

ax1 = plt.subplot(1,2,1)
ax2 = plt.subplot(1,2,2)

x = rand(1)
y = rand(1)
for i in 1:10
    t = Threads.@spawn f()
    push!(x, fetch(t))
    push!(y, rand())
    ax1.plot(x)
    ax2.plot(y)
    plt.pause(0.0001)
end
...