import sys
import numpy as np
import pandas as pd
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtChart import QChart, QChartView, QBarSeries, QBarSet, QBarCategoryAxis, QValueAxis


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(800, 600)

        # 生成随机数据
        df = pd.DataFrame(np.random.randint(20, 35, size=(7, 4)), columns=list('abcd'), index=list('1234567'))
        print(df)

        # 创建柱状图系列
        series = QBarSeries()
        for col in df.columns:
            setTemp = QBarSet(col)
            setTemp.append(list(df[col]))
            series.append(setTemp)

        # 创建图表
        chart = QChart()
        chart.addSeries(series)
        chart.setTitle("Weather (day of the week)")
        chart.setAnimationOptions(QChart.SeriesAnimations)

        # 设置X轴
        axisX = QBarCategoryAxis()
        axisX.append([f"day of week-{i}" for i in range(7)])
        chart.addAxis(axisX, Qt.AlignBottom)
        series.attachAxis(axisX)

        # 设置Y轴
        axisY = QValueAxis()
        axisY.applyNiceNumbers()
        chart.addAxis(axisY, Qt.AlignLeft)
        series.attachAxis(axisY)

        # 设置图例
        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignBottom)

        # 创建图表视图
        chartView = QChartView(chart)
        chartView.setRenderHint(QPainter.Antialiasing)
        self.setCentralWidget(chartView)

        # 连接双击事件
        series.doubleClicked.connect(self.bar_double_clicked)

    def bar_double_clicked(self, index, barset):
        print(barset.label(), barset.at(index), self.axis_x.categories()[index])


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
