ChatGPT解答:

python代码+PYQT5,实现自定义选择一个表格的数据并根据用户选择,生成折线图、柱状图、饼图、透视图等,生成的文件可以保存至本地,保存的文件支持多种格式,给出完整的代码

 

ChatGPTDemo

Based on OpenAI API (gpt-3.5-turbo).

python代码+PYQT5,实现自定义选择一个表格的数据并根据用户选择,生成折线图、柱状图、饼图、透视图等,生成的文件可以保存至本地,保存的文件支持多种格式,给出完整的代码

首先,您需要使用PyQt5创建一个界面,使用户能够选择要使用的表格和生成图表的类型。您可以使用QFileDialog来选择要打开的表格文件,并使用QComboBox或QRadioButton来选择要生成的图表类型。

接下来,您需要使用Pandas库来读取和处理表格数据。您可以使用read_excel或read_csv函数读取表格数据,并使用DataFrame来处理数据。

对于生成图表,您可以使用Matplotlib库。Matplotlib支持生成各种类型的图表,包括折线图、柱状图、饼图和透视图。您可以使用不同的Matplotlib函数来生成不同类型的图表,并使用savefig函数将生成的图表保存为文件。

以下是一个简单的示例代码,用于选择一个Excel表格文件并生成一个折线图:

import pandas as pd
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QFileDialog, QMainWindow, QPushButton, QComboBox, QLabel, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Select Table and Chart Type")
        self.table_file = None
        self.chart_type = None
        self.initUI()

    def initUI(self):
        btn_select_file = QPushButton("Select Table File", self)
        btn_select_file.clicked.connect(self.select_table_file)

        lbl_chart_type = QLabel("Select Chart Type", self)
        cmb_chart_type = QComboBox(self)
        cmb_chart_type.addItem("Line Chart")
        cmb_chart_type.addItem("Bar Chart")
        cmb_chart_type.addItem("Pie Chart")
        cmb_chart_type.addItem("Pivot Table")
        cmb_chart_type.currentIndexChanged.connect(self.select_chart_type)

        btn_generate_chart = QPushButton("Generate Chart", self)
        btn_generate_chart.clicked.connect(self.generate_chart)

        layout = QVBoxLayout()
        layout.addWidget(btn_select_file)
        layout.addWidget(lbl_chart_type)
        layout.addWidget(cmb_chart_type)
        layout.addWidget(btn_generate_chart)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def select_table_file(self):
        file_dialog = QFileDialog(self)
        file_dialog.setNameFilter("Excel Files (*.xlsx)")
        if file_dialog.exec_() == QFileDialog.Accepted:
            self.table_file = file_dialog.selectedFiles()[0]

    def select_chart_type(self, index):
        self.chart_type = index

    def generate_chart(self):
        if self.table_file is None:
            return
        if self.chart_type is None:
            return

        df = pd.read_excel(self.table_file)

        if self.chart_type == 0:
            plt.plot(df["x"], df["y"])
            plt.savefig("line_chart.png")
        elif self.chart_type == 1:
            plt.bar(df["x"], df["y"])
            plt.savefig("bar_chart.png")
        elif self.chart_type == 2:
            plt.pie(df["y"], labels=df["x"])
            plt.savefig("pie_chart.png")
        elif self.chart_type == 3:
            pivot_table = pd.pivot_table(df, values="y", index=["x"], aggfunc=sum)
            pivot_table.plot(kind="bar")
            plt.savefig("pivot_table.png")

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

该代码创建了一个简单的界面,用户可以选择要打开的Excel表格文件和要生成的图表类型。当用户单击“生成图表”按钮时,代码将读取表格数据并根据用户选择生成相应的图表,并将图表保存为文件。您可以根据需要扩展该代码,以支持其他类型的图表和文件格式。

更多实例

以下是一些使用Python和PyQt5创建表格和图表的示例:

  1. 使用QTableWidget创建一个简单的表格:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Simple Table")
        self.initUI()

    def initUI(self):
        table = QTableWidget(self)
        table.setColumnCount(3)
        table.setRowCount(3)

        table.setItem(0, 0, QTableWidgetItem("Name"))
        table.setItem(0, 1, QTableWidgetItem("Age"))
        table.setItem(0, 2, QTableWidgetItem("Gender"))

        table.setItem(1, 0, QTableWidgetItem("John"))
        table.setItem(1, 1, QTableWidgetItem("30"))
        table.setItem(1, 2, QTableWidgetItem("Male"))

        table.setItem(2, 0, QTableWidgetItem("Jane"))
        table.setItem(2, 1, QTableWidgetItem("25"))
        table.setItem(2, 2, QTableWidgetItem("Female"))

        self.setCentralWidget(table)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用QFileDialog选择一个Excel表格文件并在QTableWidget中显示数据:

