【问题标题】:Display a graph on selecting a combobox option on PyQt GUI , over an existing mainwindow在现有主窗口上显示在 PyQt GUI 上选择组合框选项的图表
【发布时间】:2020-03-11 06:14:30
【问题描述】:

所以我试图基本上设置某种工具,它允许我从数据框中选择一列,当我从组合框中选择该列时,显示该列分布的图表应该显示在同一窗户。我不知道该怎么办...

这就是我的组合框的外观:

我需要能够在同一窗口中显示图表(分布)。

我该怎么做?

【问题讨论】:

    标签: python user-interface matplotlib pyqt5 distribution


    【解决方案1】:

    这是一个示例,说明如何使用组合框在同一窗口中的数据框中绘制列中的数据。

    from PyQt5 import QtWidgets
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    import matplotlib.pyplot as plt
    import pandas as pd
    import os
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.combo = QtWidgets.QComboBox()
            self.combo.addItem("Choose a field")
            self.button = QtWidgets.QPushButton('Read csv file')
    
            # axes and widget for plotting and displaying the figure
            self.fig, self.ax = plt.subplots()
            self.figure_widget = FigureCanvas(self.fig)
            plt.tight_layout()
    
            # set up layout
            vlayout = QtWidgets.QVBoxLayout(self)
            hlayout = QtWidgets.QHBoxLayout()
            hlayout.addWidget(self.combo)
            hlayout.addWidget(self.button)
            hlayout.addStretch(2)
            vlayout.addLayout(hlayout)
            vlayout.addWidget(self.figure_widget)
    
            self.button.clicked.connect(self.read_data)
            self.combo.currentTextChanged.connect(self.field_changed)
    
        def read_data(self):
            dialog = QtWidgets.QFileDialog(self, directory=os.curdir, caption='Open data file' )
            dialog.setAcceptMode(QtWidgets.QFileDialog.AcceptOpen)
            dialog.setFileMode(QtWidgets.QFileDialog.ExistingFile)
            if dialog.exec():
                # read data and add columns to combo box
                file = dialog.selectedFiles()[0]
                self.data = pd.read_csv(file)
                self.combo.clear()
                self.combo.addItem("Choose a field")
                for field in self.data.columns:
                    self.combo.addItem(field)
                self.combo.setCurrentIndex(0)
    
        def field_changed(self, field):
            self.ax.clear()
            if field in self.data.columns:
                self.data.plot(y=field, ax=self.ax)
                self.ax.set_ylabel(field)
                self.ax.set_xlabel('index')
            plt.tight_layout()
            self.fig.canvas.draw()
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication([])
        widget = Widget()
        widget.show()
        app.exec()
    

    【讨论】:

    • 其实,我想展示一个seaborn countplot,那有什么区别呢?? @Heike
    • @ArvindSudheer 实际上并没有那么多。主要的改变是,你会得到类似sns.countplot(x=field, data=self.data, ax=self.ax) 的东西,而不是使用self.data.plot(...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2013-06-15
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2013-10-15
    相关资源
    最近更新 更多