当呈现为小部件时,finplot 烛台图表不会在启动时呈现

finplot candlestick chart does not render on launch when rendered as a widget

我已将 finplot 烛台图作为小部件放置。启动后,它在应用程序的第一次呈现时显示为黑色。如果我缩小,它开始以最大缩放状态显示。我怎样才能在某种状态下启动它,以便显示图表内的所有蜡烛。以下是我的全部代码。

import sys

import finplot as fplt
import pandas as pd
import pyqtgraph as pg
import requests
from PyQt5.QtWidgets import *


# Creating the main window
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 - QTabWidget'
        self.left = 0
        self.top = 0
        self.width = 1200
        self.height = 800
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.tab_widget = MyTabWidget(self)
        self.setCentralWidget(self.tab_widget)

        self.show()

    # Creating tab widgets


class MyTabWidget(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)

        # Initialize tab screen
        self.tabs = QTabWidget()
        self.tabs.setTabPosition(QTabWidget.East)
        self.tabs.setMovable(True)

        self.tab1 = QWidget()

        self.tabs.resize(600, 400)

        # Add tabs
        self.tabs.addTab(self.tab1, "tab1")


        self.tab1.layout = QVBoxLayout(self)
        self.tab1.label = QLabel("USDT-BTC")
        
        self.tab1.fplt_widget = pg.PlotWidget(plotItem=fplt.create_plot_widget(self.window()))

        self.tab1.btn = QPushButton("Press me")

        # pull some data
        symbol = 'USDT-BTC'
        url = 'https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=%s&tickInterval=fiveMin' % symbol
        data = requests.get(url).json()

        # format it in pandas
        df = pd.DataFrame(data['result'])
        df = df.rename(columns={'T':'time', 'O':'open', 'C':'close', 'H':'high', 'L':'low', 'V':'volume'})
        df = df.astype({'time':'datetime64[ns]'})
        candles = df[['time','open','close','high','low']]


        fplt.candlestick_ochl(candles)

        self.tab1.layout.addWidget(self.tab1.label)
        self.tab1.layout.addWidget(self.tab1.fplt_widget)
        self.tab1.layout.addWidget(self.tab1.btn)
        self.tab1.setLayout(self.tab1.layout)

        # Add tabs to widget
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

这是我的应用启动时的样子:

这是缩小一卷时的样子

我想一上线就看到如下

感谢您发布问题的完整详细信息。

一切都差不多了。您只需要添加两件事:

  1. 在您的 App.__init 中,在调用 self.show() 之前添加以下行之一:
fplt.show(qt_exec=False)

或者只是

fplt.refresh()

任何一种选择都有效,因为在任何一种情况下都会调用 fplt.refresh()。这会自动缩放您的数据图,以及其他好处。

  1. 要使 refresh 调用在上述任一选项中起作用,您传递给 fplt.create_plot_widget 的 window 实例需要一个包含以下列表的 axs 属性您创建的 fplt 个小部件。在您的情况下,您将 fplt 小部件包装在 pg.PlotWidget 中,因此所需的小部件引用变为 self.tab1.fplt_widget.plotItem(注意那里的 .plotItem)。长话短说:在 MyTabWidget.__init__ 中插入此行,然后再将小部件添加到 self.tab1.layout:
self.window().axs = [self.tab1.fplt_widget.plotItem]

运行 您发布的经过上述更改的代码为我提供了您想要的初始绘图视图。