import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QFileDialog, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Select Table File")
        self.table_file = None
        self.initUI()

    def initUI(self):
        btn_select_file = QPushButton("Select Table File", self)
        btn_select_file.clicked.connect(self.select_table_file)

        table = QTableWidget(self)

        btn_load_data = QPushButton("Load Data", self)
        btn_load_data.clicked.connect(lambda: self.load_data(table))

        layout = QVBoxLayout()
        layout.addWidget(btn_select_file)
        layout.addWidget(table)
        layout.addWidget(btn_load_data)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def select_table_file(self):
        file_dialog = QFileDialog(self)
        file_dialog.setNameFilter("Excel Files (*.xlsx)")
        if file_dialog.exec_() == QFileDialog.Accepted:
            self.table_file = file_dialog.selectedFiles()[0]

    def load_data(self, table):
        if self.table_file is None:
            return

        df = pd.read_excel(self.table_file)

        table.setColumnCount(len(df.columns))
        table.setRowCount(len(df.index))

        for i in range(len(df.columns)):
            table.setHorizontalHeaderItem(i, QTableWidgetItem(df.columns[i]))

        for i in range(len(df.index)):
            for j in range(len(df.columns)):
                table.setItem(i, j, QTableWidgetItem(str(df.iloc[i, j])))

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用Matplotlib生成一个简单的折线图:

import sys
import numpy as np
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Line Chart")
        self.initUI()

    def initUI(self):
        btn_generate_chart = QPushButton("Generate Chart", self)
        btn_generate_chart.clicked.connect(self.generate_chart)

        layout = QVBoxLayout()
        layout.addWidget(btn_generate_chart)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def generate_chart(self):
        x = np.linspace(0, 10, 100)
        y = np.sin(x)

        plt.plot(x, y)
        plt.xlabel("X")
        plt.ylabel("Y")
        plt.title("Line Chart")
        plt.show()

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用Matplotlib生成一个简单的饼图:

import sys
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Pie Chart")
        self.initUI()

    def initUI(self):
        btn_generate_chart = QPushButton("Generate Chart", self)
        btn_generate_chart.clicked.connect(self.generate_chart)

        layout = QVBoxLayout()
        layout.addWidget(btn_generate_chart)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def generate_chart(self):
        labels = ["A", "B", "C", "D"]
        sizes = [15, 30, 45, 10]

        plt.pie(sizes, labels=labels, autopct="%1.1f%%")
        plt.title("Pie Chart")
        plt.show()

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

这些示例仅供参考,您可以根据需要进行修改和扩展。

再来5个实例

以下是另外5个使用Python和PyQt5创建表格和图表的示例:

  1. 使用QTableView和QStandardItemModel创建一个简单的表格:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Simple Table")
        self.initUI()

    def initUI(self):
        model = QStandardItemModel(3, 3, self)
        model.setItem(0, 0, QStandardItem("Name"))
        model.setItem(0, 1, QStandardItem("Age"))
        model.setItem(0, 2, QStandardItem("Gender"))
        model.setItem(1, 0, QStandardItem("John"))
        model.setItem(1, 1, QStandardItem("30"))
        model.setItem(1, 2, QStandardItem("Male"))
        model.setItem(2, 0, QStandardItem("Jane"))
        model.setItem(2, 1, QStandardItem("25"))
        model.setItem(2, 2, QStandardItem("Female"))

        table = QTableView(self)
        table.setModel(model)

        self.setCentralWidget(table)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用QFileDialog选择一个CSV表格文件并在QTableView中显示数据:

