我有一个带有几个嵌入式matplotlib小部件(https://github.com/chipmuenk/pyFDA)的pyQt应用程序。
可以为每个绘图小部件关闭绘图的自动更新以加速应用程序(特别是3D绘图可能需要很长时间)。
不幸的是,我还没有完全禁用(灰色)画布。我喜欢的是做
之类的事情class MplWidget(QWidget):
"""
Construct a subwidget with Matplotlib canvas and NavigationToolbar
"""
def __init__(self, parent):
super(MplWidget, self).__init__(parent)
# Create the mpl figure and construct the canvas with the figure
self.fig = Figure()
self.pltCanv = FigureCanvas(self.fig)
#-------------------------------------------------
self.mplwidget = MplWidget(self)
self.mplwidget.pltCanv.setEnabled(False) # <- this doesn't work
明确表示此窗口小部件中没有任何内容可以与之交互。有一个简单的解决方法吗?
答案 0 :(得分:1)
您可以通过在其上面放置一个灰色的半透明贴片来使图形变灰。为此,您可以创建一个Rectangle,将其zorder设置得非常高并为其赋予图形变换。要将其添加到轴,您可以使用ax.add_patch
;但是,为了将其添加到带有3D轴的图形中,这将无法工作,您需要通过fig.patches.extend
添加它。 (见this answer)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot([1,3,2],[1,2,3],[2,3,2])
rect=plt.Rectangle((0,0),1,1, transform=fig.transFigure,
clip_on=False, zorder=100, alpha=0.5, color="grey")
fig.patches.extend([rect])
plt.show()
您可以断开画布中的所有事件。这将阻止任何用户交互,但也不可逆转;因此,如果您在稍后阶段需要这些事件,解决方案会更复杂。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot([1,3,2],[1,2,3],[2,3,2])
for evt, callback in fig.canvas.callbacks.callbacks.items():
for cid, _ in callback.items():
fig.canvas.mpl_disconnect(cid)
plt.show()