使用FigureCanvasQTAgg时DataFrame绘图行为不同

2 投票
1 回答
1396 浏览
提问于 2025-04-18 12:47

我正在尝试绘制几个数据系列,这些数据都在一个叫做 pandas DataFrame 的表格里。我们用 df 作为例子:

import pandas as pd
import matplotlib.pyplot as plt

d = {'1': [1,2,3], '2': [1,4,9]}
df = pd.DataFrame(d)
df.plot()
plt.show()

这段代码可以生成一个简单的折线图,里面有两条不同的数据线:

plot of two lines

但是,如果我想在一个 PyQt 的小部件里用 FigureCanvasQTAgg 来绘制同样的图,我只得到了一条线。我的第二个例子的代码稍微复杂一些:

import pandas as pd
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from PyQt4.QtGui import QWidget, QSizePolicy, QApplication

class DisplayWidget( QWidget ):
    def __init__(self, parent=None):
        super( DisplayWidget, self).__init__( parent )

        self.initUI()

        d = {'1': [1,2,3], '2': [1,4,9]}        
        self.df = pd.DataFrame(d)
        self.canvas.plot_data_frame(self.df)

    def initUI(self):

        self.canvas = PlotCanvas(self)

class PlotCanvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = self.fig.add_subplot(111)
        self.axes.hold(False)

        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                                   QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)


    def plot_data_frame( self, df, **kwargs ):
        df.plot( ax = self.axes, **kwargs )
        self.draw()        

if __name__ == "__main__":

    app = QApplication( [] )
    widget = DisplayWidget()
    widget.show()
    app.exec_()

当我运行这段代码时,输出结果是这样的:

plot of one line

如果有人能帮我解答这个问题,我会非常感激!

谢谢。

1 个回答

5

删除这一行:

self.axes.hold(False)

撰写回答