用gridspec布局的绘图、滑块和其他小部件创建一个图形

2024-06-28 11:08:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个动画图形,其中的参数可以控制滑块和其他小部件。我必须创建几个类似的图形,所以我想把它打包到某个类中,以便与各种参数一起重用。但在那之前,我想弄清楚它是怎么工作的。在

这段代码将在图的上部创建一个图形,其余部分留空。但是,x和y轴的绘制范围为[-0.05,0.05],而不是在下面预定义的范围内。在

如何确保图形按我想要的比例绘制?

另一件我不知道的事情是如何在布局中添加小部件?我想把它们插入到gridspec中,而不必硬编码坐标和大小,让它们适应给定的空间。在

我试过下面的方法,但显然没用。我该怎么做才能让它按我的意愿工作?

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()

Tags: import图形data参数matplotlib部件asnp
1条回答
网友
1楼 · 发布于 2024-06-28 11:08:32

一些问题:

  • 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

相关问题 更多 >