Xtick标签旋转在FigureCanvasTkAgg.draw()之后重置

时间:2017-01-05 23:17:48

标签: python matplotlib tkinter

我在Tkinter中创建了一个具有嵌入式matplotlib图形的GUI。我根据几个Radiobutton更改了图表的内容。这些Radiobuttons链接到一个函数,该函数重新定义图中的数据,并以调用self.canvas.draw()结束。我基本上使用了Unable to update Tkinter matplotlib graph with buttons and custom data,并且我完美地使用了它:使用所需的新数据更新图表。

我遇到的问题是(我在调用重绘功能后使用日期),x-tick标签会旋转回水平,导致它们重叠。下面是我的应用程序的简化形式,它没有依赖关系,因此可以直接运行。

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()

0 个答案:

没有答案