【问题标题】:Candlestick graph in tkinter canvas/frametkinter 画布/框架中的烛台图
【发布时间】:2022-12-10 11:24:14
【问题描述】:

我正在尝试将烛台图表创建到 tkinter 中。我有主窗口顶部,我正在特定位置创建一个框架 (graph_frame)。单击按钮后,我想将烛台图表放入该框架中。我正在运行以下代码,但不是将图表放入框架中,而是图表显示在 jupyter notebook 输出中。我想将此图表放入我的 tkinter 窗口和我创建的特定画布框架中。

from tkinter import * 
#import Pmw
import urllib.request
import urllib.parse
from datetime import date
from io import StringIO
import datetime 
from datetime import datetime
import requests
import pandas as pd
import arrow
import datetime
import sys
import json
import yfinance as yf
import plotly.graph_objects as go
import numpy as np
import csv
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import quandl as ql
from matplotlib import dates
%matplotlib inline
import matplotlib.dates as mpdates

from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk
import tkinter as tk
from tkinter import ttk
import mplfinance as mpf
import matplotlib.pyplot as plt
from mpl_finance import candlestick_ohlc
import pandas as pd
import matplotlib.dates as mpl_dates


top = tk.Tk()   
top.title("NASDAR Stock price range prediction system")
top.geometry("1350x840")


graph_frame = tk.Frame(top, height=350, width=500)

graph_frame.place(x=700,y=250) 
figure = plt.Figure(figsize=(12,8), dpi=50)
ax = figure.add_subplot(111)


df = yf.download('ba', period='500d', interval='1d')

df = df.tail(50)
df['Date'] = pd.to_datetime(df['Date'])
 
# apply map function
df['Date'] = df['Date'].map(mpdates.date2num)


fig, ax = plt.subplots()
fig = FigureCanvasTkAgg(fig, graph_frame)
 
# plotting the data
candlestick_ohlc(ax, df.values, width = 0.6,colorup = 'green', colordown = 'red', alpha = 0.8)
ohlc = df.loc[:, ['Date', 'Open', 'High', 'Low', 'Close']]
ohlc['Date'] = pd.to_datetime(ohlc['Date'])
ohlc['Date'] = ohlc['Date'].apply(mpl_dates.date2num)
ohlc = ohlc.astype(float)


ax.set_xlabel('Date')
ax.set_ylabel('Price')

# Formatting Date
date_format = mpl_dates.DateFormatter('%d-%m-%Y')
ax.xaxis.set_major_formatter(date_format)



ax.set_title('Candlestick chart')    

【问题讨论】:

  • 到目前为止你做了什么来尝试解决这个问题?当你在 jupyter notebook 之外(以及任何 ide 之外)运行它时会发生什么?那么它是否有效?您是否尝试过在笔记本顶部运行plt.ioff()?和/或您是否尝试过在笔记本顶部运行%matplotlib tkagg?请列出您尝试过的所有方法,以及每种方法的具体结果。
  • 我确实尝试了您提到的两个选项,还尝试了各种其他网站解决方案。但到目前为止还没有运气。我不是铁杆 python 开发人员,只是从事 PoC。所以,我需要的是如何只添加烛台图(请注意我可以在特定的框架中很容易地添加折线图、散点图 :))。谢谢,

标签: tkinter tkinter-canvas candlestick-chart


【解决方案1】:

遵循的代码有效,我能够在 tkinter 中将图形生成到我的特定框架中。 graph_frame 已在主函数的开头声明。

figure = plt.Figure(figsize=(3,4), dpi=100)

#data = yf.download(symbol, period='500d', interval='1d')

data = yf.download('ba', period='500d', interval='1d')
df = convert_to_dataframe_daily(data)
#df = return_data_frame()
df['Date'] = pd.to_datetime(df['Date'])
df['SMA5'] = df['Close'].rolling(5).mean()
df = df.tail(15)

     
    # apply map function
df['Date'] = df['Date'].map(mpdates.date2num)


figure, ax = plt.subplots()

fig = FigureCanvasTkAgg(figure, graph_frame)


ax.set_xlabel('Date')
ax.set_ylabel('Price')

    #fig.get_tk_widget().pack(side=tk.LEFT, fill=tk.BOTH)
fig.get_tk_widget().pack(side=tk.RIGHT)
 
        # plotting the data
candlestick_ohlc(ax, df.values, width = 0.6,colorup = 'green', colordown = 'red', alpha = 0.8)
ohlc = df.loc[:, ['Date', 'Open', 'High', 'Low', 'Close']]
#ohlc['Date'] = pd.to_datetime(ohlc['Date'])
#ohlc['Date'] = ohlc['Date'].apply(mpl_dates.date2num)
#ohlc = ohlc.astype(float)
print(ohlc.tail(10))


    #fig.suptitle('Daily Candlestick Chart of NIFTY50')

    # Formatting Date
date_format = mpl_dates.DateFormatter('%d-%m-%Y')
ax.xaxis.set_major_formatter(date_format)

ax.plot(df['Date'], df['EMA21'], color='green', label='EMA 21', linewidth=0.5)

ax.plot(df['Date'], df['EMA8'], color='blue', label='EMA 8', linewidth=0.5)

ax.plot(df['Date'], df['SMA200'], color='darkorange', label='SMA 200', linewidth=1.5)

    
ax.grid(True)

ax.set_title('Candlesticks with moving averages')
    

    
    ```

【讨论】:

    【解决方案2】:

    使用tkchart module(也在GitHub)。

    示例代码:

    import tkchart
    
    import tkinter
    
    root = tkinter.Tk()
    
    #create chart
    chart_1 = tkchart.LineChart(master=root,width=1000 ,height=600 
                             ,chart_line_len=80 ,sections=True 
                             ,sections_count=10 ,values_labels=True  
                             ,values_labels_count=5 ,
                             max_value = 100)
    chart_1.pack()
    
    
    #create lines  for chart
    line_1 = tkchart.Line(master=chart_1 ,color="#00ff00" ,height=4)
    line_2 = tkchart.Line(master=chart_1 ,height=4 ,color ="#ffff00")
    
    value = [x for x in range(0,100)]
    import random
    def display():
       chart_1.display(line=line_1 ,values=random.choices(value))
       chart_1.display(line=line_2 ,values=random.choices(value))
       root.after(500,display)
    display()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      相关资源
      最近更新 更多