import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QFileDialog, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Select Table File")
        self.table_file = None
        self.initUI()

    def initUI(self):
        btn_select_file = QPushButton("Select Table File", self)
        btn_select_file.clicked.connect(self.select_table_file)

        table = QTableView(self)

        btn_load_data = QPushButton("Load Data", self)
        btn_load_data.clicked.connect(lambda: self.load_data(table))

        layout = QVBoxLayout()
        layout.addWidget(btn_select_file)
        layout.addWidget(table)
        layout.addWidget(btn_load_data)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def select_table_file(self):
        file_dialog = QFileDialog(self)
        file_dialog.setNameFilter("CSV Files (*.csv)")
        if file_dialog.exec_() == QFileDialog.Accepted:
            self.table_file = file_dialog.selectedFiles()[0]

    def load_data(self, table):
        if self.table_file is None:
            return

        df = pd.read_csv(self.table_file)

        model = QStandardItemModel(len(df.index), len(df.columns), self)

        for i in range(len(df.columns)):
            model.setHeaderData(i, Qt.Horizontal, df.columns[i])

        for i in range(len(df.index)):
            for j in range(len(df.columns)):
                model.setData(model.index(i, j), df.iloc[i, j])

        table.setModel(model)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用Matplotlib生成一个简单的柱状图:

import sys
import numpy as np
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Bar Chart")
        self.initUI()

    def initUI(self):
        btn_generate_chart = QPushButton("Generate Chart", self)
        btn_generate_chart.clicked.connect(self.generate_chart)

        layout = QVBoxLayout()
        layout.addWidget(btn_generate_chart)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def generate_chart(self):
        x = np.array(["A", "B", "C", "D"])
        y = np.array([15, 30, 45, 10])

        plt.bar(x, y)
        plt.xlabel("X")
        plt.ylabel("Y")
        plt.title("Bar Chart")
        plt.show()

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用Matplotlib生成一个简单的散点图:

import sys
import numpy as np
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Scatter Plot")
        self.initUI()

    def initUI(self):
        btn_generate_chart = QPushButton("Generate Chart", self)
        btn_generate_chart.clicked.connect(self.generate_chart)

        layout = QVBoxLayout()
        layout.addWidget(btn_generate_chart)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def generate_chart(self):
        x = np.random.rand(100)
        y = np.random.rand(100)
        colors = np.random.rand(100)
        sizes = 1000 * np.random.rand(100)

        plt.scatter(x, y, c=colors, s=sizes, alpha=0.5)
        plt.xlabel("X")
        plt.ylabel("Y")
        plt.title("Scatter Plot")
        plt.show()

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用Plotly生成一个简单的3D散点图:

import sys
import plotly.graph_objs as go
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("3D Scatter Plot")
        self.initUI()

    def initUI(self):
        btn_generate_chart = QPushButton("Generate Chart", self)
        btn_generate_chart.clicked.connect(self.generate_chart)

        self.web_view = QWebEngineView(self)

        layout = QVBoxLayout()
        layout.addWidget(btn_generate_chart)
        layout.addWidget(self.web_view)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def generate_chart(self):
        x = [1, 2, 3, 4, 5]
        y = [2, 3, 4, 5, 6]
        z = [3, 4, 5, 6, 7]

        trace = go.Scatter3d(x=x, y=y, z=z, mode="markers", marker=dict(size=12, color=z, colorscale="Viridis", opacity=0.8))

        layout = go.Layout(margin=dict(l=0, r=0, b=0, t=0))

        fig = go.Figure(data=[trace], layout=layout)

        self.web_view.setHtml(fig.to_html(include_plotlyjs="cdn"))

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

希望这些示例对您有所帮助!

更多

以下是另外5个使用Python和PyQt5创建表格和图表的示例:

  1. 使用QTableWidget和Pandas创建一个简单的表格:

import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Simple Table")
        self.initUI()

    def initUI(self):
        df = pd.DataFrame({"Name": ["John", "Jane"], "Age": [30, 25], "Gender": ["Male", "Female"]})

        table = QTableWidget(self)
        table.setColumnCount(len(df.columns))
        table.setRowCount(len(df.index))

        for i in range(len(df.columns)):
            table.setHorizontalHeaderItem(i, QTableWidgetItem(df.columns[i]))

        for i in range(len(df.index)):
            for j in range(len(df.columns)):
                table.setItem(i, j, QTableWidgetItem(str(df.iloc[i, j])))

        self.setCentralWidget(table)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
  1. 使用QFileDialog选择一个JSON表格文件并在QTableWidget中显示数据:

import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QFileDialog, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Select Table File")
        self.table_file = None
        self.initUI()

    def initUI(self):
        btn_select_file = QPushButton("Select Table File", self)
        btn_select_file.clicked.connect(self.select_table_file)

        table = QTableWidget(self)

        btn_load_data = QPushButton("Load Data", self)
        btn_load_data.clicked.connect(lambda: self.load_data(table))

        layout = QVBoxLayout()
        layout.addWidget(btn_select_file)
        layout.addWidget(table)
        layout.addWidget(btn_load_data)

        widget

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