2017-11-08 4 views
0

Ich habe eine Pandas-Serie mit Integer-Stunden als Index, wobei die Stunden nicht um Mitternacht beginnen, sondern zu einer zufälligen Stunde (8 im Beispiel unten).Pandas Plot ignoriert Index

hour = range(8, 24) + range(0, 8) 
values = pd.Series(range(24), index=hour) 

Ich möchte eine 24-Stunden Diagramm der Werte plotten, aber ich möchte, dass die x-Achse die „rohen“ Stunde Werte zeigen und nicht den Index neu ordnen.

ax = values.plot() 
ax.axis([0, 23, 0, 23]) 

enter image description here

Irgendwelche Vorschläge?

+1

Das Grundstück rearange nichts. Außerdem wird der Index nicht ignoriert. stattdessen * verwendet * den Index. Was meinst du mit "den" rohen "Stundenwerten"? Wie soll die Handlung aussehen? – ImportanceOfBeingErnest

+0

Ich möchte die X-Achse von 8 bis 7 (von 23 auf 0 springen) gehen. Als ob die Etiketten nicht numerisch wären. – user3121900

Antwort

1

Eine Option ist in der Tat (wie Sie selbst in den Kommentaren sagten), einen nicht numerischen Index zu verwenden.

import pandas as pd 
import matplotlib.pyplot as plt 

hour = range(8, 24) + range(0, 8) 
values = pd.Series(range(24), index=list(map(str,hour))) 

ax = values.plot() 

plt.show() 

enter image description here

Da dies automatisch einige Etiketten wählen werden und es gibt keine Möglichkeit, sie zu kontrollieren, ist es vielleicht nicht optimal sein.

Eine bessere Lösung ist wahrscheinlich einen anderen Index zu verwenden, und zwar eine, die numerische und kontinuierlich zunehmende (in diesem Fall 8 bis 31), und dann ändern, um die ticklabels als modulo von 24.

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.ticker 

hour = range(8, 24) + range(0, 8) 
values = pd.Series(range(24), index=hour) 
values.index = values.index[0]+np.arange(0,len(values)) 

ax = values.plot() 
func = lambda x,pos: "{:g}".format(x%24) 
ax.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(func)) 

plt.show() 

enter image description here

Dies würde dann auch die Standorte auf Vielfache von einer bestimmten Anzahl (EG6), die an einem Tag stundenlang Sinn einstellen lassen macht.

ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(6)) 

enter image description here

Schließlich konnte man natürlich entscheiden sich für echte Datetimes mit.

import pandas as pd 
import matplotlib.pyplot as plt 
from datetime import datetime 

hour = range(8, 24) + range(0, 8) 
values = pd.Series(range(24), index=hour) 

todate = lambda i: datetime(2017,11,8+(values.index[0]+i)//24,(values.index[0]+i)%24) 
values.index = [todate(i) for i in range(len(values))] 

ax = values.plot() 

plt.show() 

enter image description here

+0

Wow! Vielen Dank :-) – user3121900