Пример #1
0
    def build(self):
        self.setWindowTitle('Emoreco')
        self.setWindowIcon(QIcon(root + 'Logo.ico'))

        oImage = QImage(root + "Background.png")
        palette = QPalette()
        palette.setBrush(QPalette.Window, QBrush(oImage))
        self.setPalette(palette)

        oImage = QPixmap(root + "Ok.png")
        palette = QPalette()
        palette.setBrush(self.OkButton.backgroundRole(), QBrush(oImage))

        self.OkButton.setFlat(1)
        self.OkButton.setAutoFillBackground(1)
        self.OkButton.setPalette(palette)
        self.OkButton.clicked.connect(self.closeWindow)
        set_list = [
            QBarSet('Circulatory'),
            QBarSet('Digestive'),
            QBarSet('Endocrine'),
            QBarSet('Integumentary'),
            QBarSet('Lymphatic'),
            QBarSet('Muscular'),
            QBarSet('Nervous'),
            QBarSet('Excretory'),
            QBarSet('Reproductive'),
            QBarSet('Respiratory'),
            QBarSet('Skeletal')
        ]

        categories = ['']

        series = QBarSeries()
        chart = QChart()
        axis = QBarCategoryAxis()

        for i in range(sys_n):
            set_list[i].append([dis_prediction[i]])
            series.append(set_list[i])

        chart.addSeries(series)
        axis.append(categories)

        chart.setTitle('Our prediction (%)')

        chart.createDefaultAxes()
        chart.setAxisX(axis, series)
        chart.legend().setAlignment(Qt.AlignLeft)
        chart.setBackgroundBrush(QColor(61, 56, 63, 0))

        chartView = QChartView(chart)
        chartView.chart().setAnimationOptions(QChart.AllAnimations)

        base = self.gridLayout
        base.addWidget(chartView)
        self.show()
