pyqtgraph kline

axis必须放在widget之后定义

from PyQt5 import QtCore, QtGui
import pyqtgraph as pg
import numpy as np

from jaqs.data import DataView, RemoteDataService
import jaqs.util as jutil
from config.config_path import DATA_CONFIG_PATH, TRADE_CONFIG_PATH

data_config = jutil.read_json(DATA_CONFIG_PATH)
trade_config = jutil.read_json(TRADE_CONFIG_PATH)
ds = RemoteDataService()
ds.init_from_config(data_config)


class candle_stick_item(pg.GraphicsObject):
'''
传入的是df,index是数字,必须有datetime,open_pre...,volume
'''
    def __init__(self, data):
        pg.GraphicsObject.__init__(self)
        self.data = data.copy()
        self.generate_picture()

    def generate_picture(self):
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        w = 1.0 / 3.0
        for (t, x) in data.loc[:, ['open_pre', 'high_pre', 'low_pre', 'close_pre']].iterrows():
            if x.open_pre > x.close_pre:
                p.setBrush(pg.mkBrush('g'))
                p.setPen(pg.mkPen('g'))
            else:
                p.setBrush(pg.mkBrush('r'))
                p.setPen(pg.mkPen('r'))
            p.drawLine(QtCore.QPointF(t, x.high_pre), QtCore.QPointF(t, x.low_pre))
            p.drawRect(QtCore.QRectF(t - w, x.open_pre, 2 * w, x.close_pre - x.open_pre))
        p.end()

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

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


class DateAxis(pg.AxisItem):
    def __init__(self, axistick, *args, **kwargs):
        pg.AxisItem.__init__(self, *args, **kwargs)
        self.x_values = axistick[0]
        self.x_strings = axistick[1]

    def tickStrings(self, values, scale, spacing):
        strns = []
        for v in values:
            vs = v * scale
            if vs in self.x_values:
                i = np.abs(self.x_values-vs).argmin()
                vstr = self.x_strings[i]
            else:
                vstr = ''
            strns.append(vstr)
        return strns


def get_candel_widget(data):
    df = data.loc[data.volume != 0, :].reset_index(drop=True)
    candle = candle_stick_item(df)


    win = pg.GraphicsWindow()
    axistick = np.array([df.index, df.trade_date])
    stringaxis = DateAxis(axistick, orientation='bottom')
    plot = win.addPlot(axisItems={'bottom': stringaxis})
    plot.addItem(candle)
    return win


data, msg = ds.daily('002567.SZ', start_date=20180501, end_date=20180527)
data[['open_pre','high_pre','low_pre','close_pre']] = data[['open','high','low','close']]
win = get_candel_widget(data)

if __name__ == '__main__':
import sys

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

猜你喜欢

转载自blog.csdn.net/sxj_13121424706/article/details/80534245