0

I'm creating a GUI in Tkinter that has an embedded matplotlib graph. I change the contents of the graph based on a couple of Radiobuttons. These Radiobuttons are linked to a function which redefines the data in the graph, and ends with a call to self.canvas.draw(). I used Unable to update Tkinter matplotlib graph with buttons and custom data substantially, and I got it to work perfectly: the graph is updated with the desired new data.

The problem I run into is that (I'm using dates for the x-tick labels) after the redraw function is called, the x-tick labels get rotated back to horizontal, causing them to overlap. Below is a simplified form of my application, which has no dependencies so can be run directly.

import tkinter
from tkinter import *
from tkinter.ttk import *
import csv
import datetime as dt
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

class MainApp:
    def __init__(self,parent):

        self.RightFrame = LabelFrame(parent,text='RightFrame')
        self.RightFrame.pack(side='right')

        self.plot_fig=plt.figure(figsize=(4,4),dpi=100)

        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        self.fig.autofmt_xdate(rotation=30) ### Sets tick rotation Initially
        self.ax.fmt_xdata=mdates.DateFormatter('%Y-%m-%d')
        self.ax.hold(False)

        self.canvas = FigureCanvasTkAgg(self.fig,master=self.RightFrame)
        self.canvas.show()
        self.canvas.get_tk_widget().pack(side=TOP)



        self.plot_radio_frame = LabelFrame(self.RightFrame)
        self.plot_radio_frame.pack(side=BOTTOM)

        self.plot_time_radio_var = IntVar()
        self.plot_time_radio_var.set(7)
        modes = [('1 Week',3),('1 Month',4),('1 Year',5),('5 Years',6),('All',0)]
        for text,value in modes:
            b= Radiobutton(self.plot_radio_frame,text=text,variable=self.plot_time_radio_var,value=value)
            b.pack(side=LEFT)
        self.plot_time_radio_var.trace('w',self.plotting_function)


    def plotting_function(self, varname, elementname, mode):
        plot_time = self.plot_time_radio_var.get()
        try:
            data_hist = [['2016-12-16',116.4700],
                        ['2016-12-19',115.8000],
                        ['2016-12-20',116.7400],
                        ['2016-12-21',116.8000],
                        ['2016-12-22',116.3500],
                        ['2016-12-23',115.5900],
                        ['2016-12-27',116.5200],
                        ['2016-12-28',117.5200],
                        ['2016-12-29',116.4500],
                        ['2016-12-30',116.6500]
                        ]

            days = int(plot_time)
            spacing = 1

            dates = [line[0] for line in data_hist[-days::spacing]]
            new_dates = [dt.datetime.strptime(d,'%Y-%m-%d').date() for d in dates]
            Y_DATA = [line[1] for line in data_hist[-days::spacing]]
            #print(adj_close)

            self.curve = self.ax.plot(new_dates,Y_DATA)
            self.canvas.draw()
        except Exception as e:
            print(str(e))



root = Tk()

MainApp(root)

root.mainloop()
Community
  • 1
  • 1
Aaron_J
  • 51
  • 7

0 Answers0