Пример #2
0
class StatsTab(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.seriesmap = {}  # map items to series
        # create widgets
        self.stat_list = QListWidget(self)
        chart = QChart()
        self.chart_view = QChartView(chart, self)

        for i in range(30):
            series = QLineSeries(self)
            for j in range(20):
                series.append(j, i * 3 + j)

            item = QListWidgetItem()
            item.setData(Qt.DisplayRole, str(i))
            item.setData(Qt.UserRole, i)

            if i < 10:
                item.setData(Qt.CheckStateRole, Qt.Checked)
            else:
                item.setData(Qt.CheckStateRole, Qt.Unchecked)
                series.hide()

            chart.addSeries(series)
            self.stat_list.addItem(item)
            self.seriesmap[i] = series

        # create layout
        layout = QHBoxLayout(self)
        layout.addWidget(self.stat_list)
        layout.addWidget(self.chart_view)
        layout.setStretchFactor(self.chart_view, 3)

        # configure widgets
        chart.legend().hide()
        chart.createDefaultAxes()
        chart.setTitle("Daily aggregated stats of your school")
        self.chart_view.setRenderHint(QPainter.Antialiasing)
        self.retranslateUi()

        # connect signals
        self.stat_list.itemClicked.connect(self.on_stat_clicked)

    def retranslateUi(self):
        chart = self.chart_view.chart()
        chart.setTitle(
            QApplication.translate("StatsTab",
                                   "Daily aggregated stats of your school"))

    @pyqtSlot(QListWidgetItem)
    def on_stat_clicked(self, item):
        key = item.data(Qt.UserRole)
        series = self.seriesmap[key]
        series.setVisible(not series.isVisible())
Пример #3
0
    def __init__(self, config: Config, chart_view: QChartView) -> None:
        self.chart_view = chart_view
        self.config = config
        self.initialized = False

        chart_view.setRenderHint(QPainter.Antialiasing)
        self.chart: QChart = chart_view.chart()
        legend: QLegend = self.chart.legend()
        legend.hide()

        self.chart_view.repaint()
Пример #4
0
    def __init__(self):
        super(SpeedFigure, self).__init__()
        self.layout = QVBoxLayout()
        self.chart_view = []
        self.line_series = [[], []]
        self.y_axis = []
        self.default_max_y_value = 3000
        self.colors = [Qt.red, Qt.blue, Qt.green, Qt.magenta]
        for i in range(2):
            cv = QChartView()
            for j in range(4):
                ls = QLineSeries()
                p = ls.pen()
                p.setColor(self.colors[j])
                ls.setPen(p)
                self.line_series[i].append(ls)
                cv.chart().addSeries(ls)

            cv.chart().legend().hide()
            cv.chart().layout().setContentsMargins(0, 0, 0, 0)

            cv.setRenderHint(QPainter.Antialiasing)
            self.chart_view.append(cv)
            self.layout.addWidget(cv)

        self.last_timestamp = None

        self.setLayout(self.layout)
Пример #5
0
class PieChart(QDialog):
    def __init__(self, title: str, project_data, parent=None):
        super(PieChart, self).__init__(parent)
        self.setWindowTitle(title)
        self._layout = QVBoxLayout(self)
        self.setMinimumWidth(600)
        self.setMinimumHeight(500)
        self._create_pie_chart(project_data)

    '''定义饼状图并获取各区间信息'''

    def get_data(self, mark_data):
        pie_series = QPieSeries()  # 定义PieSeries
        total_area = 0
        for j in range(len(mark_data)):
            total_area += mark_data[j][1]
        for j in range(len(mark_data)):
            percentage = mark_data[j][1] / total_area * 100
            str1 = "{:.1f}%".format(percentage) + mark_data[j][0]
            pie_series.append(str1, mark_data[j][1])
        return pie_series

    '''绘制饼状图各区间'''

    def set_slice(self, pie_series: QPieSeries, mark_data) -> QPieSeries:
        for i in range(len(mark_data)):
            slice_ = pie_series.slices()[i]  # 地道饼图的某一个元素切片
            slice_.setLabelVisible()  # 设置各区域文本标签
            slice_.setPen(QPen(Qt.darkGreen, 0))  # 设置画笔类型——边界线颜色
            slice_.setBrush(mark_data[i][2])  # 设置笔刷——区域颜色
        return pie_series

    '''绘制饼状图并显示'''

    def _create_pie_chart(self, project_data: tuple):
        font = QFont("黑体")
        point_size = font.pointSize()
        font.setPixelSize(point_size * 90 / 72)

        self.char_view = QChartView(self)  # 将父窗体设置为空,设置为独立窗口
        self.char_view.setFont(font)
        self.char_view.setGeometry(100, 100, 800, 600)  # 设置窗口位置和大小
        self.char_view.setRenderHint(QPainter.Antialiasing)  # 消除锯齿

        pie = self.get_data(project_data)  # 获取区域种类及占比信息

        pie_series = self.set_slice(pie, project_data)  # 绘制饼状图各区间
        self.char_view.chart().addSeries(pie_series)  # 将饼状图添加至charView中
        self.char_view.chart().setTitle("各类型地物占比")  # 设置标题
        self.char_view.chart().legend().hide()
        self._layout.addWidget(self.char_view)

    def closeEvent(self, QCloseEvent):
        del self._layout
        del self.char_view
        del self
Пример #6
0
class PriceFigure(QWidget):
    def __init__(self):
        super(PriceFigure, self).__init__()
        self.layout = QHBoxLayout()
        self.chart_view = QChartView()
        self.price_series = QLineSeries()
        self.chart_view.chart().addSeries(self.price_series)
        self.chart_view.chart().legend().hide()
        self.chart_view.setRenderHint(QPainter.Antialiasing)
        self.layout.addWidget(self.chart_view)
        self.setLayout(self.layout)
        self.prices = []
        self.volumes = []
        self.graph_time = None
        self.last_timestamp = None

    def set_bound(self, dt, low, high):
        axisX = QDateTimeAxis()
        axisX.setFormat('h:mm')
        start_time = QDateTime()
        finish_time = QDateTime()
        start_time.setDate(QDate(dt.year, dt.month, dt.day))
        start_time.setTime(QTime(9, 0))
        finish_time.setDate(QDate(dt.year, dt.month, dt.day))
        finish_time.setTime(QTime(15, 30))
        axisX.setRange(start_time, finish_time)
        axisY = QValueAxis()
        axisY.setRange(low, high)
        self.chart_view.chart().setAxisX(axisX, self.price_series)
        self.chart_view.chart().setAxisY(axisY, self.price_series)

    def add_trade(self, timestamp, price, volume, is_buy):
        if self.last_timestamp is None:
            self.set_bound(timestamp, price + price * (-30 / 100.), price + price * (30 / 100.))
            self.last_timestamp = timestamp
            self.graph_time = timestamp
        else:
            if timestamp < self.last_timestamp:
                return
            else:
                self.last_timestamp = timestamp
        
        if timestamp - self.graph_time < timedelta(seconds=60):
            self.prices.append(price)
            self.volumes.append(volume)
        else:
            price_mean = np.mean(self.prices)
            self.prices = []
            self.price_series.append(int(timestamp.timestamp() * 1000), price_mean)
            self.graph_time = timestamp
    
    def test_run(self):
        r = random.random()
        if random.random() < 0.5:
            r = -r
        v = random.randint(100, 1000)
        self.current = self.current + self.current * (r / 100.)
        
        self.add_trade(datetime.now() - timedelta(hours=5), self.current, v, True)

    def start_test(self):
        self.set_bound(datetime.now(), 1000, 2000)
        self.timer = QTimer()
        self.timer.timeout.connect(self.test_run)
        self.timer.start(100)
        self.current = 1500
Пример #7
0
class MainChartWidget(QDialog):

    # w_type_charts = None
    # w_chart_line = None
    # w_chart_pie = None
    # w_chart_bar = None
    # w_chart = None
    #
    # v_layout_main = None
    # h_layout_middle = None
    #
    # selector = None

    signal_confirm_chart = pyqtSignal(QChart)

    def __init__(self):
        super(MainChartWidget, self).__init__()

        self.w_type_charts = None
        self.w_chart_line = None
        self.w_chart_pie = None
        self.w_chart_bar = None
        self.w_chart = None

        self.v_layout_main = None
        self.h_layout_middle = None

        self.selector = None
        self.init_ui()

    def init_ui(self):
        self.setFixedSize(700, 600)
        self.assemble()
        self.set_styles()
        self.aux = QPoint(200, 300)
        self.setWindowFlags(Qt.FramelessWindowHint)
        # self.setAttribute(Qt.WA_TranslucentBackground)

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()
        self._from_x = event.pos().x()
        self._from_y = event.pos().y()
        # self.start = event.pos()

    def mouseMoveEvent(self, event):
        delta = QPoint(event.globalPos() - self.oldPos)
        self.aux = QPoint(self.x() + delta.x(), self.y() + delta.y())
        self.move(self.aux)
        self.oldPos = event.globalPos()

        self._to_x = event.pos().x()
        self._to_y = event.pos().y()

        self.global_pos = event.globalPos()

        self._from_x = self._to_x
        self._from_y = self._to_y

    def set_styles(self):
        self.setStyleSheet("""
        MainChartWidget{
            border-radius: 4px;
            background:rgb(37,43,52,220);
            color: white;
        }
        QScrollArea{
                background-color:transparent;
                border-radius: 4px;
                border: 0px solid ;
                border-color: rgb(0,0,0,100)
            }

            QScrollBar:vertical{
                border:1px solid;
                border-color: rgb(197,197,199,100);
                width: 7px;
                margin: 0px 0px 0px 0px;
                background: rgb(234,234,234,100);

            }

            QScrollBar::handle:vertical  {
                background: rgba(14,65,148,100);
            }

            QScrollBar::add-line:vertical{
                height: 0px;
            }

            QScrollBar::sub-line:vertical{
                height: 0px;
            }
        """)

    def assemble(self):

        self.w_type_charts = TopBar(self)
        self.w_type_charts.signal_send_chart_selected.connect(
            self.set_chart_type)
        self.w_type_charts.setMinimumSize(650, 50)
        self.w_type_charts.setMaximumHeight(50)

        self.w_chart_line = LeftBarLineChart(self)
        self.w_chart_line.setMinimumSize(200, 300)
        self.w_chart_line.setMaximumWidth(200)

        self.w_chart_pie = LeftBarPieChart(self)
        self.w_chart_pie.hide()
        self.w_chart_pie.setMinimumSize(200, 300)
        self.w_chart_pie.setMaximumWidth(200)

        self.w_chart_bar = LeftBarBarChart(self)
        self.w_chart_bar.hide()
        self.w_chart_bar.setMinimumSize(200, 300)
        self.w_chart_bar.setMaximumWidth(200)

        self.w_chart = QChartView()
        self.w_chart.setChart(self.w_chart_line.chart)
        self.w_chart.setMinimumSize(400, 300)

        self.v_layout_main = QVBoxLayout()
        self.v_layout_main.setContentsMargins(20, 20, 20, 20)
        self.h_layout_middle = QHBoxLayout()
        self.v_layout_main.addWidget(self.w_type_charts)
        self.v_layout_main.addLayout(self.h_layout_middle)
        self.h_layout_middle.addWidget(self.w_chart_line)
        self.h_layout_middle.addWidget(self.w_chart_pie)
        self.h_layout_middle.addWidget(self.w_chart_bar)
        self.h_layout_middle.addWidget(self.w_chart)

        self.setLayout(self.v_layout_main)
        self.w_type_charts.btn_chart_line_clicked()

    @pyqtSlot(int)
    def set_chart_type(self, type):
        self.w_chart_line.hide()
        self.w_chart_pie.hide()
        self.w_chart_bar.hide()
        self.selector = type
        if type == EChart.LINE:
            self.w_chart_line.show()
            self.w_chart.setChart(self.w_chart_line.chart)
        elif type == EChart.PIE:
            self.w_chart_pie.show()
            self.w_chart.setChart(self.w_chart_pie.chart)
        elif type == EChart.BAR:
            self.w_chart_bar.show()
            self.w_chart.setChart(self.w_chart_bar.chart)

    def confirm_chart(self):
        self.signal_confirm_chart.emit(self.w_chart.chart())
        # KEYBOARD.close()

    def hide(self):
        # KEYBOARD.close()
        super(MainChartWidget, self).hide()
Пример #8
0
class PolygonalChart(QDialog):
    def __init__(self, title: str, project_data, parent=None):
        super(PolygonalChart, self).__init__(parent)
        self.setWindowTitle(title)
        self.setMinimumWidth(700)
        self.setMinimumHeight(500)
        self._layout = QVBoxLayout(self)
        self._create_polygonal_chart(project_data)

    '''定义x轴及其相关属性'''

    def set_x_aix(self, years: []) -> QValueAxis:  # x轴坐标——年份
        x_aix = QValueAxis()
        x_aix.setRange(years[0], years[-1])
        x_aix.setLabelFormat('%d')
        x_aix.setGridLineVisible(True)
        x_aix.setTickCount(len(years))
        x_aix.setMinorTickCount(5)  # 每两个月一个小分级

        return x_aix

    '''定义y轴及其相关属性'''

    def set_y_aix(self, areas: []) -> QValueAxis:  # y轴坐标——面积
        ma = []
        for i in range(0, len(areas)):
            m = max(areas[i])
            ma.append(m)
        bound = max(ma)

        y_aix = QValueAxis()
        y_aix.setRange(0, int(bound))
        y_aix.setLabelFormat('%d')
        y_aix.setGridLineVisible(True)
        y_aix.setTickCount(11)
        y_aix.setMinorTickCount(4)

        return y_aix

    '''创建折线:确定各折点坐标并连接'''

    def create_lines(self, series: QLineSeries, years: [],
                     areas: []) -> QLineSeries:  #

        # 创建曲线  series
        point_dict_list = {}
        for i in range(0, len(years)):  # 定义折线坐标点
            x = years[i]
            y = areas[i]
            points = "point_" + str(i)
            point_dict_list[points] = QPoint(x, y)

        point_list = []
        for point in point_dict_list:  # 定义折线点清单
            point_list.append(point_dict_list[point])

        series.append(point_list)

        return series

    '''根据不同类型创建不同折线'''

    def create_lines_to_types(self, types: []) -> dict:
        dict1 = {}
        for i in range(0, len(types)):
            lines = "series_" + str(i)
            dict1[lines] = QLineSeries()  # 实例化QLineSeries,创建曲线
            dict1[lines].setName(types[i])

        return dict1

    '''创建折线图'''

    def _create_polygonal_chart(self, mark_data):
        self.char_view = QChartView(self)
        self.char_view.setRenderHint(QPainter.Antialiasing)

        types = [a[0] for a in mark_data]
        # t = mark_data[0]
        years = [b[2] for b in mark_data]
        # y = mark_data[2]
        areas = [c[1] for c in mark_data]
        # a = mark_data[1]
        dict1 = self.create_lines_to_types(types)
        for i in range(0, len(types)):
            lines = "series_" + str(i)
            series = self.create_lines(dict1[lines], years[i], areas[i])
            series.setUseOpenGL(True)
            type_ = dict1[lines].name()
            for type_ in types:
                self.char_view.chart().addSeries(series)

        self.char_view.chart().createDefaultAxes()
        self.char_view.chart().setAxisX(self.set_x_aix(years[0]))  # 设置x,y轴属性
        self.char_view.chart().setAxisY(self.set_y_aix(areas))

        self.char_view.chart().setTitle("各地物类型面积变化折线图")
        self._layout.addWidget(self.char_view)
        # self.char_view.show()

    def closeEvent(self, QCloseEvent):
        del self._layout
        del self.char_view
        del self
Пример #9
0
class Widget(QWidget):
    def __init__(self):
        super().__init__()
        self.setMinimumSize(800, 600)

        self.setWindowTitle("Rectifier")

        self.chartView = QChartView()
        self.chart = self.chartView.chart()
        self.series = QLineSeries()
        self.series2 = QLineSeries()
        self.series2.setColor(QColor('red'))

        # for i in range(-90, 90):  # rectifier
        #     x = i * pi / 50
        #     print('x', x)
        #     y = sin(x)
        #     print('y', abs(y))
        #     self.series.append(x, abs(y))

        x = [None] * 400
        for n in range(-200, 200):
            t = n / 100
            if t >= -2 and t <= -1:
                x[n] = 0
            elif t >= -1 and t <= 1:
                x[n] = 1
            elif t >= 1 and t <= 2:
                x[n] = 0
            self.series2.append(t, x[n])

        self.chart.addSeries(self.series)
        self.chart.addSeries(self.series2)

        self.chart.legend().hide()

        def format_axis(axis, min_value, max_value, step):
            for s in axis.categoriesLabels():
                axis.remove(s)
            axis.setStartValue(min_value)
            for i in range(ceil(min_value / step),
                           floor(max_value / step) + 1):
                v = i * step
                axis.append('%s' % v, v)
            axis.setRange(min_value, max_value)
            grid_pen = QPen(QColor('silver'))
            grid_pen.setDashPattern([1, 1, 1, 1, 0, 0, 0, 0])
            #grid_pen.setDashPattern([1, 1, 0, 0])
            axis.setGridLinePen(grid_pen)

        self.chart.createDefaultAxes()

        self.chart.axisX().setRange(-5, 5)
        self.chart.axisX().setGridLineVisible(False)
        self.chartAxisX = QCategoryAxis(
            labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue,
            startValue=0.0)
        self.chart.setAxisX(self.chartAxisX)
        format_axis(self.chartAxisX, -5, 5, 1)

        self.chart.axisY().setRange(-0.1, 1.3)
        self.chartAxisY = QCategoryAxis(
            labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue,
            startValue=0.0)
        self.chart.setAxisY(self.chartAxisY)
        format_axis(self.chartAxisY, -0.1, 1.3, 1)

        self.layout = QGridLayout(self)
        self.layout.addWidget(self.chartView, 1, 1)
        self.chartView.show()
        self.setLayout(self.layout)
Пример #10
0
class CTViewPair(QWidget):
    def __init__(self,
                 CTMain=None,
                 exchange='',
                 base_code='',
                 curr_code='',
                 chart_lookback='',
                 chart_interval='',
                 order_book_depth=5):
        super().__init__()
        self._CTMain = CTMain
        self._exchange = exchange
        self._base_curr = base_code
        self._curr_curr = curr_code
        self._chart_lookback = chart_lookback
        self._chart_interval = chart_interval
        self._order_book_depth = order_book_depth

        if 'Fusion' in QStyleFactory.keys():
            self.change_style('Fusion')

        self._layout = QGridLayout()
        self.setLayout(self._layout)

        self.draw_view()
        self.show()

    def refresh_dropdown_exchange_change(self,
                                         exchange,
                                         default_base=None,
                                         default_curr=None):
        self._exchange = exchange
        if default_base is None:
            default_base = self._dropdown_base_curr.currentText
        if default_curr is None:
            default_curr = self._dropdown_curr_curr.currentText
        base_codes = sorted(
            list(self._CTMain._Crypto_Trader.trader[exchange]._active_markets))
        self._dropdown_base_curr.clear()
        self._dropdown_base_curr.addItems(base_codes)
        if default_base not in base_codes:
            default_base = base_codes[0]
        self._dropdown_base_curr.setCurrentText(default_base)
        self.refresh_dropdown_base_change(default_base, default_curr)

    def refresh_dropdown_base_change(self, base_curr, default_curr=None):
        self._base_curr = base_curr
        if default_curr is None:
            default_curr = self._dropdown_curr_curr.currentText
        curr_codes = sorted(
            list(self._CTMain._Crypto_Trader.trader[
                self._exchange]._active_markets[base_curr]))
        self._dropdown_curr_curr.clear()
        self._dropdown_curr_curr.addItems(curr_codes)
        if default_curr not in curr_codes:
            default_curr = curr_codes[0]
        self._dropdown_curr_curr.setCurrentText(default_curr)
        self.refresh_dropdown_curr_change(default_curr)

    def refresh_dropdown_curr_change(self, curr_curr):
        self._curr_curr = curr_curr
        self._market_symbol = self._CTMain._Crypto_Trader.get_market_symbol(
            self._exchange, self._base_curr, curr_curr)

        self.initiate_widgets()

    def draw_view(self):
        self._order_book_widget = CTOrderBook(self._CTMain, None, None, None,
                                              None, self._order_book_depth)

        self.CandlestickSeries = QCandlestickSeries()
        self.CandlestickSeries.setIncreasingColor(Qt.green)
        self.CandlestickSeries.setDecreasingColor(Qt.red)

        self.VolumeBarSeries = QCandlestickSeries()
        self.VolumeBarSeries.setBodyWidth(1.0)
        self.VolumeBarSeries.setIncreasingColor(Qt.green)
        self.VolumeBarSeries.setDecreasingColor(Qt.red)

        self._chart_view = CTChartView(self)
        self._chart_view_volume = QChartView(self)
        self._chart_view_volume.chart().legend().setVisible(False)

        exchanges = self._CTMain._Crypto_Trader.trader.keys()
        self._dropdown_exchange = Dropdown(exchanges, self._exchange)
        self._dropdown_exchange.activated[str].connect(
            self.refresh_dropdown_exchange_change)

        base_codes = sorted(self._CTMain._Crypto_Trader.trader[
            self._exchange]._active_markets.keys())
        self._dropdown_base_curr = Dropdown(base_codes, self._base_curr)
        self._dropdown_base_curr.activated[str].connect(
            self.refresh_dropdown_base_change)

        curr_codes = sorted(self._CTMain._Crypto_Trader.trader[
            self._exchange]._active_markets[self._base_curr].keys())
        self._dropdown_curr_curr = Dropdown(curr_codes, self._curr_curr)
        self._dropdown_curr_curr.activated[str].connect(
            self.refresh_dropdown_curr_change)

        label_lookback = QLabel("Lookback:")
        self._chart_dropdown_lookback = Dropdown(
            list(self._CTMain._settings['Chart Lookback Window']),
            self._chart_lookback)
        self._chart_dropdown_lookback.currentTextChanged.connect(
            self.draw_chart)
        label_interval = QLabel("Interval:")
        self._chart_dropdown_interval = Dropdown(
            list(self._CTMain._settings['Chart Interval']),
            self._chart_interval)
        self._chart_dropdown_interval.currentTextChanged.connect(
            self.draw_chart)

        self._market_symbol = self._CTMain._Crypto_Trader.get_market_symbol(
            self._exchange, self._base_curr, self._curr_curr)
        self._trade_widget = CTTradeWidget(self._CTMain, self._exchange,
                                           self._base_curr, self._curr_curr,
                                           self._market_symbol)
        self._open_orders_widget = CTOpenOrdersWidget(self._CTMain,
                                                      self._exchange,
                                                      self._market_symbol)
        self._recent_trades_widget = CTRecentTradesWidget(
            self._CTMain, self._exchange, self._base_curr, self._curr_curr,
            self._market_symbol)
        self.refresh_dropdown_exchange_change(self._exchange, self._base_curr,
                                              self._curr_curr)

        label_exchange = QLabel("&Exchange:")
        label_exchange.setBuddy(self._dropdown_exchange)
        label_base_curr = QLabel("&Base:")
        label_base_curr.setBuddy(self._dropdown_base_curr)
        label_curr_curr = QLabel("&Currency:")
        label_curr_curr.setBuddy(self._dropdown_curr_curr)

        self._debug_button = QPushButton()
        self._debug_button.setText("Debug")
        self._debug_button.clicked.connect(self.debug)

        top_layout = QHBoxLayout()
        top_layout.addWidget(label_exchange)
        top_layout.addWidget(self._dropdown_exchange)
        top_layout.addWidget(label_base_curr)
        top_layout.addWidget(self._dropdown_base_curr)
        top_layout.addWidget(label_curr_curr)
        top_layout.addWidget(self._dropdown_curr_curr)
        top_layout.addWidget(label_lookback)
        top_layout.addWidget(self._chart_dropdown_lookback)
        top_layout.addWidget(label_interval)
        top_layout.addWidget(self._chart_dropdown_interval)
        top_layout.addWidget(self._debug_button)
        top_layout.addStretch(1)

        self._layout.addLayout(top_layout, 0, 0, 1, 10)
        self._splitter_top = QSplitter(Qt.Horizontal)
        self._splitter_left = QSplitter(Qt.Vertical)
        self._splitter_left.addWidget(self._order_book_widget)
        self._splitter_left.addWidget(self._recent_trades_widget)
        self._splitter_left.addWidget(self._trade_widget)
        self._splitter_left.setSizes([500, 100, 100])

        self._splitter_right = QSplitter(Qt.Vertical)
        self._splitter_right.addWidget(self._chart_view)
        self._splitter_right.addWidget(self._chart_view_volume)
        self._splitter_right.addWidget(self._open_orders_widget)
        self._splitter_right.setSizes([500, 100, 100])

        self._splitter_top.addWidget(self._splitter_left)
        self._splitter_top.addWidget(self._splitter_right)
        window_width = self._CTMain.frameGeometry().width()
        self._splitter_top.setSizes(
            [round(0.3 * window_width),
             round(0.7 * window_width)])
        self._layout.addWidget(self._splitter_top, 1, 0, 9, 10)

    @staticmethod
    def change_style(style_name):
        QApplication.setStyle(QStyleFactory.create(style_name))

    def debug(self):
        import ipdb
        ipdb.set_trace()

    # def refresh(self):
    #     t = threading.Thread(target = self.refresh_widgets)
    #     t.start()
    #     t.join(1)

    def initiate_widgets(self):
        self._order_book_widget.refresh_order_book(self._exchange,
                                                   self._market_symbol,
                                                   self._base_curr,
                                                   self._curr_curr)
        self._trade_widget.update_currencies(self._exchange, self._base_curr,
                                             self._curr_curr,
                                             self._market_symbol)
        self._open_orders_widget.update_market(self._exchange,
                                               self._market_symbol)
        self._recent_trades_widget.update_market(self._exchange,
                                                 self._base_curr,
                                                 self._curr_curr,
                                                 self._market_symbol)
        self.draw_chart()

    def draw_chart(self):
        exchange = self._exchange
        market_symbol = self._market_symbol
        interval_name = self._chart_dropdown_interval.currentText()
        lookback_name = self._chart_dropdown_lookback.currentText()
        interval = self._CTMain._settings['Chart Interval'][interval_name]
        lookback = self._CTMain._settings['Chart Lookback Window'][
            lookback_name]

        load_chart = self._CTMain._Crypto_Trader.trader[
            exchange].load_chart_data(market_symbol, interval, lookback)

        self.CandlestickSeries.clear()
        self.VolumeBarSeries.clear()
        ch_min = load_chart[0][3]
        ch_max = load_chart[0][2]
        t_min = load_chart[0][0]
        t_max = load_chart[0][0]
        v_max = load_chart[0][6]

        for point in load_chart:
            candle = CTCandlestickSet(point[0] * 1000, point[1], point[2],
                                      point[3], point[4], point[5], point[6],
                                      self)
            self.CandlestickSeries.append(candle)
            ch_min = min(ch_min, point[3])
            ch_max = max(ch_max, point[2])
            t_min = min(t_min, point[0])
            t_max = max(t_max, point[0])
            v_max = max(v_max, point[6])

        min_y = max(0, ch_min - 0.15 * (ch_max - ch_min))
        max_y = ch_max + 0.1 * (ch_max - ch_min)

        max_volume = 0
        for point in load_chart:
            # high = min_y + 0.1 * (max_y - min_y)  * point[6] / v_max
            # low = min_y
            v_low = 0
            v_high = point[6]
            max_volume = max(max_volume, point[6])
            if point[4] >= point[1]:
                v_open = v_low
                v_close = v_high
            else:
                v_open = v_high
                v_close = v_low
            volume_candle = QCandlestickSet(v_open, v_high, v_low, v_close,
                                            point[0] * 1000, self)
            self.VolumeBarSeries.append(volume_candle)

        if not self._chart_view._chart_loaded:
            self._chart_view.chart.addSeries(self.CandlestickSeries)
            self._chart_view_volume.chart().addSeries(self.VolumeBarSeries)
            self._chart_view._chart_loaded = True

        axis_x = QDateTimeAxis()
        axis_x.setFormat("dd-MM-yyyy h:mm")
        axis_x.setRange(datetime.fromtimestamp(int(t_min) - 30 * interval),
                        datetime.fromtimestamp(int(t_max) + 30 * interval))
        self._chart_view.chart.setAxisX(axis_x, self.CandlestickSeries)

        axis_y = QValueAxis()
        axis_y.setRange(min_y, max_y)
        self._chart_view.chart.setAxisY(axis_y, self.CandlestickSeries)

        axis_x2 = QDateTimeAxis()
        axis_x2.setFormat("dd-MM-yyyy h:mm")
        axis_x2.setRange(datetime.fromtimestamp(int(t_min) - 30 * interval),
                         datetime.fromtimestamp(int(t_max) + 30 * interval))
        self._chart_view_volume.chart().setAxisX(axis_x2, self.VolumeBarSeries)

        axis_y2 = QValueAxis()
        axis_y2.setRange(0, max_volume)
        self._chart_view_volume.chart().setAxisY(axis_y2, self.VolumeBarSeries)
Пример #11
0
class VolumeFigure:
    def __init__(self, name):
        self.chart_volume_view = QChartView()
        self.chart_volume_view.chart().setLocalizeNumbers(True)
        self.volume_series = QCandlestickSeries()

        self.volume_time_axis = QDateTimeAxis()
        self.volume_time_axis.setFormat('h:mm')
        self.volume_axis = QValueAxis()

        self.volume_average_series = QLineSeries()

        self.chart_volume_view.chart().addSeries(self.volume_series)
        self.chart_volume_view.chart().addSeries(self.volume_average_series)

        self.chart_volume_view.chart().addAxis(self.volume_time_axis,
                                               Qt.AlignBottom)
        self.chart_volume_view.chart().addAxis(self.volume_axis, Qt.AlignLeft)
        self.chart_volume_view.chart().legend().hide()
        self.chart_volume_view.setRenderHint(QPainter.Antialiasing)

    def in_datetime_range(self, q):
        return self.datetime_range[0] < q < self.datetime_range[1]

    def get_chart_view(self):
        return self.chart_volume_view

    def clear_series_data(self):
        self.volume_series.clear()
        self.volume_average_series.clear()

    def set_volume_average(self, vol):
        self.volume_average_series.append(self.datetime_range[0], vol)
        self.volume_average_series.append(self.datetime_range[1], vol)

    def set_datetime(self, d):
        self.chart_datetime = d
        self.datetime_range = (d.timestamp() * 1000,
                               d.replace(hour=23, minute=59).timestamp() *
                               1000)
        start_time = QDateTime()
        until_time = QDateTime()
        start_time.setDate(QDate(d.year, d.month, d.day))
        until_time.setDate(QDate(d.year, d.month, d.day))
        start_time.setTime(QTime(9, 0))
        until_time.setTime(QTime(16, 0))
        self.volume_time_axis.setRange(start_time, until_time)

    def add_volume_data(self, q, volume):
        if self.in_datetime_range(q):
            self.volume_series.append(QCandlestickSet(0, volume, 0, volume, q))

    def attach(self):
        self.volume_time_axis.setTickCount(7)
        self.volume_average_series.attachAxis(self.volume_axis)
        self.volume_average_series.attachAxis(self.volume_time_axis)
        self.volume_series.attachAxis(self.volume_axis)
        self.volume_series.attachAxis(self.volume_time_axis)

    def set_max(self, vol):
        self.volume_axis.setRange(0, vol)
Пример #12
0
class Example(QMainWindow):
    def __init__(self, ):
        super().__init__()
        self.bijiao = [0, 0, 0]

        self.res = ""
        self.queue = []
        self.k = -1
        self.flag = -1

        try:
            self.initUI()
            self.chart_init(10)
        except:
            traceback.print_exc()

    def initUI(self):

        icon = QtGui.QIcon()
        icon.addPixmap(
            QtGui.QPixmap("D:\\Sysytem\\Desktop\\zhong\\data\\ico.ico"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.setWindowIcon(icon)

        self.resize(1000, 700)
        self.setWindowTitle('Icon')

        self.setObjectName("清华大学得不到的学生")
        self.setWindowTitle("一枚小乖乖~")
        self.label = QLabel(self)
        self.label.setWindowTitle("清华大学得不到的学生")
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)

        self.label.setGeometry(QtCore.QRect(15, 15, 970, self.height() - 30))
        self.label.setText("")
        palette = QtGui.QPalette()

        self.label.setStyleSheet("background-color: #fff;border-radius: 15px;")
        self.labelshadow = QGraphicsDropShadowEffect(self)
        self.labelshadow.setBlurRadius(15)
        self.labelshadow.setOffset(1, 1)
        self.label.setGraphicsEffect(self.labelshadow)

        self.label.setScaledContents(True)
        self.label.setObjectName("label")

        self.pushButton_12 = QtWidgets.QPushButton(self)
        self.pushButton_12.setGeometry(
            QtCore.QRect(self.width() - 55, 29, 20, 20))
        self.pushButton_12.setStyleSheet(
            "QPushButton{\n"
            "    background:#fc625d;\n"
            "    color:white;\n"
            "    box-shadow: 1px 1px 3px rgba(0,0,0,0.3);font-size:20px;border-radius: 10px;font-family: 微软雅黑;\n"
            "}\n"
            "QPushButton:hover{                    \n"
            "    background:#FF2D2D;\n"
            "}\n"
            "QPushButton:pressed{\n"
            "    border: 1px solid #3C3C3C!important;\n"
            "    background:#AE0000;\n"
            "}")
        self.pushButton_12.clicked.connect(self.close)

        self.pushButton_14 = QtWidgets.QPushButton(self)
        self.pushButton_14.setGeometry(
            QtCore.QRect(self.width() - 55 - 35, 29, 20, 20))
        self.pushButton_14.setStyleSheet(
            "QPushButton{\n"
            "    background:#35cd4b;\n"
            "    color:white;\n"
            "    box-shadow: 1px 1px 3px rgba(0,0,0,0.3);font-size:20px;border-radius: 10px;font-family: 微软雅黑;\n"
            "}\n"
            "QPushButton:hover{                    \n"
            "    background:#00CC00;\n"
            "}\n"
            "QPushButton:pressed{\n"
            "    border: 1px solid #3C3C3C!important;\n"
            "    background:#009900;\n"
            "}")
        self.pushButton_14.clicked.connect(self.showMinimized)

        self.color = ["#e89291", "#c4b98b", "#81a8e1", "#8cc9c4", "#83bde2"]
        # -----------------------------------------------------------------测试数量------------------------
        error = QtWidgets.QLineEdit(self)
        error.setGeometry(QtCore.QRect(70, 70, 150, 50))
        error.setStyleSheet(
            "text-align: center;background-color: " + self.color[0] +
            ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;"
        )
        errorshadow = QGraphicsDropShadowEffect(self)
        error.setPlaceholderText("测试数量")
        errorshadow.setBlurRadius(30)
        cl = QColor("#cacaca")
        errorshadow.setColor(cl)
        error.setAlignment(Qt.AlignCenter)
        errorshadow.setOffset(0, 0)
        error.textChanged.connect(self.set_suliang)
        # error.setGraphicsEffect(errorshadow)

        # -----------------------------------------------------------------随机范围------------------------

        fan = QtWidgets.QLineEdit(self)
        fan.setGeometry(QtCore.QRect(240, 70, 150, 50))
        fan.setStyleSheet(
            "text-align: center;background-color: " + self.color[2] +
            ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;"
        )
        fanshadow = QGraphicsDropShadowEffect(self)
        fanshadow.setBlurRadius(30)
        fancl = QColor("#cacaca")
        fan.setPlaceholderText("随机范围")
        fanshadow.setColor(fancl)
        fan.setAlignment(Qt.AlignCenter)
        fanshadow.setOffset(0, 0)
        fan.textChanged.connect(self.set_fanwei)
        # fan.setGraphicsEffect(fanshadow)

        # -----------------------------------------------------------------内存块数-----------------------

        kuai = QtWidgets.QLineEdit(self)
        kuai.setGeometry(QtCore.QRect(410, 70, 150, 50))
        kuai.setStyleSheet(
            "text-align: center;background-color: " + self.color[3] +
            ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;"
        )
        kuaishadow = QGraphicsDropShadowEffect(self)
        kuaishadow.setBlurRadius(30)
        kuaicl = QColor("#cacaca")
        kuai.setPlaceholderText("内存块数")
        kuaishadow.setColor(kuaicl)
        kuai.setAlignment(Qt.AlignCenter)
        kuaishadow.setOffset(0, 0)
        kuai.textChanged.connect(self.set_kuai)
        # kuai.setGraphicsEffect(kuaishadow)

        self.Button = QtWidgets.QPushButton(self)
        self.Button.setGeometry(QtCore.QRect(580, 70, 150, 50))
        self.Button.setStyleSheet(
            "QPushButton{text-align: center;background-color: #83bde2;"
            "border-radius: 7px;border: 0px solid #000;color:#ffffff;"
            "font-size:20px;font-family: 微软雅黑;}" + "QPushButton:hover{ " +
            "    background-color: #9ad0d0;color: white;" + "}")
        Buttonshadow = QGraphicsDropShadowEffect(self)
        Buttonshadow.setBlurRadius(30)
        Buttoncl = QColor("#cacaca")
        self.Button.setText("执行")
        Buttonshadow.setColor(Buttoncl)
        Buttonshadow.setOffset(0, 0)
        # Button.setGraphicsEffect(Buttonshadow)
        self.Button.clicked.connect(self.on_click_start)

        self.avgflag = 0

        self.qq = QtWidgets.QPushButton(self)
        self.qq.setGeometry(QtCore.QRect(750, 70, 180, 50))
        self.qq.setStyleSheet(
            "color: #000;text-align: center;background-color: #f0f0f0;border-radius: 7px;border: 0px solid #000;font-size:14px;font-family: 微软雅黑;"
        )
        self.qq.clicked.connect(self.on_avg)

        self.show()

    def on_avg(self):
        if self.avgflag == 0:
            self.series.hide()

            self.serieslru.hide()

            self.seriesopt.hide()

            self.seriesfifoavg.show()

            self.serieslruavg.show()

            self.seriesoptavg.show()
            self.avgflag = 1
        else:

            self.series.show()

            self.serieslru.show()

            self.seriesopt.show()

            self.seriesfifoavg.hide()

            self.serieslruavg.hide()

            self.seriesoptavg.hide()
            self.avgflag = 0

    def set_kuai(self, text):
        self.kuai = text

    def set_fanwei(self, text):
        self.fan = text

    def set_suliang(self, text):
        self.su = text

    def hideerror(self):
        self.error.hide()

    def set_kuaishu(self, text):
        self.kuaishu = text

    def set_yemian(self, text):
        self.yemian = text

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate

    def mousePressEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.m_drag = True
            self.m_DragPosition = e.globalPos() - self.pos()
            e.accept()

    def mouseReleaseEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.m_drag = False

    def mouseMoveEvent(self, e):
        try:
            if Qt.LeftButton and self.m_drag:
                self.move(e.globalPos() - self.m_DragPosition)
                e.accept()
        except:
            print("错误代码:000x0")

    def on_click_start(self):
        try:
            self.jishu = 0
            self.thread = MyThread()
            self.thread.set_su(self.su)
            self.thread.set_kuai(self.kuai)
            self.thread.set_x(self.dtaxisX)
            self.thread.set_fan(self.fan)
            self.thread.det_bijiao(self.bijiao)
            self.dailist = []
            self.avg = []
            self.avg1 = []
            self.avg2 = []
            self.dailistlru = []
            self.dailistopt = []
            self.thread.sinOut.connect(self.change)
            self.thread.start()

            # self.qq.setText("FIFO:%0.2f   LRU:%0.2f \n OPT:%0.2f" % (self.bijiao[0], self.bijiao[1], self.bijiao[2]))

        except:
            traceback.print_exc()
        # self.sinOut.emit(self.dailist)
        # self.sinOut2.emit(self.dailistlru)
        # self.sinOut3.emit(self.dailistopt)

    def change(self, dailist):
        try:
            # print(dailist)
            # arr = str.split(dailist)
            # print(arr)

            flag = 0
            start = 0
            flag = dailist.find(" ", flag)
            flag = dailist.find(" ", flag + 1)
            end = flag
            arr = str.split(dailist[start:end])

            start = flag
            flag = dailist.find(" ", flag + 1)
            flag = dailist.find(" ", flag + 1)
            end = flag
            arr1 = str.split(dailist[start:end])

            start = flag
            flag = dailist.find(" ", flag + 1)
            flag = dailist.find(" ", flag + 1)
            end = flag
            arr2 = str.split(dailist[start:end])

            self.dailist.append(QPointF(float(arr[0]), float(arr[1])))

            self.dailistlru.append(QPointF(float(arr1[0]), float(arr1[1])))

            self.dailistopt.append(QPointF(float(arr2[0]), float(arr2[1])))
            #
            self.series.replace(self.dailist)
            self.serieslru.replace(self.dailistlru)
            self.seriesopt.replace(self.dailistopt)

            if self.jishu == 0:
                self.bijiao[0] = float(arr[1])
                self.bijiao[1] = float(arr1[1])
                self.bijiao[2] = float(arr2[1])
                self.jishu = 1
            else:
                self.bijiao[0] = (float(arr[1]) + self.bijiao[0]) / 2.0
                self.bijiao[1] = (float(arr1[1]) + self.bijiao[1]) / 2.0
                self.bijiao[2] = (float(arr2[1]) + self.bijiao[2]) / 2.0
                self.jishu = self.jishu + 1

            self.avg.append(QPointF(float(arr[0]), self.bijiao[0]))
            self.avg1.append(QPointF(float(arr[0]), self.bijiao[1]))
            self.avg2.append(QPointF(float(arr[0]), self.bijiao[2]))

            # print(self.avg)
            self.seriesfifoavg.replace(self.avg)
            self.serieslruavg.replace(self.avg1)
            self.seriesoptavg.replace(self.avg2)

            self.qq.setText("FIFO:%0.2f   LRU:%0.2f \n OPT:%0.2f" %
                            (self.bijiao[0], self.bijiao[1], self.bijiao[2]))
        except:
            traceback.print_exc()

    def drawLine(self):
        self.series.replace(self.dailist)
        # print("uiy")

    def chart_init(self, su):
        self.start_num = 0
        self.chart = QChartView(self)
        self.chart.setGeometry(50, 150,
                               self.width() - 100,
                               self.height() - 150 - 50)  # 设置charView位置、大小
        self.series = QSplineSeries()
        self.series.setName("FIFO")
        self.chart.chart().addSeries(self.series)

        pen = QPen(Qt.gray)
        pen.setWidth(2)
        self.serieslru = QSplineSeries()
        self.serieslru.setPen(pen)
        self.serieslru.setName("LRU")
        self.serieslru.setColor(QColor("#e89291"))
        self.chart.chart().addSeries(self.serieslru)

        pen2 = QPen(Qt.gray)
        pen2.setWidth(2)
        self.seriesopt = QSplineSeries()
        self.seriesopt.setPen(pen2)
        self.seriesopt.setColor(QColor("#3ea54f"))
        self.seriesopt.setName("OPT")
        self.chart.chart().addSeries(self.seriesopt)

        penfifo = QPen(Qt.gray)
        penfifo.setWidth(2)
        self.seriesfifoavg = QSplineSeries()
        self.seriesfifoavg.setPen(penfifo)
        self.seriesfifoavg.setName("FIFO-avg")
        self.seriesfifoavg.setColor(QColor("#209fdf"))
        self.chart.chart().addSeries(self.seriesfifoavg)
        self.seriesfifoavg.hide()

        penavg = QPen(Qt.gray)
        penavg.setWidth(2)
        self.serieslruavg = QSplineSeries()
        self.serieslruavg.setPen(penavg)
        self.serieslruavg.setName("LRU-avg")
        self.serieslruavg.setColor(QColor("#e89291"))
        self.chart.chart().addSeries(self.serieslruavg)
        self.serieslruavg.hide()

        pen2avg = QPen(Qt.gray)
        pen2avg.setWidth(2)
        self.seriesoptavg = QSplineSeries()
        self.seriesoptavg.setPen(pen2avg)
        self.seriesoptavg.setColor(QColor("#3ea54f"))
        self.seriesoptavg.setName("OPT-avg")
        self.chart.chart().addSeries(self.seriesoptavg)
        self.seriesoptavg.hide()

        self.dtaxisX = QValueAxis()
        self.vlaxisY = QValueAxis()
        self.dtaxisX.setMin(10)
        self.dtaxisX.setMax(100)
        self.vlaxisY.setMin(0)
        self.vlaxisY.setMax(100)
        self.dtaxisX.setTickCount(6)
        self.vlaxisY.setTickCount(11)
        self.dtaxisX.setTitleText("页数")
        self.vlaxisY.setTitleText("缺页率")
        self.vlaxisY.setGridLineVisible(False)
        self.chart.chart().addAxis(self.dtaxisX, Qt.AlignBottom)
        self.chart.chart().addAxis(self.vlaxisY, Qt.AlignLeft)
        self.series.attachAxis(self.dtaxisX)
        self.series.attachAxis(self.vlaxisY)

        self.serieslru.attachAxis(self.dtaxisX)
        self.serieslru.attachAxis(self.vlaxisY)

        self.seriesopt.attachAxis(self.dtaxisX)
        self.seriesopt.attachAxis(self.vlaxisY)

        self.seriesoptavg.attachAxis(self.dtaxisX)
        self.seriesoptavg.attachAxis(self.vlaxisY)
        self.serieslruavg.attachAxis(self.dtaxisX)
        self.serieslruavg.attachAxis(self.vlaxisY)
        self.seriesfifoavg.attachAxis(self.dtaxisX)
        self.seriesfifoavg.attachAxis(self.vlaxisY)

        self.chart.chart().setTitleBrush(QBrush(Qt.cyan))
        cc = QColor("#f0f0f0")
        self.chart.setBackgroundBrush(cc)
        self.chart.setStyleSheet(
            "QChartView{ background-color: #83bde2;border-radius: 20px;}")
        self.chart.show()
Пример #13
0
class My_Main_window(Ui_MainWindow, QWidget
                     ):  # 这里继承 QWidget 是因为 QFileDialog 必须要有 QWidget 才能运行,没有会出错
    def setupBusi(self, MainWindow):

        # # 设置布局
        # self.verticalLayout.addWidget(self.label)
        # self.verticalLayout.addWidget(self.pushButton)

        # 设置连接事件
        self.pushButton.clicked.connect(self.plot_)
        self.pushButton_2.clicked.connect(self.pixSave)

        self.chart = QChart()
        self.view = QChartView(self.chart)
        self.series = QLineSeries(self.chart)  # 在QChart上实例化曲线
        self.verticalLayout.addWidget(self.view)
        self.view.show()

    def plot_(self):

        # 设置图片背景颜色,默认是白色背景;比如,还可以设置为:QChart.ChartThemeDark,QChart.ChartThemeLight,QChart.ChartThemeBlueCerulean
        # QChart.ChartThemeBrownSand,QChart.ChartThemeBlueNcs,QChart.ChartThemeHighContrast,QChart.ChartThemeBlueIcy等
        self.view.chart().setTheme(QChart.ChartThemeBlueCerulean)

        self.chart.setTitle("曲线图")  # 设置图题
        self.chart.setTitleFont(QFont('SansSerif', 20))  # 设置图题字体的类型和大小
        # self.view.chart().legend().hide()  # 隐藏图例
        self.chart.removeSeries(self.series)  # 清除QChart上的指定曲线
        self.series.append(0, 6)
        self.series.append(1, 7)
        self.series.append(2, 4)
        self.series.setName('单井生产数据')  # 设置每条数据曲线的名称
        self.view.chart().legend().setFont(QFont("Arial",
                                                 17))  # 设置数据曲线名称的字体类型和大小
        self.chart.addSeries(self.series)
        self.chart.createDefaultAxes()  # 创建默认轴
        self.chart.axisX().setTitleText('时间')  # 设置横坐标标题
        self.chart.axisX().setLabelsFont(QFont('SansSerif',
                                               13))  # 设置横坐标刻度的字体类型和大小
        self.chart.axisX().setTitleFont(QFont('SansSerif',
                                              15))  # 设置横坐标标题字体的类型和大小
        self.chart.axisY().setTitleText('产量')  # 设置横坐标标题
        self.chart.axisY().setLabelsFont(QFont('SansSerif',
                                               13))  # 设置横坐标刻度的字体类型和大小
        self.chart.axisY().setTitleFont(QFont('SansSerif',
                                              15))  # 设置横坐标标题字体的类型和大小

        # self.series.remove(0)  # 清除数据,但坐标框架等还在。
        # self.series.clear()  # 清除数据,但坐标框架等还在。

        self.view.setRenderHint(QPainter.Antialiasing)  # 抗锯齿
        # self.view.show()

    def pixSave(self):

        # 用 QFileDialog 获取保存文件的全部路径(包括文件名和后缀名)
        fileName2, ok2 = QFileDialog.getSaveFileName(self, "文件保存", "/",
                                                     "图片文件 (*.png);;(*.jpeg)")
        """
        下面用 Pyqt5 的截屏方法,截取指定 QChartView 上显示的东西;缺点,若显示的图像变形,
        则截图也会变形!
        """
        screen = QApplication.primaryScreen()
        pix = screen.grabWindow(self.view.winId())
        pix.save(fileName2)
Пример #14
0
class graficoBarras(QWidget):
    def __init__(self, parent=None):
        super(graficoBarras, self).__init__(parent)

        self.initUI()

    def initUI(self):

        comboBoxColor = QComboBox()
        comboBoxColor.addItems([
            "Color del fondo del CharView", "Color del fondo del Chart",
            "Color del título del Chart", "Color de las etiquetas del eje X",
            "Color de las etiquetas del eje Y",
            "Color de las etiquetas de la leyenda"
        ])

        checkBoxVisibilidadFondoChart = QCheckBox("Visibilidad fondo (chart)")
        checkBoxMargenesChart = QCheckBox("Margenes del chart")
        checkBoxEsquinasChart = QCheckBox("Esquinas del chart")

        buttonGuardar = QPushButton("Guardar gráfico")

        # Crear gráficos.
        self.vistaGrafico = QChartView(self.crearGraficoBarras())
        self.vistaGrafico.setSizePolicy(QSizePolicy.Ignored,
                                        QSizePolicy.Ignored)
        self.vistaGrafico.setRenderHint(QPainter.Antialiasing, True)

        # ========================== DISEÑO ==========================

        disenioConfiguracion = QVBoxLayout()
        disenioConfiguracion.addWidget(QLabel("Cambiar colores:"))
        disenioConfiguracion.addWidget(comboBoxColor)
        disenioConfiguracion.addWidget(checkBoxVisibilidadFondoChart)
        disenioConfiguracion.addWidget(checkBoxMargenesChart)
        disenioConfiguracion.addWidget(checkBoxEsquinasChart)
        disenioConfiguracion.setSpacing(4)
        disenioConfiguracion.addStretch()
        disenioConfiguracion.addWidget(buttonGuardar)

        baseDisenio = QGridLayout()
        baseDisenio.addLayout(disenioConfiguracion, 0, 0, 0, 1)
        baseDisenio.addWidget(self.vistaGrafico, 0, 1, 0, 4)
        baseDisenio.setSpacing(10)
        baseDisenio.setContentsMargins(10, 10, 10, 10)

        self.setLayout(baseDisenio)

        # ===================== CONECTAR SEÑALES =====================

        comboBoxColor.activated.connect(self.Color)
        checkBoxVisibilidadFondoChart.toggled.connect(
            self.visibilidadFondoChart)
        checkBoxMargenesChart.toggled.connect(self.margenesChart)
        checkBoxEsquinasChart.toggled.connect(self.esquinasChart)
        buttonGuardar.clicked.connect(self.Guardar)

        # Establecer los valores predeterminados
        comboBoxColor.setCurrentIndex(-1)
        checkBoxVisibilidadFondoChart.setChecked(True)
        checkBoxMargenesChart.setChecked(True)
        checkBoxEsquinasChart.setChecked(True)

# ========================== FUNCIONES ===========================

    def crearGraficoBarras(self):
        paises = [
            "EEUU", "China", "Japon", "Alemania", "Reino Unido",
            "Resto del mundo"
        ]
        valores = [24.32, 14.85, 8.91, 12.54, 7.85, 31.53]
        colores = [
            Qt.blue, Qt.red, Qt.darkYellow, Qt.gray, Qt.black, Qt.darkCyan
        ]

        grafico = QChart()
        grafico.setMargins(QMargins(30, 30, 30, 30))
        grafico.setTheme(QChart.ChartThemeLight)
        grafico.setTitle("% Distribución del PIB global")
        grafico.setAnimationOptions(QChart.SeriesAnimations)

        for i in range(len(paises)):
            series = QBarSeries()

            barSet = QBarSet(paises[i])
            barSet.setColor(colores[i])
            barSet.setLabelColor(Qt.yellow)
            barSet.append(valores[i])

            series.append(barSet)
            series.setLabelsVisible(True)
            series.setLabelsAngle(-90)
            # series.setLabelsPrecision(2)
            series.setLabelsFormat("@value %")
            series.setLabelsPosition(QAbstractBarSeries.LabelsCenter)

            grafico.addSeries(series)

        axisX = QBarCategoryAxis()
        axisX.append(paises)

        axisY = QValueAxis()
        axisY.setRange(0, 31.53)
        axisY.setTickCount(10)
        axisY.setLabelFormat("%.2f %")

        grafico.createDefaultAxes()
        grafico.setAxisX(axisX, None)
        grafico.setAxisY(axisY, None)

        grafico.legend().setVisible(True)
        grafico.legend().setAlignment(Qt.AlignBottom)

        return grafico

    def Color(self, item):
        if item == 0:
            color = (self.vistaGrafico.backgroundBrush().color()
                     if self.vistaGrafico.backgroundBrush().color().isValid()
                     else QColor(Qt.white))
        elif item == 1:
            color = (
                self.vistaGrafico.chart().backgroundBrush().color() if
                self.vistaGrafico.chart().backgroundBrush().color().isValid()
                else QColor(Qt.white))
        elif item == 2:
            color = (self.vistaGrafico.chart().titleBrush().color() if
                     self.vistaGrafico.chart().titleBrush().color().isValid()
                     else QColor(Qt.black))
        elif item == 3:
            color = (self.vistaGrafico.chart().axisX().labelsBrush().color()
                     if self.vistaGrafico.chart().axisX().labelsBrush().color(
                     ).isValid() else QColor(Qt.black))
        elif item == 4:
            color = (self.vistaGrafico.chart().axisY().labelsBrush().color()
                     if self.vistaGrafico.chart().axisY().labelsBrush().color(
                     ).isValid() else QColor(Qt.black))
        elif item == 5:
            color = (self.vistaGrafico.chart().legend().labelColor() if
                     self.vistaGrafico.chart().legend().labelColor().isValid()
                     else QColor(Qt.black))

        color = QColorDialog.getColor(color, self)
        if color.isValid():
            if item == 0:
                self.vistaGrafico.setBackgroundBrush(color)
            elif item == 1:
                self.vistaGrafico.chart().setBackgroundBrush(color)
            elif item == 2:
                self.vistaGrafico.chart().setTitleBrush(color)
            elif item == 3:
                self.vistaGrafico.chart().axisX().setLabelsBrush(color)
            elif item == 4:
                self.vistaGrafico.chart().axisY().setLabelsBrush(color)
            elif item == 5:
                self.vistaGrafico.chart().legend().setLabelColor(color)

    def visibilidadFondoChart(self, bool):
        self.vistaGrafico.chart().setBackgroundVisible(bool)

    def margenesChart(self, bool):
        if bool:
            self.vistaGrafico.chart().layout().setContentsMargins(9, 9, 9, 9)
        else:
            self.vistaGrafico.chart().layout().setContentsMargins(0, 0, 0, 0)

    def esquinasChart(self, bool):
        if bool:
            self.vistaGrafico.chart().setBackgroundRoundness(5)
        else:
            self.vistaGrafico.chart().setBackgroundRoundness(0)

    def Guardar(self):
        nombre, extension = QFileDialog.getSaveFileName(
            self,
            "Guardar como",
            "Gráfico de barras",
            "JPG (*.jpg);;PNG (*.png)",
            options=QFileDialog.Options())

        if nombre:
            guardar = QPixmap(self.vistaGrafico.grab())
            guardar.save(nombre, quality=100)

            if guardar:
                QMessageBox.information(self, "Guardar gráfico",
                                        "Gráfico guardado con éxito.",
                                        QMessageBox.Ok)
            else:
                QMessageBox.critical(self, "Guardar gráfico",
                                     "Error al guardar el gráfico.",
                                     QMessageBox.Ok)
Пример #15
0
class anaxcelhandler(QtWidgets.QMainWindow, anaxcelgui.Ui_MainWindow):
    def __init__(self, parent=None):
        super(anaxcelhandler, self).__init__(parent)
        if getattr(sys, 'frozen', False):
            self.frozen = 'ever so'
            self.bundle_dir = sys._MEIPASS
        else:
            self.bundle_dir = os.path.dirname(os.path.abspath(__file__))
        self.setupUi(self)
        self.setWindowIcon(QtGui.QIcon(self.bundle_dir + '/icons/icon.png'))
        self.setStyleSheet(open("Dark/darkstyle.qss", "r").read())
        self.listWidget.setSelectionMode(
            QtWidgets.QAbstractItemView.ExtendedSelection)
        self.pushButtonbrowse.clicked.connect(self.openFileNamesDialog)
        self.pushButtonclear.clicked.connect(self.clearwidget)
        self.pushButtonselall.clicked.connect(self.selectall)
        self.pushButtonload.clicked.connect(self.LoadProcess)
        self.statusbar.showMessage('V 0.1')
        self.actionExit.setShortcut('Ctrl+Q')
        self.actionExit.triggered.connect(self.close_application)
        self.actionExit.setStatusTip('Exit ')
        self.pixmaplab = QPixmap('icons/excel48.png')
        self.labelicon.setPixmap(self.pixmaplab)
        self.labelicon.show()
        self.label.setText("Loaded Excel File")
        self.comboBoxfiletype.addItems(['xls', ' xlsx'])
        self.pushButton_5.clicked.connect(self.analyseProcess)
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        layoutx = QVBoxLayout()
        layoutx.addWidget(self.toolbar)
        layoutx.addWidget(self.canvas)
        self.tab_6.setLayout(layoutx)
        self.layoutdout = QGridLayout()
        self.tab_4.setLayout(self.layoutdout)
        self.chartView3 = QChartView()
        self.layoutdout.addWidget(self.chartView3)
        self.actionAdd_File.setShortcut('Ctrl+A')
        self.actionAdd_File.triggered.connect(self.openFileNamesDialog)
        self.actionAdd_File.setStatusTip('Add File ')

        self.actionClear.setShortcut('Ctrl+C')
        self.actionClear.triggered.connect(self.clearwidget)
        self.actionClear.setStatusTip('Clear ')

        self.actionSelect_All.setShortcut('Ctrl+S')
        self.actionSelect_All.triggered.connect(self.selectall)
        self.actionSelect_All.setStatusTip('Sellect All ')

        self.actionLoad.setShortcut('Ctrl+L')
        self.actionLoad.triggered.connect(self.LoadProcess)
        self.actionLoad.setStatusTip('Load ')

        self.actionAbout.setShortcut('Ctrl+I')
        self.actionAbout.triggered.connect(self.showAbout)
        self.actionAbout.setStatusTip('About ')

    def showAbout(self):
        self.window = aboutmain.abouthandel()
        self.window.show()

    def close_application(self):
        choice = QtWidgets.QMessageBox.question(
            self, ' Confirm Exit ', "Are You Sure You want To Close Anaxcel ?",
            QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
        if choice == QtWidgets.QMessageBox.Yes:
            self.saveSettingstofilepackage()
            sys.exit()
        else:
            pass

    def openFileNamesDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        filterxls = "XLS (*.xls *.XLS)"
        filterxlsx = "XLSX (*.xlsx *.XLSX)"
        if self.comboBoxfiletype.currentIndex() == 0:
            files, _ = QFileDialog.getOpenFileNames(self,
                                                    "Select XLS Files",
                                                    filter=filterxls,
                                                    options=options)
            if files:
                for file in files:
                    self.listWidget.addItem(file)
        elif self.comboBoxfiletype.currentIndex() == 1:
            files, _ = QFileDialog.getOpenFileNames(self,
                                                    "Select XLSX Files",
                                                    filter=filterxlsx,
                                                    options=options)
            if files:
                for file in files:
                    self.listWidget.addItem(file)

    def clearwidget(self):
        self.listWidget.clear()
        self.tableWidget.clear()
        self.label.setText("Loaded Excel File")

    def selectall(self):
        self.listWidget.selectAll()

    # def CsvProcess(self):
    # # merge csv files
    # fout = open("combined.csv", "a")
    # items = self.listWidget.selectedItems()
    # xlsfiles = []
    # for i in list(items):
    #     xlsfiles.append(str(i.text()))
    # for line in open(xlsfiles[0]):
    #     fout.write(line)
    # for index in xlsfiles[1:]:
    #     print(index)
    #     # now the rest:
    #     f = open(index)
    #     f.__next__()  # skip the header
    #     for line in f:
    #         fout.write(line)
    #     f.close()  # not really needed
    # fout.close()

    # f = open("folder/02-08-2017.CSV")
    # for line in f:
    #     for x in line:
    #         if x == ';'
    #     line.split(';')
    #     print(line)
    #
    # f.close()  # not really needed

    def xlsProcess(self):
        self.tableWidget.clear()
        items = self.listWidget.selectedItems()
        xlsfiles = []
        for i in list(items):
            xlsfiles.append(i.text())
        wkbk = xlwt.Workbook()
        outsheet = wkbk.add_sheet('Sheet1')
        outrow_idx = 0
        for f in xlsfiles:
            insheet = xlrd.open_workbook(f).sheets()[0]
            for row_idx in range(insheet.nrows):
                for col_idx in range(insheet.ncols):
                    outsheet.write(outrow_idx, col_idx,
                                   insheet.cell_value(row_idx, col_idx))
                outrow_idx += 1
        wkbk.save(r'combined.xls')
        # use on_demand=True to avoid loading worksheet data into memory
        book = xlrd.open_workbook("combined.xls", on_demand=True)
        sheet = book.sheet_by_index(0)
        num_rows = sheet.nrows
        num_col = sheet.ncols
        self.tableWidget.setRowCount(num_rows)
        self.tableWidget.setColumnCount(num_col)
        for col in range(num_col):
            for row in range(num_rows):
                cell = sheet.cell(row, col)
                if (not cell.value == "") and (not cell.value == " "):
                    self.tableWidget.setItem(row, col,
                                             QTableWidgetItem(str(cell.value)))
        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.resizeRowsToContents()

    def xlsxprocess(self):
        self.tableWidget.clear()
        items = self.listWidget.selectedItems()
        xlsfiles = []
        xlsoutput = []
        c = 0
        for i in list(items):
            xlsfiles.append(str(i.text()))
        for xlsx_item in xlsfiles:
            wb = openpyxl.load_workbook(xlsx_item)
            pathname = "file" + str(c) + ".xls"
            wb.save(pathname)
            c += 1
            xlsoutput.append(str(pathname))
        wkbk = xlwt.Workbook()
        outsheet = wkbk.add_sheet('Sheet1')
        outrow_idx = 0
        for f in xlsoutput:
            print(f)
            insheet = xlrd.open_workbook(f).sheets()[0]
            for row_idx in range(insheet.nrows):
                for col_idx in range(insheet.ncols):
                    outsheet.write(outrow_idx, col_idx,
                                   insheet.cell_value(row_idx, col_idx))
                outrow_idx += 1
        wkbk.save(r'combined.xls')
        df = pd.read_excel('combined.xls',
                           header=0)  # read file and set header row
        self.tableWidget.setColumnCount(len(df.columns))
        self.tableWidget.setRowCount(len(df.index))
        for i in range(len(df.index)):
            for j in range(len(df.columns)):
                self.tableWidget.setItem(i, j,
                                         QTableWidgetItem(str(df.iat[i, j])))
        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.resizeRowsToContents()

    def LoadProcess(self):
        if self.comboBoxfiletype.currentIndex() == 0:  # xls
            self.xlsProcess()
            for colindex in range(self.tableWidget.columnCount()):
                self.comboBoxabsc.addItem(str(colindex))
                self.comboBoxordo.addItem(str(colindex))
        elif self.comboBoxfiletype.currentIndex() == 1:  # xlsx
            self.xlsxprocess()
            for colindex in range(self.tableWidget.columnCount()):
                self.comboBoxabsc.addItem(str(colindex))
                self.comboBoxordo.addItem(str(colindex))

    def analyseProcess(self):
        absc = []
        ordo = []
        absc.clear()
        ordo.clear()
        for tabrow in range(self.tableWidget.rowCount()):
            abscitem = self.tableWidget.item(tabrow,
                                             self.comboBoxabsc.currentIndex())
            ordoitem = self.tableWidget.item(tabrow,
                                             self.comboBoxordo.currentIndex())
            absc.append(int(abscitem.text()))
            ordo.append(str(ordoitem.text()))
        df = pd.DataFrame({'data': absc})
        df.index = ordo
        df = df.sort_values(by='data', ascending=False)
        df["cumpercentage"] = df["data"].cumsum() / df["data"].sum() * 100
        self.figure.clear()
        plt.ion()
        ax = self.figure.add_subplot()
        ax.bar(df.index, df["data"], color="C0")
        ax2 = ax.twinx()
        ax2.plot(df.index, df["cumpercentage"], color="C1", marker="D", ms=7)
        ax2.yaxis.set_major_formatter(PercentFormatter())
        ax.tick_params(axis="y", colors="C0")
        ax2.tick_params(axis="y", colors="C1")
        self.canvas.draw()
        # donutchart***********************************
        self.m_donuts = []
        self.chartView3.setRenderHint(QPainter.Antialiasing)
        self.chart3 = self.chartView3.chart()
        self.chart3.legend().setVisible(True)
        self.chart3.setTitle("Nested donuts Chart")
        self.chart3.setAnimationOptions(QChart.AllAnimations)
        minSize3 = 0.1
        maxSize3 = 0.9
        donutCount3 = 5
        for i in range(donutCount3):
            donut = QPieSeries()
            sliceCount = random.randrange(3, 6)
            # print(sliceCount)
            for j in range(sliceCount):
                value3 = random.randrange(0, 50)
                slice_ = QPieSlice(str(value3), value3)
                slice_.setLabelVisible(True)
                slice_.setLabelColor(Qt.white)
                slice_.setLabelPosition(QPieSlice.LabelInsideTangential)
                slice_.hovered[bool].connect(
                    functools.partial(self.explodeSlice, slice_=slice_))
                donut.append(slice_)
                donut.setHoleSize(minSize3 + i *
                                  (maxSize3 - minSize3) / donutCount3)
                donut.setPieSize(minSize3 + (i + 1) *
                                 (maxSize3 - minSize3) / donutCount3)
            self.m_donuts.append(donut)
            self.chartView3.chart().addSeries(donut)
        self.updateTimer = QTimer(self)
        self.updateTimer.timeout.connect(self.updateRotation)
        self.updateTimer.start(1250)
        self.tabWidget.setCurrentIndex(2)

    def updateRotation(self):
        for donut in self.m_donuts:
            phaseShift = random.randrange(-50, 100)
            donut.setPieStartAngle(donut.pieStartAngle() + phaseShift)
            donut.setPieEndAngle(donut.pieEndAngle() + phaseShift)

    def explodeSlice(self, exploded, slice_):
        if exploded:
            self.updateTimer.stop()
            sliceStartAngle = slice_.startAngle()
            sliceEndAngle = slice_.startAngle() + slice_.angleSpan()
            donut = slice_.series()
            seriesIndex = self.m_donuts.index(donut)
            for i in range(seriesIndex + 1, len(self.m_donuts)):
                self.m_donuts[i].setPieStartAngle(sliceEndAngle)
                self.m_donuts[i].setPieEndAngle(360 + sliceStartAngle)
        else:
            for donut in self.m_donuts:
                donut.setPieStartAngle(0)
                donut.setPieEndAngle(360)
            self.updateTimer.start()
        slice_.setExploded(exploded)
class Ui_SmainWindow(object):
   
    def setupUi(self, SmainWindow): 
        width = QDesktopWidget().screenGeometry().width()
        height = QDesktopWidget().screenGeometry().height()
        '''screen_resolution = app.desktop().screenGeometry()
                                width, height = screen_resolution.width(), screen_resolution.height()'''
        SmainWindow.setObjectName("SmainWindow")
        SmainWindow.resize((3400/3840)*width,(1700/2160)*height)
        SmainWindow.setMaximumSize(QtCore.QSize((3400/3840)*width,(1700/2160)*height))
        SmainWindow.setMinimumSize(QtCore.QSize((3400/3840)*width,(1700/2160)*height))
        self.centralwidget = QtWidgets.QWidget(SmainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect((20/3840)*width, (1070/2160)*height ,(3300/3840)*width, (30/2160)*height))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setLineWidth(5)
        self.line.setObjectName("line")

        self.line2 = QtWidgets.QFrame(self.centralwidget)
        self.line2.setGeometry(QtCore.QRect((1440/3840)*width, (290/2160)*height ,(30/3840)*width, (700/2160)*height))
        self.line2.setFrameShape(QtWidgets.QFrame.VLine)
        self.line2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line2.setLineWidth(5)
        self.line2.setObjectName("line2")

        self.line3 = QtWidgets.QFrame(self.centralwidget)
        self.line3.setGeometry(QtCore.QRect((2290/3840)*width, (290/2160)*height ,(30/3840)*width, (700/2160)*height))
        self.line3.setFrameShape(QtWidgets.QFrame.VLine)
        self.line3.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line3.setLineWidth(5)
        self.line3.setObjectName("line3")
       

        self.layout = QVBoxLayout(self.centralwidget)
        self.fig = Figure(figsize=((8/3840)*width, (6.5/2160)*height ))
        self.canvas = FigureCanvas(self.fig)
        self.layout.addWidget(self.canvas)

        self.widget = QWidget(self.centralwidget)
        #self.toolbar = NavigationToolbar(self.canvas, self.widget)
        self.layout.setMenuBar(NavigationToolbar(self.canvas,self.widget))
        self.widget.setLayout(self.layout)
        self.widget.setGeometry((1480/3840)*width,(290/2160)*height,(800/3840)*width,(600/2160)*height)
        
        
        
        
        
        #layout.addWidget(self.canvas)
        '''
        self.graphicsView = PlotWidget(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(700, 150, 700, 700))
        self.graphicsView.setObjectName("graphicsView")
        '''
        self.chartView = QChartView(self.centralwidget)
        self.chartView.setGeometry(QtCore.QRect((200/3840)*width, (1090/2160)*height, (1700/3840)*width, (500/2160)*height))
        self.chartView.setObjectName("graphicsView")


        self.browseFile = QtWidgets.QPushButton(self.centralwidget)
        self.browseFile.setGeometry(QtCore.QRect((200/3840)*width, (50/2160)*height, (350/3840)*width, (50/2160)*height))
        self.browseFile.setObjectName("browseFile")


        self.filenameLabel = QtWidgets.QLabel(self.centralwidget)
        self.filenameLabel.setGeometry(QtCore.QRect((700/3840)*width, (55/2160)*height, (350/3840)*width, (70/2160)*height))
        self.filenameLabel.setObjectName("filenameLabel")

        self.datasize = QtWidgets.QLabel(self.centralwidget)
        self.datasize.setGeometry(QtCore.QRect((20/3840)*width, (105/2160)*height, (350/3840)*width, (70/2160)*height))
        self.datasize.setObjectName("datasize")
        self.datasize.setText("Data Shape :")
        self.datasize.setStyleSheet(
        """QLabel {
                           font: bold;
                           font-size: 10pt;
                           font-family: Typograf;}""")

        self.datashape = QtWidgets.QLabel(self.centralwidget)
        self.datashape.setGeometry(QtCore.QRect((250/3840)*width, (105/2160)*height, (350/3840)*width, (70/2160)*height))
        self.datashape.setObjectName("datashape")
        self.datashape.setStyleSheet(
        """QLabel {
                           font: bold;
                           font-size: 12pt;
                           font-family: Typograf;}""")

        self.atributelabe = QtWidgets.QLabel(self.centralwidget)
        self.atributelabe.setGeometry(QtCore.QRect((295/3840)*width, (200/2160)*height, (350/3840)*width, (70/2160)*height))
        self.atributelabe.setObjectName("atributelabe")
        self.atributelabe.setText("Variables")
        self.atributelabe.setStyleSheet(
        """QLabel {
                           font: bold;
                           font-size: 10pt;
                           font-family: Typograf;}""")

        self.statisticlabel = QtWidgets.QLabel(self.centralwidget)
        self.statisticlabel.setGeometry(QtCore.QRect((1020/3840)*width, (200/2160)*height, (350/3840)*width, (70/2160)*height))
        self.statisticlabel.setObjectName("statisticlabel")
        self.statisticlabel.setText("Statistics")
        self.statisticlabel.setStyleSheet(
        """QLabel {
                           font: bold;
                           font-size: 10pt;
                           font-family: Typograf;}""")
        
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect((740/3840)*width, (290/2160)*height, (700/3840)*width, (700/2160)*height))
        self.textBrowser.setObjectName("textBrowser")
        self.textBrowser.setStyleSheet(
        """QTextBrowser {
                           font: bold;
                           font-size: 12pt;
                           font-family: Courier;}""")

        self.missingvalulabel = QtWidgets.QLabel(self.centralwidget)
        self.missingvalulabel.setGeometry(QtCore.QRect((2330/3840)*width, (500/2160)*height, (250/3840)*width, (100/2160)*height))
        self.missingvalulabel.setObjectName("missingvalulabel")
        self.missingvalulabel.setText("Show Missing \nValues")
        self.missingvalulabel.setStyleSheet(
        """QLabel {
                           font: bold;
                           font-size: 10pt;
                           font-family: Courier;}""")
        
        self.resetbtn = QtWidgets.QPushButton(self.centralwidget)
        self.resetbtn.setGeometry(QtCore.QRect((2330/3840)*width, (300/2160)*height, (250/3840)*width, (50/2160)*height))
        self.resetbtn.setObjectName("resetbtn")
        self.resetbtn.setText("Reset")
        self.resetbtn.setEnabled(False)

        self.perclm = QtWidgets.QPushButton(self.centralwidget)
        self.perclm.setGeometry(QtCore.QRect((2330/3840)*width, (600/2160)*height, (250/3840)*width, (50/2160)*height))
        self.perclm.setObjectName("perclm")
        self.perclm.setText("PerColumn")
        self.perclm.setEnabled(False)

        self.perrow = QtWidgets.QPushButton(self.centralwidget)
        self.perrow.setGeometry(QtCore.QRect((2330/3840)*width, (670/2160)*height, (250/3840)*width, (50/2160)*height))
        self.perrow.setObjectName("perrow")
        self.perrow.setText("PerRow")
        self.perrow.setEnabled(False)

        self.datainfo = QtWidgets.QLabel(self.centralwidget)
        self.datainfo.setGeometry(QtCore.QRect((2850/3840)*width, (200/2160)*height, (350/3840)*width, (70/2160)*height))
        self.datainfo.setObjectName("statisticlabel")
        self.datainfo.setText("Data Info")
        self.datainfo.setStyleSheet(
        """QLabel {
                           font: bold;
                           font-size: 10pt;
                           font-family: Typograf;}""")
        
        self.infor = QtWidgets.QTextBrowser(self.centralwidget)
        self.infor.setGeometry(QtCore.QRect((2600/3840)*width, (290/2160)*height, (700/3840)*width, (700/2160)*height))
        self.infor.setObjectName("infor")
        self.infor.setStyleSheet(
        """QTextBrowser {
                           font: bold;
                           font-family: Courier;}""")

       
       
        self.calstatistics = QtWidgets.QPushButton(self.centralwidget)
        self.calstatistics.setGeometry(QtCore.QRect((200/3840)*width, (1020/2160)*height, (350/3840)*width, (50/2160)*height))
        self.calstatistics.setObjectName("calstatistics")
        

        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect((20/3840)*width, (290/2160)*height, (700/3840)*width, (700/2160)*height))
        self.listWidget.setObjectName("listWidget")
        self.listWidget.setAlternatingRowColors(True)
       


        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect((1480/3840)*width,(120/2160)*height,(800/3840)*width,(50/2160)*height))
        self.comboBox.setObjectName("comboBox")

        self.comboBox2 = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox2.setGeometry(QtCore.QRect((1480/3840)*width,(200/2160)*height,(800/3840)*width,(50/2160)*height))
        self.comboBox2.setObjectName("comboBox2")

        self.report = QtWidgets.QPushButton(self.centralwidget)
        self.report.setGeometry(QtCore.QRect((1700/3840)*width, (1020/2160)*height, (300/3840)*width, (50/2160)*height))
        self.report.setObjectName("report")
        self.report.setText("Generate Report")



        self.back = QtWidgets.QPushButton(self.centralwidget)
        self.back.setGeometry(QtCore.QRect((5/3840)*width, (1600/2160)*height, (300/3840)*width, (50/2160)*height))
        self.back.setObjectName("back")
        self.back.setText("Back")
        self.back.setStyleSheet(
        """QPushButton {
                           
                             
border-radius:0;
border:0;

text-align:left;
padding-left:70px;
qproperty-icon:url('back.png');
qproperty-iconSize: 40px 40px;}""")






        SmainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(SmainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, (469/3840)*width, (22/2160)*height))
        self.menubar.setObjectName("menubar")
        SmainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(SmainWindow)
        self.statusbar.setObjectName("statusbar")
        SmainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(SmainWindow)
        QtCore.QMetaObject.connectSlotsByName(SmainWindow)

        




    def retranslateUi(self, SmainWindow):
        _translate = QtCore.QCoreApplication.translate
        SmainWindow.setWindowTitle(_translate("SmainWindow", "Data Statistical Analysis"))
        self.browseFile.setText(_translate("SmainWindow", "Open File"))
        self.browseFile.clicked.connect(self.pushButton_handler)
        self.filenameLabel.setText(_translate("SmainWindow", ""))
        self.calstatistics.setText(_translate("SmainWindow", "Calculate Statistics"))
        self.calstatistics.clicked.connect(self.cal)
        self.listWidget.clicked.connect(self.listview_clicked)

        self.resetbtn.clicked.connect(self.information)
        self.perclm.clicked.connect(self.num_missing)
        self.perrow.clicked.connect(self.row_missing)
        self.report.clicked.connect(self.generatereport)


            
        
        

    def pushButton_handler(self):
        self.open_dialog_box()

    def open_dialog_box(self):
        filename = QFileDialog.getOpenFileName(None, 'Open File', r"~/Desktop", '*.csv')
        path = filename[0]

        with open(path, "r") as fpath:
            self.infor.clear()
            self.comboBox.clear()
            self.comboBox2.clear()
            self.datasetheaders=[]
            self.filenameLabel.setText(str(path))
            self.filenameLabel.adjustSize()
            pandas.set_option('display.max_rows', None)
            self.dataset=pandas.read_csv(fpath)
            buf = io.StringIO()
            self.dataset.info(verbose=True, null_counts=True,buf=buf)
            s = buf.getvalue()
            self.perclm.setDisabled(False)
            self.perrow.setDisabled(False)

            self.infor.append(s)
            SIZE=self.dataset.shape
            self.datashape.setText(str(SIZE))
            self.create_piechart()
            #headers=self.dataset.columns
            self.datasetheaders=self.dataset.columns.to_numpy()
            self.listWidget.clear()
          
            for i in range(len(self.datasetheaders)-1):
                self.listWidget.insertItem(i,self.datasetheaders[i])

            for i in range(len(self.datasetheaders)-1):
                self.comboBox.addItem(self.datasetheaders[i])

            for i in range(len(self.datasetheaders)-1):
                self.comboBox2.addItem(self.datasetheaders[i])    
                
           

            self.setup()

            self.comboBox.currentIndexChanged.connect(self.setup)
            self.comboBox2.currentIndexChanged.connect(self.setup)

            #print(unique_headers)

            '''print ("Missing values per column:")
                                                print(self.dataset.apply(lambda x: sum(x.isnull()))) 
                                    '''


    def generatereport(self):
        try:
            profile = ProfileReport(self.dataset)
            profile.to_file(output_file="AnalysisReport.html")
            print("yes")
        except Exception as e:
            print(repr(e))

        
    def information(self):
        self.infor.clear()
        self.resetbtn.setEnabled(False)
        self.perrow.setDisabled(False)
        self.perclm.setDisabled(False)
        buf = io.StringIO()
        self.dataset.info(verbose=True, null_counts=True,buf=buf)
        s = buf.getvalue()

        self.infor.append(s)

      
            

            
        



    def row_missing(self):
        self.perrow.setEnabled(False)
        self.perclm.setDisabled(False)
        self.resetbtn.setDisabled(False)
        self.infor.clear()
       
        #self.infor.append(str(self.dataset.apply(lambda x: sum(x.isnull()))))
        self.infor.append(str(self.dataset.apply(self.missing, axis=1)))

        
    def num_missing(self):
        self.perclm.setEnabled(False)
        self.perrow.setDisabled(False)
        self.resetbtn.setDisabled(False)
        self.infor.clear()
        #self.infor.append(str(self.dataset.apply(lambda x: sum(x.isnull()))))
        self.infor.append(str(self.dataset.apply(self.missing, axis=0)))
         
    def missing(self,x):
        return sum(x.isnull())




         
 
    def setup(self):
        try:
            print("fig")
            iris=self.dataset 
        
       


            x_index = 0
            y_index = 1
            w=iris.iloc[:,self.comboBox.currentIndex()]
            z=iris.iloc[:,self.comboBox2.currentIndex()]

            y=iris.iloc[:,-1].values

            # this formatter will label the colorbar with the correct target names
            #formatter = plt.FuncFormatter(y)

            #plt.figure(figsize=(5, 4))
        
            ax = self.fig.add_subplot(111)
            ax.clear()
            scatter=ax.scatter(w, z, c=y)
        
            #self.figure.colorbar(ticks=y)

            #ax.xlabel("iris.feature_names[x_index]")
            #ax.ylabel("iris.feature_names[y_index]")
            ax.set_xlabel(self.comboBox.currentText(),  fontsize=25) 
            ax.set_ylabel(self.comboBox2.currentText(), fontsize=25)
            ax.set_title('Scatter Plot',fontsize=25)

            legend1 = ax.legend(*scatter.legend_elements(),
                    loc="lower left", title="Classes")
            ax.add_artist(legend1)

            self.widget.adjustSize()
        

            print("fig123456789")

        except Exception as e:
            print(repr(e)) 
               

        
        

        


    def cal(self):
        #self.graphicsView.clear()
        z=self.dataset
        w=z.iloc[:,self.a]
     
        self.textBrowser.setText("Mean:\n"+str(np.mean(w))+"\nMedian:\n"+str(np.median(w))+"\nMode:\n"+str(stats.mode(w))+"\nvariance:\n"+str(np.var(w))+"\nStdev:\n"+str(np.std(w)))
        #self.textBrowser.adjustSize()
        '''
        pen = pg.mkPen(color=(255, 0, 0),width=8)
        self.graphicsView.setBackground('w')
        self.graphicsView.plot(w,symbol='+',symbolSize=30, pen=pen)
        '''
       


    def listview_clicked(self):
        item=self.listWidget.currentRow()
        self.a=item

    def create_piechart(self):
       
        z=self.dataset
        w=z.iloc[:,-1]
        r=w.value_counts()
        p=r.to_numpy()
        y=w.nunique()
       
      
        df_val_counts = pandas.DataFrame(r)
        df_val_counts = df_val_counts.reset_index()
        df_val_counts.columns = ['unique_values', 'counts']
        
        w=df_val_counts.iloc[:,0].to_numpy()
        k=df_val_counts.iloc[:,1].to_numpy()
        res = w.astype(str)
       
        series = QPieSeries()
        for i in range(y):
            series.append(res[i], k[i])
        

        
        
        chart = self.chartView.chart()
        chart.removeAllSeries()
        chart.legend().hide()
        chart.addSeries(series)
        chart.createDefaultAxes()
        
        chart.setAnimationOptions(QChart.AllAnimations)
        chart.setTitle("Pie Chart")
        
        
        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignBottom)
      
        #self.chartView = QChartView(chart)
        self.chartView.setRenderHint(QPainter.Antialiasing)
