Python 中可以实现快速蜡烛图吗

问题描述 投票:0回答:2

我尝试在 matplotlib 中绘制几千支蜡烛。 滚动图表时速度减慢(挂起)。

Eyllanesc 帮助我在 pyqt 中实现了烛台图。 该图很漂亮,而且比 matplotlib 运行得更快。

但是,图表在滚动时仍然会变慢。我稍微改变了代码。文件数据可在此处获取。

Python 中是否可以实现相对快速且数据量较大的烛台图?

事实上,我有一个 C# 项目,其中有数万根蜡烛,并且滚动速度更快。

拉我下线的数据。我真的需要很多蜡烛。 也许有一个函数可以使图表更快? (我不是批评任何人,我只是想解决这个问题。)

以下是 C# 图表的工作原理,包含超过 40,000 根蜡烛。我附上GIF动画。

C#

Python

from PyQt5 import QtCore, QtGui, QtWidgets, QtChart
import math
import numpy as np
import pandas as pd

df = pd.read_csv('file.txt',
                         index_col='DATE',
                         parse_dates=True,
                         infer_datetime_format=True)


o = df.iloc[:, 0].values
h = df.iloc[:, 1].values
l = df.iloc[:, 2].values
z = df.iloc[:, 3].values

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.step = 0.1
        self._chart_view = QtChart.QChartView()
        self.scrollbar = QtWidgets.QScrollBar(
            QtCore.Qt.Horizontal,
            sliderMoved=self.onAxisSliderMoved,
            pageStep=self.step * 100,
        )
        self.slider = QtWidgets.QSlider(
            QtCore.Qt.Horizontal, sliderMoved=self.onZoomSliderMoved
        )

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        lay = QtWidgets.QVBoxLayout(central_widget)
        for w in (self._chart_view, self.scrollbar, self.slider):
            lay.addWidget(w)

        self.resize(640, 480)

        self._chart = QtChart.QChart()

        self._candlestick_serie = QtChart.QCandlestickSeries()


        tm = []

        for i in range(0, len(z)):
            o_ = o[i]
            h_ = h[i]
            l_ = l[i]
            c_ = z[i]
            self._candlestick_serie.append(QtChart.QCandlestickSet(o_, h_, l_, c_))
            tm.append(str(i))
        min_x, max_x = 0, i

        self._chart.addSeries(self._candlestick_serie)
        self._chart.createDefaultAxes()
        self._chart.legend().hide()
        # self._chart.setAnimationOptions(QtChart.QChart.SeriesAnimations)

        self._chart.axisX(self._candlestick_serie).setCategories(tm)
        self._chart.axisX(self._candlestick_serie).setVisible(False)

        self._chart_view.setChart(self._chart)
        self.adjust_axes(100, 200)
        self.lims = np.array([min_x, max_x])

        self.onAxisSliderMoved(self.scrollbar.value())

    def adjust_axes(self, value_min, value_max):
        self._chart.axisX(self._candlestick_serie).setRange(
            str(value_min), str(value_max)
        )

        if value_min > 0 and value_max > 0 and value_max < 10000:
            ymin = np.amin(l[int(value_min): int(value_max)])
            ymax = np.amax(h[int(value_min): int(value_max)])
            self._chart.axisY(self._candlestick_serie).setRange(ymin, ymax)

    @QtCore.pyqtSlot(int)
    def onAxisSliderMoved(self, value):
        r = value / ((1 + self.step) * 100)
        l1 = self.lims[0] + r * np.diff(self.lims)
        l2 = l1 + np.diff(self.lims) * self.step
        self.adjust_axes(math.floor(l1), math.ceil(l2))

    @QtCore.pyqtSlot(int)
    def onZoomSliderMoved(self, value):
        self.step=value/100
        self.onAxisSliderMoved(self.scrollbar.value())
        print(value)

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
python pyqt
2个回答
3
投票

您可以尝试pyecharts。这是基于出色的 echarts 库,该库使用 Web 技术进行渲染。我认为这个库的性能在开源图表解决方案中是最先进的。而且它有很好的文档记录并且非常容易使用。具有一百万个点的交互式折线图可以在当前的笔记本电脑上顺利渲染。不过,没有测试烛台。


0
投票

可能。

对于任何与我们有同样问题并阅读本文的人,我将留下示例图像和上传包的链接。

虽然这篇文章已经有5年了,但我还是要留下回复。 我也尝试过 matplotlib,但速度很慢。 我像你一样尝试了 pyqt、pyqtraph 和 finplot,但它们比 matplotlib 更快,但更慢。

我想知道是否要尝试Python以外的语言,但我回到了matplotlib并尝试了一些新的东西。 并且成功了。

我在没有使用 pyqt 的情况下创建了一个快速烛台图。 这也可以与 tkinter 结合使用。

https://pypi.org/project/seolpyo-mplchart/

candlestick chart sample gif

© www.soinside.com 2019 - 2024. All rights reserved.