実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/04/04 02:30