当呈现为小部件时,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_())
这是我的应用启动时的样子:
这是缩小一卷时的样子
我想一上线就看到如下
感谢您发布问题的完整详细信息。
一切都差不多了。您只需要添加两件事:
- 在您的
App.__init
中,在调用 self.show()
之前添加以下行之一:
fplt.show(qt_exec=False)
或者只是
fplt.refresh()
任何一种选择都有效,因为在任何一种情况下都会调用 fplt.refresh()
。这会自动缩放您的数据图,以及其他好处。
- 要使
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]
运行 您发布的经过上述更改的代码为我提供了您想要的初始绘图视图。
我已将 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_())
这是我的应用启动时的样子:
这是缩小一卷时的样子
我想一上线就看到如下
感谢您发布问题的完整详细信息。
一切都差不多了。您只需要添加两件事:
- 在您的
App.__init
中,在调用self.show()
之前添加以下行之一:
fplt.show(qt_exec=False)
或者只是
fplt.refresh()
任何一种选择都有效,因为在任何一种情况下都会调用 fplt.refresh()
。这会自动缩放您的数据图,以及其他好处。
- 要使
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]
运行 您发布的经过上述更改的代码为我提供了您想要的初始绘图视图。