使用matplotlib的交互式图形用户界面

2024-04-29 14:28:57 发布

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

使用这里的例子:https://matplotlib.org/3.1.0/gallery/widgets/buttons.html

尝试在3D系统中扩展系统,即在3D中绘制线条,其坡度由按钮控制。

代码段如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
from mpl_toolkits.mplot3d import Axes3D


slope_x = np.array([-4,-3,-2,-1,0,1,2,3,4])
slope_y = np.array([-4,-3,-2,-1,0,1,2,3,4])

fig = plt.figure()
ax = fig.gca(projection='3d')
plt.subplots_adjust(bottom=0.2)
z = np.arange(0.0, 1.0, 0.001)

x = slope_x[4]  * z
y = slope_y[4]  * z

l , = ax.plot(x, y, z, label='parametric curve')


class Index(object):
    ind_x = 4
    ind_y = 4

    def x_up(self, event):
        self.ind_x += 1
        i = self.ind_x % len(slope_x)
        xdata = slope_x[i] * z
        l.set_xdata(xdata)
        plt.draw()

    def x_down(self, event):
        self.ind_x -= 1
        i = self.ind_x % len(slope_x)
        xdata = slope_x[i] * z
        l.set_xdata(xdata)
        plt.draw()

    def y_up(self, event):
        self.ind_y += 1
        i = self.ind_y % len(slope_y)
        ydata = slope_y[i] * z
        l.set_ydata(ydata)
        plt.draw()

    def y_down(self, event):
        self.ind_y -= 1
        i = self.ind_y % len(slope_y)
        ydata = slope_y[i] * z
        l.set_ydata(ydata)
        plt.draw()

callback = Index()

axdown = plt.axes([0.7, 0.05, 0.1, 0.075])
axup = plt.axes([0.8, 0.05, 0.1, 0.075])

aydown = plt.axes([0.6, 0.05, 0.1, 0.075])
ayup = plt.axes([0.5, 0.05, 0.1, 0.075])

bxup = Button(axup, 'x_up')
bxup.on_clicked(callback.x_up)

bxdown = Button(axdown, 'x_down')
bxdown.on_clicked(callback.x_down)

byup = Button(axup, 'y_up')
byup.on_clicked(callback.y_up)

bydown = Button(axdown, 'y_down')
bydown.on_clicked(callback.y_down)

plt.show()

预期:带有4个按钮的交互式图形,所有按钮都起作用,即改变直线的坡度

输出:2个按钮甚至没有被检测到,并且所有按钮都不能正常工作


Tags: importselfeventdefnpcallbackbuttonplt