PyQtChart как сделать автоматическую масштабируемость по высоте?

Как сделать автоматическую масштабируемость по высоте если новая свеча выше/ниже текущего диапазона?

А так же, как сделать так, чтобы на экране было максимум 20 свечей и они просто сдвигались влево при появлении новой, а не ужимались.

import sys
from time import sleep
from PyQt5.QtChart import QCandlestickSeries, QChart, QChartView, QCandlestickSet
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import Qt, QPointF
from PyQt5 import QtChart as qc
from PyQt5 import QtCore, QtWidgets
import random

class MyThread(QtCore.QThread):
  mysignal = QtCore.pyqtSignal(str)
  def __init__(self, parent=None):
    QtCore.QThread.__init__(self, parent)

  def run(self):
    for i in range(1, 100):
      sleep(0.05)
      #Передача данных из потока через сигнал
      self.mysignal.emit(str(i))

def addBar(s):
  barOpen = random.randint(100, 200)
  barLow = barOpen - random.randint(50, 100)
  barHigh = barOpen + random.randint(50, 100)
  barClose = barOpen - random.randint(-50, 50)
  barMA = barOpen - random.randint(-50, 50)

  series.append(QCandlestickSet(barOpen, barHigh, barLow, barClose))
  ma5.append(QPointF(int(s), barMA))
  tm.append(str(s))
  chart.axisX(series).setCategories(tm)

app = QApplication(sys.argv)
#
series = QCandlestickSeries()
series.setDecreasingColor(Qt.red)
series.setIncreasingColor(Qt.green)

ma5 = qc.QLineSeries()  # 5-days average data line
tm = []  # stores str type data

barOpen = random.randint(100, 200)
barLow = barOpen - random.randint(50, 100)
barHigh = barOpen + random.randint(50, 100)
barClose = barOpen - random.randint(-50, 50)
barMA = barOpen - random.randint(-50, 50)

series.append(QCandlestickSet(barOpen, barHigh, barLow, barClose))
ma5.append(QPointF(int(0), barMA))
tm.append(str(0))

chart = QChart()

chart.addSeries(series)  # candle
chart.addSeries(ma5)  # ma5 line

chart.createDefaultAxes()
chart.legend().hide()

chart.axisX(series).setCategories(tm)
chart.axisX(ma5).setVisible(True)
chart.axisX().setLabelsAngle(-90)
chartview = QChartView(chart)
ui = QMainWindow()
mythread = MyThread()
mythread.start()
mythread.mysignal.connect(addBar, QtCore.Qt.QueuedConnection)

ui.setGeometry(50, 50, 500, 300)
ui.setCentralWidget(chartview)
ui.show()
sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Не уверен, что правильно вас понял, но думаю, что это вам поможет:

import sys
from random import randint
from PyQt5.QtChart import QCandlestickSeries, QChart, QChartView, QCandlestickSet
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import Qt, QPointF, QTimer, QThread, pyqtSignal
from PyQt5 import QtChart as qc


class MyThread(QThread):
    mysignal = pyqtSignal(int)

    def __init__(self, parent=None):
        QThread.__init__(self, parent)

    def run(self):
        for i in range(21, 101):
            self.mysignal.emit(i)
            self.msleep(500)


def addBar(n):
    barOpen  = randint(100, 200)
    barLow   = barOpen - randint(50, 100)
    barHigh  = barOpen + randint(50, 100)
    barClose = barOpen - randint(-50, 50)
    barMA    = barOpen - randint(-50, 50)

    if n < 21:
        series.append(QCandlestickSet(barOpen, barHigh, barLow, barClose)) 
        ma5.append(QPointF(n, barMA))
        tm.append(str(n))
    else: 
        series.remove(series.sets()[0])
        series.append(QCandlestickSet(barOpen, barHigh, barLow, barClose)) 
        ma5.append(QPointF(n, barMA))
        tm.pop(0)
        tm.append(str(n))        
        chart.axisX(series).setCategories(tm)


app = QApplication(sys.argv)

series = QCandlestickSeries()
series.setDecreasingColor(Qt.red)
series.setIncreasingColor(Qt.green)

ma5 = qc.QLineSeries()  
tm = []                 

for n in range(1, 21):
    addBar(n)

chart = QChart()
chart.addSeries(series)  
chart.setAnimationOptions(QChart.SeriesAnimations)
chart.createDefaultAxes()
chart.legend().hide()
chart.axisX(series).setCategories(tm)
chart.axisX().setLabelsAngle(-90)

chartview = QChartView(chart)

ui = QMainWindow()
mythread = MyThread()
mythread.mysignal.connect(addBar, Qt.QueuedConnection)
mythread.start()

ui.setGeometry(450, 150, 800, 500)
ui.setCentralWidget(chartview)
ui.show()
sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка