2016-08-20 6 views
3

Ich kämpfe, um die elegante Leichtigkeit zu reproduzieren - und erfolgreiches Ergebnis - scherzhaft versprochen in der 'Basic Plotting: plot' Abschnitt der pandas df.plot() Dokumentation unter:Wie automatisch Achsen in Pandas Plot()

http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization

Dort wird die erste Bild der Autoren ist ziemlich nah an die Art von Line-graph ich von meinem Datenrahmen darstellen möge. Ihre erste df und daraus resultierende Handlung ist ein Single-Liner, so wie ich hoffte, dass mein df unten aussehen würde, wenn geplottet.

Meine df sieht wie folgt aus:

  2014-03-28 2014-04-04 2014-04-11 2014-04-18 \ 
Jenny Todd 1699.6  1741.6  1710.7  1744.2 

      2014-04-25 2014-05-02 2014-05-09 
Jenny Todd 1764.2  1789.7  1802.3 

Ihre zweite Bild ist ein Multi-Liniendiagramm sehr ähnlich zu dem, was ich mir erhofft hatte, wenn ich versuche, ein Multiple-Index Version meiner df zu plotten. ZB:

    2014-06-13 2014-06-20 2014-06-27 \ 
William Acer  1674.7  1689.4  1682.0 
Katherine Baker  1498.5  1527.3  1530.5 


        2014-07-04 2014-07-11 2014-07-18 \ 
William Acer  1700.0  1674.5  1677.8 
Katherine Baker  1540.4  1522.3  1537.3 

        2014-07-25 
William Acer  1708.0 
Katherine Baker  1557.1 

Allerdings bekommen sie Plots. Ich erhalte merkmalslose 3,3kb Bilder und eine Warnung:

/home/lee/test/local/lib/python2.7/site-packages/matplotlib/axes/_base.py:2787: UserWarning: Versuch, identisch links zu setzen == Richtig ergibt sich singuläre Transformationen; automatisch erweiternd. links = 0,0, rechts = 0,0 'links =% s, rechts =% s')% (links, rechts))

Die Autoren der Dokumentation scheint die Handlung() Funktion aus der Indizes der df herzuleiten zu haben die Werte der X-Achse und der Bereich und die Werte der Y-Achse.

Durchsuche, kann ich Menschen mit verschiedenen Daten, verschiedenen Indizes und verschiedenen Szenarien (zum Beispiel das Zeichnen einer Spalte gegen eine andere oder versuchen, mehrere Unterplots), die diese Art von "Achsen" Fehler bekommen. Ich war jedoch nicht in der Lage, ihre Probleme auf meine zu beziehen.

Ich frage mich, ob jemand helfen kann zu lösen, was ist anders über meine Daten oder Code, die zu einem anderen Plot Ergebnis aus der scheinbar ähnlichen Daten der Dokumentation und scheinbar ähnlichen Code führt.

Mein Code:

print plotting_df # (This produces the df examples I pasted above) 
plottest = plotting_df.plot.line(title='Calorie Intake', legend=True) 
plottest.set_xlabel('Weeks') 
plottest.set_ylabel('Calories') 
fig = plt.figure() 
plot_name = week_ending + '_' + collection_name + '.png' 
fig.savefig(plot_name) 

Hinweis Dieser Datenrahmen wird dynamisch viele Male im Skript erstellt. Bei jedem Lauf erhält das Skript verschiedene Sätze von Daten, unterschiedlich benannte Personen und unterschiedliche Zahlen zum Plotten. Daher habe ich keine Vorhersagbarkeit darüber, welche Strings für Index- und Legendenbeschriftungen für das Plotten im Voraus erstellt werden. Ich habe Vorhersagbarkeit über das Format.

Ich bekomme, dass der Datumsindex meines Datenrahmens anders formatierte Daten als die verwiesene Dokumentation beschreibt. Ist das der Grund? Ob es ist oder nicht, wie sollte man dieses Problem am besten lösen?

Hinzugefügt am 2016.08.24 den Kommentar unter etwa nicht in der Lage zu beantworten, meine Daten neu erstellen

