質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2511閲覧

AttributeError: 'Figure' object has no attribute 'fbind'というエラー⇒コード大胆修正ののち、別の問題が発生しました。

mmmiii313131

総合スコア3

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/15 01:41

編集2021/06/16 09:08

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

libraryの使い方を学ぶ時は他のlibraryを極力使わないようにしたほうが良いです。 今回の場合おそらくKivyを学んでいる最中だと思うのでyfinance,mplfinance,matplotlibを使わずにGUIを組む事から始め、それが出来てから徐々に他のlibraryも組み込んでみてください。そうじゃないとprogramがうまく動かない原因の特定が困難になるので。

投稿2021/06/16 00:44

編集2021/06/17 22:47
gottadiveintopy

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mmmiii313131

2021/06/16 06:13

そうですよね!(;;) 3日前にシンプルなログイン画面を試しに作ってみただけで、まだ始めたてなんです!いきなりむつかしいことを始めてしまいました。。。
guest

0

コードは実行してないので、他の部分は解りませんが、
描画に使うキャンバスの配置に関して、

チャートではなく、グラフ表示はできました。

self.screen.add_widget(fig.canvas)

ですが、株価のチャートではうまく動きません。

self.screen.add_widget(fig)

なので、fig -> fig.canvas に変えて見ましょう。


FigureCanvasTkAgg は、tkinter 用のバックエンドなので、kivy では使えません。
kivy 用のバックエンドを選択する必要があります。

投稿2021/06/16 05:53

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mmmiii313131

2021/06/16 06:11

画面が二つ出て、チャートは表示されましたが、思ったのと違う結果になりました。 いま、kivygerden.graphを見てみているのですが、よくわかりません。。。 使いかたを詳しくしく知りたいですが、いい方法はありますか。。
teamikl

2021/06/16 07:05

画面が2つ出るという事は、バックエンドが正しく選択されていないのだと思いますが、 実際に試した内容と、想定した変更が違ったのかもしれないので、 質問のコードを修正し、試したコードを掲載してください。 表題の AttributeError: 'Figure' object has no attribute 'fbind' は 要求された fbind は kivy の widget が持つメソッドなので、 matplotlib の figure ではなく、kivy のキャンバス widget を渡せば解消するはずです。 figure.canvas の実際の値は、バックエンド選択により異なります → 想定と違った場合は、バックエンドを確認。 エラーの詳細にエラーが起こった場所・行番号等の情報も出てるはずなので、 質問に記載しましょう。また、自分で問題点を探す場合にも役に立ちます。 >解決策が浮かばなかったので書き直しました の FigureCanvasTkAgg を使ったコードは、kivy を使う場合は 解決策から遠ざかっているので、一旦削除しましょう。
mmmiii313131

2021/06/16 07:32 編集

ご返答ありがとうございます。 コードの修正ができました。 エラーの箇所の件、承知しました。 >解決策が浮かばなかったので書き直しました の FigureCanvasTkAgg を使ったコードは、kivy を使う場合は 解決策から遠ざかっているので、一旦削除しましょう。 一生懸命FigureCanvasTkAggを使ったコードを修正していました。。 修正したコードはこちらのコードです。。
mmmiii313131

2021/06/16 09:11

kivygarden.graphの使いかたがほんの少しわかったようで、チャートの表示ができました。 想像通りのチャートになるように試行錯誤してみようと思います。ありがとうございました!
teamikl

2021/06/16 09:37

上から2つ目のコード(最初の質問のコード)に対して変更点が self.screen.add_widget(fig.canvas) です。 他の追加のコードは、 質問のタイトルとは関係のないものになってるので、 別で改めて質問を立てた方が良いと思います。 (話題の対象とするコードが複数あって、話が混在してしまいます)
mmmiii313131

2021/06/16 09:56

最初のコードは、.canvasをつけても表示されませんでした、、、 下記エラーを記述します。。 File "c:/Users/marma/Desktop/python_plactis/plactis/plot_APP copy.py", line 56, in build self.screen.add_widget(fig.canvas) AttributeError: 'Figure' object has no attribute 'canvas'
teamikl

2021/06/16 10:27

前提から違ったようです fig = go.Figure() なので、そもそも matplotlib を使ってない?
mmmiii313131

2021/06/16 10:49

色々試しすぎてごちゃごちゃにしてしまったようです すみません。。。
teamikl

2021/06/16 11:43

一番下の最新の(?)コードでは不要になってるみたいですね。 plotly もなくなってるみたいなので、一旦 import 文の所も整理された方が良いかも。
gottadiveintopy

2021/06/18 11:52 編集

今しがた自分でkivy.garden.matplotlibを使おうとしてみたんですが以下のerror https://github.com/kivy-garden/garden.matplotlib/issues/69 になりますね。このerrorはmatplotlibのversionを2.x.xに落とすことで回避できて、無事graphを表示することが出来ました。 現在のcodeでは kivy.garden.matplotlib に代えて kivy_garden.graph を使ってるようですが、時間や日付の表示する為には Graph._update_labels() を上書きする必要がありそうです。 https://github.com/kivy-garden/graph/blob/master/kivy_garden/graph/__init__.py#L324 ただmmmiii313131さんがプログラミング初心者である事を考えるとこれは厳しいかもしれません。なので私のおすすめは元のcodeのように kivy.garden.matplotlib を使うことです。 あとteamiklさんが削除すべきだと言ったのは FigureCanvasTkAgg であって FigureCanvasKivyAgg ではないです。 kivy.garden.matplotlib を使う際には FigureCanvasKivyAgg か FigureCanvasKivy のいずれかが要るようなので間違えないように気をつけてください。
gottadiveintopy

2021/06/18 00:14 編集

古いversionのlibraryを使う場合は安全性に気をつけてください。今回のように外部から与えられたデータを扱う場合は特に。具体的にはprogramをsandboxのような仮想環境の中で実行するなどして。
mmmiii313131

2021/06/18 00:25

アドバイスありがとうございます。。kivy.garden.matplotlibを使う時はFigureCanvasKivyAgg か FigureCanvasKivy、了解しました。。。ちなみにkivy.garden.matplotlibとkivy.garden.graphも違うものですよね、、、
mmmiii313131

2021/06/18 00:26

ありがとうございます!試してみます!
gottadiveintopy

2021/06/18 00:55

> ちなみにkivy.garden.matplotlibとkivy.garden.graphも違うものですよね、、、 です。kivy.garden.graphなんですがこれは kivy_garden.graph の旧版なので使わないようにしてください。 gardenには旧式と新式があって https://github.com/kivy-garden repositoryの名前が「garden.」で始まっている物が旧式、そうじゃない物が新式になっています。今使っている「graph」のように旧式と新式の両方がある場合は新式の方を、「garden.matplotlib」のように旧式しか無い場合にだけ旧式を使うようにしてください。とりあえずinstallする際に graphの場合は 「pip install kivy_garden.graph」 (私はAnacondaには詳しくないのですが、もしかしたら普通にpipコマンドを使ってはいけないかもしれません) garden.matplotlibの場合は「garden install matplotlib」としておけば大丈夫です。
mmmiii313131

2021/06/18 01:22

!!もしかしたら旧式をインストールしてるかもしれないです。。 pipはあまり使わないほうがいいらしいですね。。(もう入れてしまっている、できるだけcondaで探してから入れるのが良いとどこかのホームページでみました。)
gottadiveintopy

2021/06/18 06:58

> もしかしたら旧式をインストールしてるかもしれないです 「from kivy_garden.graph import Graph, MeshLinePlot」は新版のimport方法なのでこの部分が実行できているならその心配は無かったです、ごめんなさい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問