Изображение в pyqtgraph скрыто из-за увеличения - PullRequest
1 голос
/ 28 апреля 2019

Я использую pyqtgraph для рисования свечей, но если я очень сильно увеличиваю график, изображение скрывается.

Я заметил, что при большом увеличении метод «рисования» перестает вызываться. Код с http просьбой об обмене ниже.

пример изображения

enter image description here

import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
from PyQt5 import QtWidgets

class CandlestickItem(QtWidgets.QGraphicsRectItem):
    def __init__(self, data):
        super(CandlestickItem, self).__init__()
        self.data = data
        self.generatePicture()

    def generatePicture(self):
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('w'))
        w = (self.data[1][0] - self.data[0][0]) / 3.
        for (t, open, close, min, max) in self.data:
            if max != min:
                p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
            if open > close:
                p.setBrush(pg.mkBrush('r'))
            else:
                p.setBrush(pg.mkBrush('g'))
            p.drawRect(QtCore.QRectF(t - w, open, w * 2, close - open))
        p.end()

    def paint(self, p, *args):
        print('paint call')
        p.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        return QtCore.QRectF(self.picture.boundingRect())


if __name__ == '__main__':
    import sys
    import urllib.request
    import json

    get_symbols_url = 'https://api.hitbtc.com/api/2/public/candles/BCNBTC?period=M30&limit=1000'
    response = urllib.request.urlopen(get_symbols_url)
    request_data = json.loads(response.read())
    data_list = []
    for i in range(0, len(request_data)):
        data_list.append((float(i), float(request_data[i]['open']), float(request_data[i]['close']),
                          float(request_data[i]['min']), float(request_data[i]['max'])))

    item = CandlestickItem(data_list)
    plt = pg.plot()
    plt.addItem(item)

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

Мне нужно отобразить очень маленькие значения, например, 0,0000001-0,00000015. Что можно сделать, чтобы предотвратить скрытие изображения при большом увеличении?

1 Ответ

0 голосов
/ 29 апреля 2019

Мне ответили на форуме поддержки, и это работает для меня. вопрос на форуме

Кажется, это ошибка округления.Нужно заменить метод boundingRect.

    # import numpy as np
    def boundingRect(self):
        data = np.array(self.data)
        xmin = data[:,0].min()
        xmax = data[:,0].max()
        ymin = data[:,1:].min()
        ymax = data[:,1:].max()
        return QtCore.QRectF(xmin, ymin, xmax-xmin, ymax-ymin)
...