Пример #17
0
class PriceFigure:
    def __init__(self, name):
        self.name = name
        self.chart_view = QChartView()

        self.price_time_axis = QDateTimeAxis()
        self.price_time_axis.setFormat('h:mm')

        self.price_axis = QValueAxis()
        self.candle_stick_series = QCandlestickSeries()
        self.candle_stick_series.setIncreasingColor(Qt.red)
        self.candle_stick_series.setDecreasingColor(Qt.blue)

        self.moving_average_series = QLineSeries()

        self.top_edge_series = QScatterSeries()
        self.bottom_edge_series = QScatterSeries()

        self.trend_lines = []
        self.short_top_trend_series = QLineSeries()
        self.short_bottom_trend_series = QLineSeries()
        self.long_top_trend_series = QLineSeries()
        self.long_bottom_trend_series = QLineSeries()
        self.trend_lines.append(self.short_top_trend_series)
        self.trend_lines.append(self.short_bottom_trend_series)
        self.trend_lines.append(self.long_top_trend_series)
        self.trend_lines.append(self.long_bottom_trend_series)

        self.chart_view.chart().addSeries(self.candle_stick_series)
        self.chart_view.chart().addSeries(self.moving_average_series)
        self.chart_view.chart().addSeries(self.top_edge_series)
        self.chart_view.chart().addSeries(self.bottom_edge_series)
        self.chart_view.chart().addSeries(self.short_top_trend_series)
        self.chart_view.chart().addSeries(self.long_top_trend_series)
        self.chart_view.chart().addSeries(self.short_bottom_trend_series)
        self.chart_view.chart().addSeries(self.long_bottom_trend_series)

        self.chart_view.chart().addAxis(self.price_time_axis, Qt.AlignBottom)
        self.chart_view.chart().addAxis(self.price_axis, Qt.AlignLeft)
        self.chart_view.chart().legend().hide()
        self.chart_view.setRenderHint(QPainter.Antialiasing)
        self.set_marker_color()
        self.set_trend_line_pen()

    def set_trend_line_pen(self):
        brushes = [
            QBrush(QColor(255, 0, 0, 90)),
            QBrush(QColor(0, 0, 255, 90)),
            QBrush(QColor(205, 56, 47, 255)),
            QBrush(QColor(0, 153, 213, 255))
        ]
        for i, tl in enumerate(self.trend_lines):
            tl.setPen(QPen(brushes[i], 4, Qt.DotLine))

    def set_marker_color(self):
        self.top_edge_series.setPen(Qt.black)
        self.top_edge_series.setBrush(QBrush(QColor(255, 0, 255, 90)))
        self.bottom_edge_series.setPen(Qt.black)
        self.bottom_edge_series.setBrush(QBrush(QColor(0, 255, 255, 90)))

    def set_datetime(self, d):
        self.chart_datetime = d
        self.datetime_range = (d.timestamp() * 1000,
                               d.replace(hour=23, minute=59).timestamp() *
                               1000)
        start_time = QDateTime()
        until_time = QDateTime()
        start_time.setDate(QDate(d.year, d.month, d.day))
        until_time.setDate(QDate(d.year, d.month, d.day))
        start_time.setTime(QTime(9, 0))
        until_time.setTime(QTime(16, 0))
        self.price_time_axis.setRange(start_time, until_time)

    def attach(self):
        self.price_time_axis.setTickCount(7)
        self.candle_stick_series.attachAxis(self.price_time_axis)
        self.candle_stick_series.attachAxis(self.price_axis)
        self.moving_average_series.attachAxis(self.price_time_axis)
        self.moving_average_series.attachAxis(self.price_axis)
        self.top_edge_series.attachAxis(self.price_time_axis)
        self.top_edge_series.attachAxis(self.price_axis)
        self.bottom_edge_series.attachAxis(self.price_time_axis)
        self.bottom_edge_series.attachAxis(self.price_axis)
        self.short_top_trend_series.attachAxis(self.price_time_axis)
        self.short_top_trend_series.attachAxis(self.price_axis)
        self.long_top_trend_series.attachAxis(self.price_time_axis)
        self.long_top_trend_series.attachAxis(self.price_axis)
        self.short_bottom_trend_series.attachAxis(self.price_time_axis)
        self.short_bottom_trend_series.attachAxis(self.price_axis)
        self.long_bottom_trend_series.attachAxis(self.price_time_axis)
        self.long_bottom_trend_series.attachAxis(self.price_axis)

    def in_datetime_range(self, q):
        return self.datetime_range[0] < q < self.datetime_range[1]

    def clear_series_data(self):
        self.candle_stick_series.clear()
        self.moving_average_series.clear()
        self.top_edge_series.clear()
        self.bottom_edge_series.clear()
        self.short_top_trend_series.clear()
        self.long_top_trend_series.clear()
        self.short_bottom_trend_series.clear()
        self.long_bottom_trend_series.clear()

    def get_chart_view(self):
        return self.chart_view

    def add_moving_average(self, q, price):
        if self.in_datetime_range(q):
            self.moving_average_series.append(q, price)

    def add_candle_stick(self, q, o, h, l, c):
        if self.in_datetime_range(q):
            self.candle_stick_series.append(QCandlestickSet(o, h, l, c, q))

    def set_price_range(self, price_min, price_max):
        self.price_axis.setRange(price_min, price_max)
        tick_count = int(
            math.ceil((price_max - price_min) / price_min * 100. / 2.0))
        self.price_axis.setTickCount(tick_count if tick_count + 1 > 2 else 2)

    def add_top_edge(self, q, price):
        if self.in_datetime_range(q):
            self.top_edge_series.append(q, price)

    def add_bottom_edge(self, q, price):
        if self.in_datetime_range(q):
            self.bottom_edge_series.append(q, price)

    def add_short_top_trend(self, q, price, draw_horizontal=False):
        if self.in_datetime_range(q):
            if draw_horizontal:
                self.short_top_trend_series.append(q, price)
                if self.name == 'yesterday':
                    self.short_top_trend_series.append(self.datetime_range[1],
                                                       price)
                else:
                    self.short_top_trend_series.append(self.datetime_range[0],
                                                       price)
            else:
                self.short_top_trend_series.append(q, price)

    def add_long_top_trend(self, q, price, draw_horizontal=False):
        if self.in_datetime_range(q):
            if draw_horizontal:
                self.long_top_trend_series.append(q, price)
                if self.name == 'yesterday':
                    self.long_top_trend_series.append(self.datetime_range[1],
                                                      price)
                else:
                    self.long_top_trend_series.append(self.datetime_range[0],
                                                      price)
            else:
                self.long_top_trend_series.append(q, price)

    def add_short_bottom_trend(self, q, price, draw_horizontal=False):
        if self.in_datetime_range(q):
            if draw_horizontal:
                self.short_bottom_trend_series.append(q, price)
                if self.name == 'yesterday':
                    self.short_bottom_trend_series.append(
                        self.datetime_range[1], price)
                else:
                    self.short_bottom_trend_series.append(
                        self.datetime_range[0], price)
            else:
                self.short_bottom_trend_series.append(q, price)

    def add_long_bottom_trend(self, q, price, draw_horizontal=False):
        if self.in_datetime_range(q):
            if draw_horizontal:
                self.long_bottom_trend_series.append(q, price)
                if self.name == 'yesterday':
                    self.long_bottom_trend_series.append(
                        self.datetime_range[1], price)
                else:
                    self.long_bottom_trend_series.append(
                        self.datetime_range[0], price)
            else:
                self.long_bottom_trend_series.append(q, price)