【问题标题】:Plot a figure on a canvas在画布上绘制图形
【发布时间】:2018-01-14 11:17:13
【问题描述】:

我正在使用 Qt Designer 和 matplotlib 进行绘图。

到目前为止,我已将 Qwidget 提升为 Canvas 类,并通过创建轴并使用 figure.add_subplot() 绘制它们来在其上绘制绘图,因此代码如下所示:

ax = self.canvas.figure.add_subplot(111)

ax.plot(data)

self.canvas.draw()

但是现在我有一个图形对象,我需要绘制它。有没有办法在不实例化轴并将它们分配给图形的情况下做到这一点?有没有办法我可以做: “self.canvas.add_figure”?因为在我的情况下,我无法访问轴。

编辑:这是画布的代码。

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
import matplotlib.pyplot as plt
from PyQt4 import QtGui
class Canvas(FigureCanvas):
    def __init__(self, parent=None):
        self.figure = plt.figure()
        FigureCanvas.__init__(self, self.figure)
        self.setParent(parent)
        FigureCanvas.setSizePolicy(self,
                               QtGui.QSizePolicy.Expanding,
                               QtGui.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

【问题讨论】:

  • 我认为您使用的画布是一个图形,您可以显示更多代码以更好地理解您,也因为您说您无法访问轴。使用 self.ax = self.canvas.figure.add_subplot(111) 然后 obj.ax.plot() 让它们成为类成员
  • 您不能在画布上添加图形。画布只与一个图形相关联,该图形被传递给构造函数。我认为以后无法更改(分配给self.figure 似乎以可怕的方式失败)。

标签: python qt matplotlib pyqt qt-designer


【解决方案1】:

问题可能是由于错误的假设:如果您有一个图形并且该图形包含一个或多个轴,您可以通过fig.get_axes() 访问这些轴。如果图形不包含轴,您仍然可以通过fig.add_subplot()fig.add_axes() 向其中添加轴。 因此,您在这里尝试解决的问题可能很容易被规避。

来到问题本身。画布始终与图形相关联。没有图形的画布毫无意义。有两种选择:

1。使用可用图形创建画布

您可以延迟创建FigureCanvas,直到您可以访问要显示的图形。

self.figure = <figure you want to show>
FigureCanvas.__init__(self, self.figure)

2。更换画布

您可以将已有的画布替换为承载要显示的新图形的画布。

self.layout().removeWidget(self.canvas)
# create a new canvas
self.figure = <figure you want to show>
self.canvas = FigureCanvas(self.figure)
# add the new canvas at the position of the old one
self.layout().addWidget(self.canvas, 1)
self.canvas.draw()
self.parent.parent.processEvents()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多