plotting_df wird als Teilmenge eines viel größeren Datenframe on the fly erstellt. Es ist einfach ein Index (oder manchmal mehrere Indizes) und einige der Datumsspalten, die aus dem größeren Datenrahmen extrahiert wurden. Der Code, der plotting_df erzeugt, funktioniert einwandfrei und erzeugt immer plotting_df mit korrekten Indizes und Spalten in einem Format, das ich erwarte.

I Erstellung eines Datensatzes simulieren kann in plotting_df mit diesem Python-Code zu speichern:

plotting_1 = { 
      '2014-03-28': 1699.6, 
      '2014-04-04': 1741.6, 
      '2014-04-11': 1710.7, 
      '2014-04-18': 1744.2, 
      '2014-04-25': 1764.2, 
      '2014-05-02': 1789.7, 
      '2014-05-09': 1802.3 
     } 

plotting_df = pd.DataFrame(plotting_1, index=['Jenny Todd']) 

und ich kann Schaffung eines Multiple-Indizes plotting_df mit diesem Python-Code simulieren:

plotting_2 = { 
      'Katherine Baker': { 
       '2014-06-13': 1498.5, 
       '2014-06-20': 1527.3, 
       '2014-06-27': 1530.5, 
       '2014-07-04': 1540.4, 
       '2014-07-11': 1522.3, 
       '2014-07-18': 1537.3, 
       '2014-07-25': 1557.1 
      }, 
      'William Acer': { 
       '2014-06-13': 1674.7, 
       '2014-06-20': 1689.4, 
       '2014-06-27': 1682.0, 
       '2014-07-04': 1700.0, 
       '2014-07-11': 1674.5, 
       '2014-07-18': 1677.8, 
       '2014-07-25': 1708.0 
      } 
} 

plotting_df = pd.DataFrame.from_dict(plotting_2) 

Ich habe versucht, die vorgeschlagene Transformation mit Code:

plotdf = plotting_df.T 
plotdf.index = pd.to_datetime(plotdf.index) 

so, dass meine ursprünglichen Code jetzt sieht aus wie:

print plotting_df # (This produces the df examples I pasted above) 
plotdf = plotting_df.T # Transform the df - date columns to indices 
plotdf.index = pd.to_datetime(plotdf.index) # Convert indices to datetime 
plottest = plotdf.plot.line(title='Calorie Intake', legend=True) 
plottest.set_xlabel('Weeks') 
plottest.set_ylabel('Calories') 
fig = plt.figure() 
plot_name = week_ending + '_' + collection_name + '.png' 
fig.savefig(plot_name) 

aber ich bekomme immer noch das gleiche Ergebnis (leere 3.3kb Bilder erstellt).

Ich habe festgestellt, dass das Hinzufügen der Transformation keinen Unterschied machte, wenn ich die erste Instanz von plotdf ausdruckte. Sollte ich also eine andere Transformation machen?

+0

ich Ihr Diagramm ohne Ihre Daten nicht neu erstellen können. Die Gedanken, die Ihnen in den Sinn kommen, sind 1. Die Zeitreihe muss der Index sein und Sie haben sie in den Spalten. Plotten Sie stattdessen plotdf = plotting_df.T. 2. Stellen Sie sicher, dass es sich um einen Zeitreihenindex handelt, indem Sie den Index mit plotdf.index = pd.to_datetime (plotdf.index) festlegen. – piRSquared

Antwort

1

Das ist Ihr Problem:

fig = plt.figure() 
plot_name = week_ending + '_' + collection_name + '.png' 
fig.savefig(plot_name) 

Sie sind eine zweite Figur zu schaffen, nachdem die erste erstellen und dann nur Sie speichern, dass die zweite leere Figur. nehmen Sie einfach die Linie fig = plt.figure() und ändern fig.savefig-plt.savefig

So sollten Sie haben:

print plotting_df # (This produces the df examples I pasted above) 
plotdf = plotting_df.T # Transform the df - date columns to indices 
plotdf.index = pd.to_datetime(plotdf.index) # Convert indices to datetime 
plottest = plotdf.plot.line(title='Calorie Intake', legend=True) 
plottest.set_xlabel('Weeks') 
plottest.set_ylabel('Calories') 
plot_name = week_ending + '_' + collection_name + '.png' 
plt.savefig(plot_name)