

下記のコードでグラフを描写させることができたのですが、その後にx軸やy軸の範囲を可変にする方法を調べても見つけることができなかったので、ご教授願います。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    import tkinter as tk
    from tkinter import filedialog
    
    root = tk.Tk()
    
    fig = plt.figure()
    ax = fig.add_subplot()
    
    def file_select():
        idir = r'C:\Users'
        file_path1 = tk.filedialog.askopenfilename(initialdir=idir)
        input_box.insert(tk.END, file_path1)
    
        data = np.loadtxt(file_path1, comments="*")
        ax.plot(data[:, 0], np.log10(data[:, 1] * data[:, 2]), label="Si", linewidth=0.4)
        canvas = FigureCanvasTkAgg(fig, master=root)
        canvas.draw()
        canvas.get_tk_widget().pack()
    
    plt.title("sample")  # グラフのタイトル
    plt.xlabel(r"x")  # x軸の名前
    plt.ylabel("y")  # y軸の名前
    plt.xlim(20, 70)  # x軸の範囲
    plt.ylim(0, 25)  # y軸の範囲
    plt.legend(bbox_to_anchor=(0, 0.85), loc='upper left', borderaxespad=1, fontsize=12)
    
    input_box = tk.Entry(width=40)
    input_box.place(x=10, y=100)
    input_box.pack()
    
    # ボタン1
    btn1 = tk.Button(root, text="参照", command=file_select)
    btn1.pack()
    # ボタン2
    btn2 = tk.Button(root, text="終了", command=lambda: root.quit())
    btn2.pack()
    
    root.withdraw()
    root.update()
    root.deiconify()
    root.mainloop()
    
[/code]

metroplisさん、kunifさんありがとうございます。ここから自分でも考えてみます。


CC BY-SA 4.0
2021-10-03T11:01:07.510
82845
2021-10-04T01:23:07.620
2021-10-04T01:23:07.620
48475
48475
question
python matplotlib tkinter
matplotlibで作成したグラフをtkinterに表示させ、そのx軸、y軸をボタンで範囲を変更できるようにしたい


ボタンではなく
[matplotlib.widgets.RangeSlide](https://matplotlib.org/devdocs/api/widgets_api.html#matplotlib.widgets.RangeSlider)
を使ってみました。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    from matplotlib.widgets import RangeSlider
    import tkinter as tk
    from tkinter import filedialog
    from functools import partial
    
    def plot_data(ax):
        # select data file
        idir = r'C:\Users'
        file_path1 = tk.filedialog.askopenfilename(initialdir=idir)
        input_box.insert(tk.END, file_path1)
    
        # import data and plot
        data = np.loadtxt(file_path1, comments='*')
        ax.plot(
          data[:, 0], np.log10(data[:, 1] * data[:, 2]),
          label='Si', linewidth=0.4)
        canvas = FigureCanvasTkAgg(fig, master=root)
        canvas.draw()
    
        # add range slider to x-axis
        slx = plt.axes([0.2, 0.07, 0.7, 0.03])
        x_slider = RangeSlider(
            ax=slx, label='', valmin=20, valmax=70,
            valinit=(20, 70), valstep=1)
        
        # add range slider to y-axis
        sly = plt.axes([0.08, 0.2, 0.025, 0.68])
        y_slider = RangeSlider(
            ax=sly, label='', valmin=0, valmax=25,
            valinit=(0, 25), valstep=1, orientation='vertical')
    
        # callback function when moving slider
        def update(val):
            ax.set_xlim(*(x_slider.val))
            ax.set_ylim(*(y_slider.val))
            canvas.draw()
    
        x_slider.on_changed(update)
        y_slider.on_changed(update)
    
        canvas.get_tk_widget().pack()
    
    if __name__ == '__main__':
        root = tk.Tk()
        fig, ax = plt.subplots()
        plt.subplots_adjust(left=0.2, bottom=0.2)
    
        plt.title('sample')  # グラフのタイトル
        plt.xlabel('x')  # x軸の名前
        plt.ylabel('y')  # y軸の名前
        plt.xlim(20, 70)  # x軸の範囲
        plt.ylim(0, 25)  # y軸の範囲
        plt.legend(
          bbox_to_anchor=(0, 0.85), loc='upper left',
          borderaxespad=1, fontsize=12)
    
        input_box = tk.Entry(width=40)
        input_box.place(x=10, y=100)
        input_box.pack()
    
        # ボタン1
        btn1 = tk.Button(
          root, text='参照', command=partial(plot_data, ax))
        btn1.pack()
    
        # ボタン2
        btn2 = tk.Button(
          root, text='終了', command=lambda: root.quit())
        btn2.pack()
    
        root.withdraw()
        root.update()
        root.deiconify()
        root.mainloop()
    
[/code]

[![screen
capture](https://i.stack.imgur.com/FRXzy.gif)](https://i.stack.imgur.com/FRXzy.gif)


CC BY-SA 4.0
2021-10-03T16:19:40.947
82848
2021-10-03T16:19:40.947
47127
82845
answer