2016-07-23 6 views
0

Mein Ziel ist es, ein Diagramm (mit korrekten XY-Labels und Legende) mit Daten von Worldbank API bei GUI TKinter zu erstellen.Datum und Legende werden bei MatplotLib nicht richtig angezeigt

Ich habe mit Problemen wie die X-Label zeigt Nummer statt Jahr, und die Legende nicht angezeigt. enter image description here

Hat jemand die Lösung für diese? Hier

ist der Code:

from tkinter import * 

from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

from matplotlib.figure import Figure 

import wbdata 
import pandas 
import datetime 

class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     fig_population = Figure(figsize = (7.5, 4.5), dpi = 100) 
     addsubplot_population = fig_population.add_subplot(111) 

     period_population = (datetime.datetime(2010, 1, 1), datetime.datetime(2016, 7, 23)) 
     countries_population = ["USA","GBR"] 
     indicators_population = {'SP.POP.TOTL':'population'} 
     df_population = wbdata.get_dataframe(indicators_population, country = countries_population, data_date = period_population) 
     dfu_population = df_population.unstack(level = 0) 
     x_population = dfu_population.index 
     y_population = dfu_population.population 
     addsubplot_population.plot(x_population, y_population) 

     addsubplot_population.legend(loc = 'best') 
     addsubplot_population.set_title('Population') 
     addsubplot_population.set_xlabel('Time') 
     addsubplot_population.set_ylabel('Population')  

     canvas_population = FigureCanvasTkAgg(fig_population, self) 
     canvas_population.show() 
     canvas_population.get_tk_widget().pack(side = TOP, fill = BOTH, expand = False) 

if __name__ == "__main__": 
    app = App() 
    app.geometry("800x600+51+51") 
    app.title("World Bank") 
    app.mainloop() 

Antwort

1

Für Ihre X-Achsenbeschriftungen, ist eine Lösung, um Ihren Datenrahmen Indextyp datetime aktualisieren. Derzeit ist der Indextyp object.

Wie für die Legenden müssen Sie labels in der legend Methode angeben. Überprüfen Sie die hinzugefügten und aktualisierten Zeilen nach den Kommentaren im folgenden Code:

class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     fig_population = Figure(figsize=(8.5, 4.5), dpi=100) 
     addsubplot_population = fig_population.add_subplot(111) 

     period_population = (datetime.datetime(2010, 1, 1), datetime.datetime(2016, 7, 23)) 
     countries_population = ["USA", "GBR"] 
     indicators_population = {'SP.POP.TOTL': 'population'} 
     df_population = wbdata.get_dataframe(indicators_population, country=countries_population, 
              data_date=period_population) 
     dfu_population = df_population.unstack(level=0) 

     # update index type 
     dfu_population.index = dfu_population.index.astype('datetime64') 

     x_population = dfu_population.index 
     y_population = dfu_population.population 
     addsubplot_population.plot(x_population, y_population) 

     # legend needs labels 
     addsubplot_population.legend(labels=y_population, loc='best') 

     addsubplot_population.set_title('Population') 
     addsubplot_population.set_xlabel('Time') 
     addsubplot_population.set_ylabel('Population') 

     canvas_population = FigureCanvasTkAgg(fig_population, self) 
     canvas_population.show() 
     canvas_population.get_tk_widget().pack(side=TOP, fill=BOTH, expand=False) 
+0

Es funktioniert! Vielen Dank für die Hilfe. Eine Frage: Müssen wir den Datenrahmen-Indextyp für jedes Mal aktualisieren, wenn wir mit dem Datum arbeiten? – Fxs7576