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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

515閲覧

tkinter内に表示したmatplotlibの2つのグラフのx軸の表示範囲の変更について

shield599

総合スコア2

Matplotlib

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2023/04/04 00:54

実現したいこと

x軸の表示範囲を個別に設定したいです。
y軸は個別に変更できています。

前提

ここに質問の内容を詳しく書いてください。
tkinter内で2つグラフを表示させています。
GUI上でグラフのx,y軸の表示範囲を変更できるように別windouwで表示範囲の上限と下限を入力できるようにしています。

発生している問題・エラーメッセージ

axs[0],[1]それぞれのx軸の範囲指定をするようにコードを書いているつもりなのですが、axs[0]の範囲指定の入力欄に数値を入れてもグラフのx軸の表示範囲に変化はなく、axs[1]も範囲指定の入力欄に数値を入れるとaxs[0]と[1]の両方のグラフが変化します。

間違ってaxs[1]の入力値が間違って入力されているのかと思い、axs[1]のx軸の入力欄を削除するとaxs[0]の範囲指定の入力欄に入れた数値が反映されてx軸の表示範囲が変わるのですが、今度はaxs[1]のグラフも連動してx軸の表示範囲が変更されます。

該当のソースコード

python

1 fig, axs = plt.subplots(1, 2, figsize=(10, 5), sharex=True,) 2 axs[0].scatter(df["Time(hr)"], df["B"],s=2, color="red") 3 axs[0].plot(df["Time(hr)"], df["C"], label="Baseline", color="green") 4 5 axs[0].set_xlabel("Time[hr]") 6 axs[0].set_ylim([0.000001, 0.001]) 7 axs[0].set_yscale('log') 8 axs[0].legend() 9 axs[0].set_title("Pressure measurement data") 10 11 axs[1].scatter(df["Time(hr)"], df["A"],s=2, color="blue") 12 13 axs[1].set_xlabel("Time[hr]") 14 axs[1].set_title("WVTR data") 15 axs[1].set_ylim([0.000001, 100]) 16 axs[1].set_yscale('log') 17 18 self.axs = axs # axsをクラスのプロパティに保存する 19 20 #plt.tight_layout() 21 self.canvas = FigureCanvasTkAgg(fig, master=self.graph_frame) 22 self.canvas.draw() 23 self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True) 24 25 26 def resize_graph(self): 27 # 別ウィンドウを作成する 28 top = tk.Toplevel(self.master) 29 top.title("グラフの範囲を設定") 30 top.geometry("300x400") 31 32 # 入力欄を作成する 33 xmin_label = tk.Label(top, text="Pressure_X軸最小値") 34 xmin_label.pack(side=tk.TOP) 35 xmin_entry = tk.Entry(top) 36 xmin_entry.pack(side=tk.TOP) 37 38 xmax_label = tk.Label(top, text="Pressure_X軸最大値") 39 xmax_label.pack(side=tk.TOP) 40 xmax_entry = tk.Entry(top) 41 xmax_entry.pack(side=tk.TOP) 42 43 ymin_label = tk.Label(top, text="Pressure_Y軸最小値") 44 ymin_label.pack(side=tk.TOP) 45 ymin_entry = tk.Entry(top) 46 ymin_entry.pack(side=tk.TOP) 47 48 ymax_label = tk.Label(top, text="Pressure_Y軸最大値") 49 ymax_label.pack(side=tk.TOP) 50 ymax_entry = tk.Entry(top) 51 ymax_entry.pack(side=tk.TOP) 52 53 54 W_xmin_label = tk.Label(top, text="WVTR_X軸最小値") 55 W_xmin_label.pack(side=tk.TOP) 56 W_xmin_entry = tk.Entry(top) 57 W_xmin_entry.pack(side=tk.TOP) 58 59 W_xmax_label = tk.Label(top, text="WVTR_X軸最大値") 60 W_xmax_label.pack(side=tk.TOP) 61 W_xmax_entry = tk.Entry(top) 62 W_xmax_entry.pack(side=tk.TOP) 63 64 W_ymin_label = tk.Label(top, text="WVTR_Y軸最小値") 65 W_ymin_label.pack(side=tk.TOP) 66 W_ymin_entry = tk.Entry(top) 67 W_ymin_entry.pack(side=tk.TOP) 68 69 W_ymax_label = tk.Label(top, text="WVTR_Y軸最大値") 70 W_ymax_label.pack(side=tk.TOP) 71 W_ymax_entry = tk.Entry(top) 72 W_ymax_entry.pack(side=tk.TOP) 73 74 if self.canvas is not None: 75 xlims = self.axs[0].get_xlim() 76 ylims = self.axs[0].get_ylim() 77 W_xlims = self.axs[1].get_xlim() 78 W_ylims = self.axs[1].get_ylim() 79 xmin_entry.insert(0, "{:.2f}".format(xlims[0])) 80 xmax_entry.insert(0, "{:.2f}".format(xlims[1])) 81 ymin_entry.insert(0, "{:.2e}".format(ylims[0])) 82 ymax_entry.insert(0, "{:.2e}".format(ylims[1])) 83 Wvtrmin_entry.insert(0, "{:.2f}".format(W_xlims[0])) 84 Wvtrmax_entry.insert(0, "{:.2f}".format(W_xlims[1])) 85 W_ymin_entry.insert(0, "{:.2e}".format(W_ylims[0])) 86 W_ymax_entry.insert(0, "{:.2e}".format(W_ylims[1])) 87 88 # OKボタンを作成する 89 ok_button = tk.Button(top, text="OK", command=lambda: self.do_resize_graph(top, xmin_entry, xmax_entry, ymin_entry, ymax_entry,W_xmin_entry, W_xmax_entry, W_ymin_entry, W_ymax_entry)) 90 ok_button.pack(side=tk.TOP) 91 def do_resize_graph(self, top, xmin_entry, xmax_entry, ymin_entry, ymax_entry,W_xmim_entry, W_xmax_entry, W_ymin_entry, W_ymax_entry): 92 93 # 入力値を取得する 94 try: 95 xmin = float(xmin_entry.get()) 96 xmax = float(xmax_entry.get()) 97 ymin = float(ymin_entry.get()) 98 ymax = float(ymax_entry.get()) 99 W_xmin = float(Wvtrmin_entry.get()) 100 W_xmax = float(Wvtrmax_entry.get()) 101 W_ymin = float(W_ymin_entry.get()) 102 W_ymax = float(W_ymax_entry.get()) 103 104 except ValueError: 105 self.status_bar.config(text="数値を入力してください") 106 return 107 108 # グラフの表示範囲を変更する() 109 if self.canvas is not None: 110 self.axs[0].set_xlim([xmin, xmax]) 111 self.axs[0].set_ylim([ymin, ymax]) 112 self.axs[1].set_xlim([W_xmin, W_xmax]) 113 self.axs[1].set_ylim([W_ymin, W_ymax]) 114 self.canvas.draw() 115 116 # ウィンドウを閉じる 117 top.destroy()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここで、sharex=Trueとしているからではないでしょうか。

python

1fig, axs = plt.subplots(1, 2, figsize=(10, 5), sharex=True,)

投稿2023/04/04 01:03

編集2023/04/04 01:04
TakaiY

総合スコア12917

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

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

shield599

2023/04/04 02:30

ご回答ありがとうございます。 以前作ったコードのコピペだったのでsharexを抜くのを失念しており、気づきませんでした。 解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問