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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

899閲覧

tkinterのcanvasに設定したax.twinx()環境が消された。

Deng

総合スコア16

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2021/10/20 08:24

編集2021/10/22 04:13

やりたいことは:
1)「更新」のボダンをクリックして、二つY軸のグラフを表示します。左Y軸はaグラフで、右Y軸はb
グラフです。(Spinboxのデフォルトは「全部データ」です)

2)Spinboxにaを選んで、「更新」のボダンをクリックして、左Y軸でaグラフのみで、表示されます。

3)Spinboxにbを選んで、「更新」のボダンをクリックして、左Y軸でbグラフのみで、表示されます。

4)Spinboxに「全部データ」を選んで、「更新」のボダンをクリックして、二つY軸のグラフを表示します。左Y軸はaグラフで、右Y軸はbグラフです。(  1)の状態に戻ること  )

しかし、4)番の操作には、思ったとおりにならなかったです。

恐らく、plt.cla()などの更新するときに、ax2.twinx()を消されました。

どうすればいいか?教えていただきたいです。よろしくお願いします。

Python

1from tkinter import * 2from tkinter import ttk 3from matplotlib import pyplot as plt 4from matplotlib.backends.backend_tkagg import ( 5 FigureCanvasTkAgg, NavigationToolbar2Tk) 6 7# プロットを更新する 8def plot_data(): 9 if data_ch_name.get() == "全部データ": 10 x = [1,2,3,4,5] 11 y1 = [21,11,31,41,21] 12 y2 = [0.3,0.15,0.31,4.1,2.1] 13 ax1.plot(x,y1,color='red') 14 ax2.plot(x,y2,color='blue') 15 ax1.set_ylabel("a",color='red') 16 ax2.set_ylabel("b",color='blue') 17 18 if data_ch_name.get() == "a": 19 ax1.cla() 20 ax2.cla() 21 ax2.axis("off") 22 x = [1,2,3,4,5] 23 y1 = [21,11,31,41,21] 24 ax1.plot(x,y1,color='red') 25 ax1.set_ylabel("a",color='red') 26 27 if data_ch_name.get() == "b": 28 ax1.cla() 29 ax2.cla() 30 ax2.axis("off") 31 x = [1,2,3,4,5] 32 y2 = [0.3,0.15,0.31,4.1,2.1] 33 ax1.plot(x,y2,color='blue') 34 ax1.set_ylabel("b",color='blue') 35 36def plot_wave(): 37 plot_data() 38 canvas.draw() 39 40# Windowの設定 41root = tkinter.Tk() 42root.title() 43root.geometry() 44data_name = ["全部データ","a","b"] 45 46# Frameの設定 47frame_btn = Frame(root, bd=4, relief=GROOVE) 48frame_repeat = Frame(root,bd=5, relief=GROOVE) 49frame_plot = Frame(root,bd=4, relief=GROOVE) 50 51# Buttonの設定 52btn_renew = Button(frame_btn, text='更新',fg='green',relief=GROOVE,command=plot_wave) 53 54# canvasの設定と描画 55fig = plt.Figure(facecolor="skyblue") 56ax1 = fig.add_subplot(111) 57ax2 = ax1.twinx() 58canvas = FigureCanvasTkAgg(fig, frame_plot) 59canvas.get_tk_widget().grid(row=0, column=0) 60canvas.draw() 61 62#widgetの配置 63frame_btn.grid(row=0, column=0) #in root 64frame_repeat.grid(row=1, column=0) #in root 65frame_plot.grid(row=2, column=0) #in root 66data_ch_name = StringVar() 67data_ch_name.set("全部データ") 68data_n_sp = ttk.Spinbox(frame_repeat, state = 'readonly', width=25, textvariable = data_ch_name, values = data_name) 69btn_renew.pack(fill = X) #in frame_btn 70data_n_sp.grid(row =0, column = 2,sticky=N) 71 72root.mainloop() #tkinterのwinを維持する。 73 74

イメージ説明
Win10
Python 3.0
IDLE ver. 3.8.0
TK ver. 8.6.9

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

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

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

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

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

guest

回答1

0

ベストアンサー

aもしくはbで更新したときにax2.axis("off")したものが、戻されていないからでしょう。
あと、全部データの場合もcla()を入れたほうがいいように思います。

