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

Интерактивный график matplotlib с двумя ползунками

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

  • Интересно, как бы я мог взаимодействовать с регенерацией сюжета с помощью клавиш клавиатуры, чтобы увеличить/уменьшить значения некоторых переменных и сразу увидеть, как изменяется сюжет.

  • Каков наилучший подход для этого?

  • Также, если вы можете указать мне интересные ссылки или ссылку на пример с двумя ползунками?

4b9b3361

Ответ 1

В дополнение к тому, что упомянуто в @triplepoint, посмотрите на виджет слайдера.

Вот пример на странице примеров matplotlib. Это графический слайдер, а не привязка клавиатуры, но он отлично подходит для того, что вы хотите сделать.

Также обратите внимание: чтобы гарантировать, что слайдеры и кнопки остаются отзывчивыми, а не собирать мусор, ссылки на объекты (amp_slider, freq_slider и т.д.) должны поддерживаться сами.

(Я создаю эту вики сообщества, так как я просто скопирую пример из примера. Этот конкретный пример учит вредным привычкам (например, from pylab import *), но он получает точку. Пример был исправлен, чтобы избежать использования pylab.)

from numpy import pi, sin
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

def signal(amp, freq):
    return amp * sin(2 * pi * freq * t)

axis_color = 'lightgoldenrodyellow'

fig = plt.figure()
ax = fig.add_subplot(111)

# Adjust the subplots region to leave some space for the sliders and buttons
fig.subplots_adjust(left=0.25, bottom=0.25)

t = np.arange(0.0, 1.0, 0.001)
amp_0 = 5
freq_0 = 3

# Draw the initial plot
# The 'line' variable is used for modifying the line later
[line] = ax.plot(t, signal(amp_0, freq_0), linewidth=2, color='red')
ax.set_xlim([0, 1])
ax.set_ylim([-10, 10])

# Add two sliders for tweaking the parameters

# Define an axes area and draw a slider in it
amp_slider_ax  = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axis_color)
amp_slider = Slider(amp_slider_ax, 'Amp', 0.1, 10.0, valinit=amp_0)

# Draw another slider
freq_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axis_color)
freq_slider = Slider(freq_slider_ax, 'Freq', 0.1, 30.0, valinit=freq_0)

# Define an action for modifying the line when any slider value changes
def sliders_on_changed(val):
    line.set_ydata(signal(amp_slider.val, freq_slider.val))
    fig.canvas.draw_idle()
amp_slider.on_changed(sliders_on_changed)
freq_slider.on_changed(sliders_on_changed)

# Add a button for resetting the parameters
reset_button_ax = fig.add_axes([0.8, 0.025, 0.1, 0.04])
reset_button = Button(reset_button_ax, 'Reset', color=axis_color, hovercolor='0.975')
def reset_button_on_clicked(mouse_event):
    freq_slider.reset()
    amp_slider.reset()
reset_button.on_clicked(reset_button_on_clicked)

# Add a set of radio buttons for changing color
color_radios_ax = fig.add_axes([0.025, 0.5, 0.15, 0.15], axisbg=axis_color)
color_radios = RadioButtons(color_radios_ax, ('red', 'blue', 'green'), active=0)
def color_radios_on_clicked(label):
    line.set_color(label)
    fig.canvas.draw_idle()
color_radios.on_clicked(color_radios_on_clicked)

plt.show()

Example

Ответ 2

У Matplotlib есть довольно приятная функциональность gui. В исходном tarball matplotlib есть примеры документации, в /examples/user _interfaces и matplotlib > /examples/event_handling. В частности, при обработке ключей: http://matplotlib.sourceforge.net/examples/event_handling/keypress_demo.html

Я сделал нечто похожее на то, к чему вы стремитесь:

import numpy as np
import pylab

class plotter:
    def __init__(self, initial_values):
        self.values
        self.fig = pylab.figure()
        pylab.gray()
        self.ax = self.fig.add_subplot(111)
        self.draw()
        self.fig.canvas.mpl_connect('key_press_event',self.key)

    def draw(self):
        im = your_function(self.values)
        pylab.show()
        self.ax.imshow(im)

    def key(self, event):
        if event.key=='right':
            self.values = modify()
        elif event.key == 'left':
            self.values = modify()

        self.draw()
        self.fig.canvas.draw()

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

Если вы хотите делать такие вещи, как пользовательские значения ввода, я думаю, что в примерах есть опции для диалоговых окон, но если вы просто хотите увеличивать/уменьшать количество переменных, то просто определять пары пар для них таким образом может хорошо работать

Ответ 3

Я не думаю, что просто построение графиков с помощью plt.plot позволит вам сделать это. Вам нужно будет создать собственный графический интерфейс script/app, вставив в него Matplotlib. В настоящее время Matplotlib поддерживает все основные инструментальные средства GUI - PyGTK +, PyQt4 и wxPython.
Я использую wxPython и встраивание matplotlib в него довольно просто. Аналогичное должно быть в случае с другими инструментами GUI. Вы можете получить всю необходимую информацию для этого в книге - enter image description here

Он доступен на amazon здесь.

Ответ 4

Используйте waitforbuttonpress(timeout=0.001), тогда на графике будут видны ваши мышиные галочки.