VScode,Anaconda環境で、python,kivy,matplotをつかって、チャートを表示したいです。
出ているエラー
AttributeError: 'Figure' object has no attribute 'fbind'
チャートではなく、グラフ表示はできました。
python
1from kivy.app import App 2from kivy.uix.boxlayout import BoxLayout 3 4import matplotlib.pyplot as plt 5import matplotlib 6 7 8# Kivy 上で Matplotlib を使うために必要な準備 9matplotlib.use('module://kivy.garden.matplotlib.backend_kivy') 10 11class MyApp(App): 12 def __init__(self, *args, **kwargs): 13 super().__init__(*args, *kwargs) 14 15 def build(self): 16 self.screen = BoxLayout() 17 fig, ax = plt.subplots() 18 x = [1,2,3,4] 19 y = [8,6,7,5] 20 ax.plot(x,y) 21 self.screen.add_widget(fig.canvas) 22 return self.screen 23 24if __name__ == '__main__': 25 MyApp().run()
ですが、株価のチャートではうまく動きません。
下記はネットで拾ったコードをクラスと関数の中に入れたものです。
python
1from kivy.app import App 2from kivy.uix.boxlayout import BoxLayout 3 4import matplotlib.pyplot as plt 5import matplotlib 6#-------------------------------- 7from os import close 8import pandas as pd 9from plotly.graph_objs import layout 10import yfinance as yf 11import plotly.graph_objs as go 12import datetime 13import matplotlib as mpl 14 15import numpy as np 16import plotly.express as px 17#-------------------------------- 18 19# Kivy 上で Matplotlib を使うために必要な準備 20matplotlib.use('module://kivy.garden.matplotlib.backend_kivy') 21 22class MyApp(App): 23 def __init__(self, *args, **kwargs): 24 super().__init__(*args, *kwargs) 25 26 def build(self): 27 self.screen = BoxLayout() 28 df = yf.download('wfc', 29 start=datetime.date(2018,1,1), 30 end=datetime.date.today(), 31 auto_adjust='id') 32 33 df['ma50'] = df['Close'].rolling(50).mean().shift() 34 df['ma200'] = df['Close'].ewm(200).mean().shift() 35 36 37 fig = go.Figure() 38 39 fig.add_trace(go.Scatter(x=df.index, 40 y=df.ma50, 41 name='MA50')) 42 fig.add_trace(go.Scatter(x=df.index, 43 y=df.ma200, 44 name='MA200')) 45 fig.add_trace(go.Candlestick(x=df.index, 46 open=df.Open, 47 high=df.High, 48 low=df.Low, 49 close=df.Close, 50 name='WFC')) 51 52 fig.update(layout_xaxis_rangeslider_visible = True) 53 self.screen.add_widget(fig) 54 55 return self.screen 56 57 58if __name__ == '__main__': 59 MyApp().run()
プログラミング初心者です。fbindが何なのか、調べてもわかりませんでした。
また、昨晩、kivyを使わないコードについて質問しましたが、未解決のままです。
fig.show()が機能しないといった内容です。
figはfigureの略だと思いますが、その件とは関係がありますか?よろしくお願いします。
ps:参照先のURLを表記すべきですが、いろいろしすぎてどこから引っ張ってきたかわからなくなってしまいました。
次回から記述いたします。ごめんなさい。
ps:fbbind()関数を使えばよいのではないかと思いましたが、どんな記述にすればよいかわかりません。
下記サイトで学習中です。。。
https://qiita.com/gotta_dive_into_python/items/df8325cc1575800d3a99
解決策が浮かばなかったので書き直しました。
python
1from kivy.uix.boxlayout import BoxLayout 2import yfinance as yf 3from kivy.app import App 4import mplfinance as mf 5from kivy.app import App 6from kivy.uix.boxlayout import BoxLayout 7from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 8 9data = yf.download(tickers='SPY',period="7d", interval = "1m") 10print(data) 11 12 13 14class PlotChart(App): 15 def __init__(self, *args, **kwargs): 16 super().__init__(*args, **kwargs) 17 18 data = yf.download(tickers='SPY',period="7d", interval = "1m") 19 chart = mf.plot(data, style='yahoo', type='candle', title= 'S&P500 Chart', figratio=(12,4),volume=True) 20 widget = FigureCanvasTkAgg(chart) 21 22 self.add_widget(widget) 23 24 25class RootWidget(BoxLayout): 26 pass 27 28class GraphApp(App): 29 def __init__(self,*args, **kwargs): 30 super().__init__(*args, **kwargs) 31 self.title = 'S&P500Chart' 32 33 def build(self): 34 return RootWidget() 35 36 37
kivy
1#:kivy2.0.0 2 3<RootWidget>: 4 orientation: 'vertical' 5 6 Label: 7 text: 'The following is a graph of Matplotlib' 8 size_hint_y: 0.2 9 10 PlotChart: 11 12<PlotChart>: 13
エラーは出ませんが、表示がされません。
よろしくお願いします。。。
編集しなおしたコード(まだ想定外の表示がされる)
python
1from kivy.uix.boxlayout import BoxLayout 2import yfinance as yf 3from kivy.app import App 4import mplfinance as mf 5from kivy.app import App 6from kivy.uix.boxlayout import BoxLayout 7from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg 8import matplotlib.pyplot as plt 9import pandas as pd 10import mplfinance as mpf 11import numpy as np 12#data = yf.download(tickers='SPY',period="7d", interval = "1m") 13#print(data) 14 15 16 17class PlotChart(BoxLayout): 18 def __init__(self, *args, **kwargs): 19 super().__init__(*args, **kwargs) 20 21 data = yf.download(tickers='SPY',period="7d", interval = "1m") 22 23 24 x = np.linspace(-np.pi, np.pi, 100) 25 y = np.sin(x) 26 fig, ax = plt.subplots() 27 ax.plot(x, y) 28 29 chart = mf.plot(data, style='yahoo', type='candle', title= 'S&P500 Chart', figratio=(12,4),volume=True) 30 31 widget = FigureCanvasKivyAgg(chart) 32 33 self.add_widget(widget.canvas) 34 35 36class RootWidget(BoxLayout): 37 pass 38 39class GraphApp(App): 40 def __init__(self,*args, **kwargs): 41 super().__init__(*args, **kwargs) 42 self.title = 'S&P500Chart' 43 44 def build(self): 45 return RootWidget() 46 47def main(): 48 app = GraphApp() 49 app.run() 50 51if __name__ == '__main__': 52 main() 53 54 55
kivy
1#:kivy 2.0.0 2 3<RootWidget>: 4 BoxLayout: 5 orientation: 'vertical' 6 7 Label: 8 text: 'The following is a graph of Matplotlib' 9 size_hint_y: 0.2 10 PlotChart: 11 12<PlotChart>: 13 14
FigureCanvasKivyAggはkivyでは使えないとのことで、kivygarden.graphでも自分なりに解釈して書いてみましたが、黒い画面が表示されます。
from datetime import datetime from kivy_garden.graph import Graph, MeshLinePlot from matplotlib.pyplot import cla from kivy.app import App from datetime import datetime import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError from datetime import datetime class graph_charengeApp(App): def make_plot(self, plot_dates,tickers_on_plot, plot_colors): #データを読み込んで分割する my_share = share.Share('MSFT') symbol_data = None try: symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY, 60, share.FREQUENCY_TYPE_MINUTE, 5) except YahooFinanceError as e: print(e.message) sys.exit(1) date = symbol_data['timestamp'] price = symbol_data['close'] #プロットする graph = Graph(xlabel='datetime', ylabel='price', x_ticks_minor=5, x_ticks_major=25, y_ticks_major=1, y_grid_label=True, x_grid_label=True, padding=5, x_grid=True, y_grid=True, xmin=date[10], xmax=date[0], ymin = price[0] - 10, ymax = price[0]) x=range(11) if (len(tickers_on_plot)>0): for i in x: plot = MeshLinePlot(color=[1, 0, 0, 1]) plot.points = [(date[i], price[i]) for date[i], price[i] in zip(date, price)] graph.add_plot(plot) return graph graph_charengeApp().run()
yahoo_finance_api2のtimestanpって暗号みたいなデータなんですね、、
このままだと使えないですよね
(時間は表示できていませんが、)チャートの表示ができました
まず、日付の扱いが難しかったので、時間(取得したタイムスタンプ)をインデックスにおき変えて、表示を試みました。
前のコードは修正点が多く、どこを修正したかは割愛します。
python
1from datetime import datetime 2from kivy_garden.graph import Graph, MeshLinePlot 3from matplotlib.pyplot import cla 4from kivy.app import App 5from datetime import datetime 6import sys 7from yahoo_finance_api2 import share 8from yahoo_finance_api2.exceptions import YahooFinanceError 9from datetime import datetime 10 11 12class graph_charengeApp(App): 13 def build(self): 14 #データを読み込んで分割する 15 16 17 my_share = share.Share('MSFT') 18 symbol_data = None 19 20 try: 21 symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY, 22 60, 23 share.FREQUENCY_TYPE_MINUTE, 24 5) 25 except YahooFinanceError as e: 26 print(e.message) 27 sys.exit(1) 28 29 #data = symbol_data['timestamp'] 30 #new_data = [datetime.utcfromtimestamp(int(data[i]/1000)) for i in range(len(data))] 31 price = symbol_data['close'] 32 33 #プロットする 34 graph = Graph(xlabel='datetime', ylabel='price', x_ticks_minor=5, 35 x_ticks_major=25, y_ticks_major=10, 36 y_grid_label=True, x_grid_label=True, padding=5, 37 x_grid=True, y_grid=True, xmin=0, xmax= 100, ymin = 255, ymax = 265) 38 #x=range(11) 39 #if (len(tickers_on_plot)>0): 40 #for i in x: 41 plot = MeshLinePlot(color=[1, 0, 0, 1]) 42 plot.points = [(i, price[i]) for i in range(0, 100)] 43 graph.add_plot(plot) 44 45 return graph 46 47graph_charengeApp().run() 48
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/16 06:13