python

1def plot_data(): 2 if data_ch_name.get() == "全部データ": 3 ax1.cla() 4 ax2.cla() 5 ax2.axis("on") 6 x = [1,2,3,4,5] 7 y1 = [21,11,31,41,21] 8 y2 = [0.3,0.15,0.31,4.1,2.1] 9 ax1.plot(x,y1,color='red') 10 ax2.plot(x,y2,color='blue') 11 ax1.set_ylabel("a",color='red') 12 ax2.set_ylabel("b",color='blue') 13 # 以下省略

######追記
画像で上げていただいた問題はmatplotlibのバージョン3.4.2 のバグのようなので、
3.4.3にバージョンアップしましょう。

投稿2021/10/21 23:51

編集2021/10/22 05:03
bsdfan

総合スコア4567

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

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

Deng

2021/10/22 02:46

bsdfan 様 ご返事ありがとうございました。しかし、cla()の原因かもしれませんか、ax.twinx()の環境がなくなりました。「全部データ」時に、左のY軸がしかありませんでした。
bsdfan

2021/10/22 02:50 編集

原因は、cla() ではなく、ax2.axis("off") です。 ax2.axis("on") を入れたら表示されるはずです。
Deng

2021/10/22 04:07

以下のようですか? うまくできないですが。私がどこか間違いましたでしょうか? def plot_data(): if data_ch_name.get() == "全部データ": ax1.cla() ax2.cla() ax2.axis("on") x = [1,2,3,4,5] y1 = [21,11,31,41,21] y2 = [0.3,0.15,0.31,4.1,2.1] ax1.plot(x,y1,color='red') ax2.plot(x,y2,color='blue') ax1.set_ylabel("a",color='red') ax2.set_ylabel("b",color='blue') if data_ch_name.get() == "a": ax1.cla() ax2.cla() ax2.axis("on") x = [1,2,3,4,5] y1 = [21,11,31,41,21] ax1.plot(x,y1,color='red') ax1.set_ylabel("a",color='red') if data_ch_name.get() == "b": ax1.cla() ax2.cla() ax2.axis("on") x = [1,2,3,4,5] y2 = [0.3,0.15,0.31,4.1,2.1] ax1.plot(x,y2,color='blue') ax1.set_ylabel("b",color='blue')
bsdfan

2021/10/22 04:14

aとbのところは元のコードのままでいいです。 全部データ → ax2を表示 (ax2.axis('on')) a, b → ax2を非表示 (ax2.axis('off'))
Deng

2021/10/22 04:22

こようにしますか?依然にできないです。versionの問題ですか? 私のmatplotlibは: Matplotlib 3.4.2, Matplotlib-inline: 0.1.2 def plot_data(): if data_ch_name.get() == "全部データ": ax1.cla() ax2.cla() ax2.axis('on') x = [1,2,3,4,5] y1 = [21,11,31,41,21] y2 = [0.3,0.15,0.31,4.1,2.1] ax1.plot(x,y1,color='red') ax2.plot(x,y2,color='blue') ax1.set_ylabel("a",color='red') ax2.set_ylabel("b",color='blue') if data_ch_name.get() == "a": ax1.cla() ax2.cla() ax2.axis('off') x = [1,2,3,4,5] y1 = [21,11,31,41,21] ax1.plot(x,y1,color='red') ax1.set_ylabel("a",color='red') if data_ch_name.get() == "b": ax1.cla() ax2.cla() ax2.axis('off') x = [1,2,3,4,5] y2 = [0.3,0.15,0.31,4.1,2.1] ax1.plot(x,y2,color='blue') ax1.set_ylabel("b",color='blue')
bsdfan

2021/10/22 04:55

私の環境(matplotlibは 3.4.3)では問題なく動いています。 3.4.2をインストールして試してみたら、Dengさんと同じ問題が発生しました。 なので、3.4.3にバージョンアップしたら解決すると思います。 多分、この修正。https://github.com/matplotlib/matplotlib/pull/20826/
Deng

2021/10/22 05:17

Bsdfan様、大変助かりました。私もmatplotlib 3.4.3になって、成功しました。ありがとうございました。感謝いたしました。今後とも、よろしくお願いします。大切なご時間を使っていただきまして、申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問