Создание фигуры с графиками, ползунками и другими виджетами, расположенными в макете сетки - PullRequest
0 голосов
/ 13 декабря 2018

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

Этот код создаст график в верхней части рисунка, а остальное оставит пустым.Однако оси x и y отрисовываются в диапазоне [-0,05,05], а не в предварительно заданных диапазонах ниже.

Как сделать так, чтобы график отображался в нужном мне масштабе?

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

Я попробовал кое-что ниже, но это, очевидно, не сработало. Как мне сделать так, чтобы все работало так, как я хочу?

import matplotlib.gridspec as gridspec
import numpy as np

from matplotlib import pyplot as plt

PI = np.pi

# Half width of the graph x-axis
x_axis = 4*PI
# x_axis offset
x_offset = 0
# Half height of the graph y-axis
y_axis = 8
# y_axis offset
y_offset = -1

fig = plt.figure()

mainGrid = gridspec.GridSpec(2, 1)
graphCell = plt.subplot(mainGrid[0, :])
graphCell.plot(xlim=(-x_axis-x_offset, x_axis-x_offset), ylim=(-y_axis-y_offset, y_axis-y_offset))
controlCell = mainGrid[1, :]
controlGrid = gridspec.GridSpecFromSubplotSpec(1, 7, controlCell)
sliderCell = controlGrid[0, 0]
sliderCount = 7
sliderGrid = gridspec.GridSpecFromSubplotSpec(sliderCount, 1, sliderCell)
sliders = []
for i in range(0, sliderCount):
    pass
    #sliders[i] = Slider(sliderGrid[0, i], "Test {}".format(i), 0.1, 8.0, valinit=2, valstep=0.01)

x_data = np.linspace(-x_axis-x_offset, x_axis-x_offset, 512)
y_data = [x for x in x_data]

line = plt.plot([], [])[0]
line.set_data(x_data, y_data)

plt.show()

1 Ответ

0 голосов
/ 13 декабря 2018

Некоторые проблемы:

  • plot не имеет аргумента xlim.
  • В коде слишком много сетки
  • Виджетынужно жить по осям
  • Первый индекс сетки - это строки, а не столбцы.

Всего

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from matplotlib.widgets import Slider

# Half width of the graph x-axis
x_axis = 4*np.pi
# x_axis offset
x_offset = 0
# Half height of the graph y-axis
y_axis = 8
# y_axis offset
y_offset = -1

fig = plt.figure()

mainGrid = gridspec.GridSpec(2, 1)
ax = plt.subplot(mainGrid[0, :])
ax.set(xlim=(-x_axis-x_offset, x_axis-x_offset), ylim=(-y_axis-y_offset, y_axis-y_offset))
controlCell = mainGrid[1, :]

sliderCount = 7
sliderGrid = gridspec.GridSpecFromSubplotSpec(sliderCount, 1, controlCell)
sliders = []
for i in range(0, sliderCount):
    sliderax = plt.subplot(sliderGrid[i, 0])
    slider = Slider(sliderax, "Test {}".format(i), 0.1, 8.0, valinit=2, valstep=0.01)
    sliders.append(slider)

x_data = np.linspace(-x_axis-x_offset, x_axis-x_offset, 512)
y_data = [x for x in x_data]

line = ax.plot([], [])[0]
line.set_data(x_data, y_data)

plt.show()

enter image description here

...