2015-10-15 24 views
3

我隨時間的曲線值(即每小時) 我有一個數據幀dfout如下的Python:劇情時間戳數據幀matplotlib

val  x   y      ID        time 
0 6.0 48.730304 11.594837 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:02:02 
1 6.5 48.731639 11.602004 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:02:26 
2 7.0 48.740104 11.641433 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:04:45 
3 6.5 48.744026 11.648048 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:05:11 
4 6.0 48.747356 11.654539 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:05:32 
5 5.5 48.749050 11.660844 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:05:50 
6 5.0 48.749935 11.666812 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:06:10 
7 4.5 48.751007 11.677590 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:06:54 
8 4.0 48.742317 11.675558 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:08:31 
9 4.5 48.736461 11.675782 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:08:55 
10 5.0 48.729659 11.675481 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:09:20 
11 5.5 48.725871 11.673145 0efd2316-feb9-461c-b102-045aef8e22fe 2014-03-10 08:09:35 

,我想繪製列val如下

import matplotlib.dates as md 
fig=figure(figsize=(20,10)) 
ax=plt.gca() 
xfmt = md.DateFormatter('%H:%M:%S') 
plt.xticks(rotation=25) 
ax.xaxis.set_major_formatter(xfmt) 
plt.title("Temperature") 
plt.ylabel(r'Temperature, $^{o}C$') 
ax.plot(datenumes,dfout.val, marker='.',lw=0) 

enter image description here

但是我想之間08:00:00到的xlabel小時,因此:08:00:0009:00:00,10:00:00,...,16:00:00

+1

你可以嘗試'ax.xaxis.set_major_locator(HourLocator())'。同時使您的數據複製/粘貼(原始)友好來測試它。 – Leb

+0

完美。這正是我所尋找的。 – emax

回答

2

只需使用ax.set_xticks()選擇滴答的位置併爲其提供一個爲此目的而創建的對象的自定義列表datetime。 問題是這些對象的標籤表示是浮動的。您可以通過創建另一個包含時間字符串的列表來解決此問題,因爲您希望它們看起來像,我在此解決方案中稱爲ticklabels

import matplotlib.dates as md 
import matplotlib.pyplot as plt 
from datetime import * 

val = [6, 6.5, 7, 6.5, 6, 5.5, 5, 4.5, 4, 4.5, 5, 5.5] 
datenumes = [datetime(2014, 3, 10, 8, 2, 2), 
    datetime(2014, 3, 10, 8, 2, 26), 
    datetime(2014, 3, 10, 10, 4, 45), 
    datetime(2014, 3, 10, 10, 5, 11), 
    datetime(2014, 3, 10, 12, 5, 32), 
    datetime(2014, 3, 10, 12, 5, 50), 
    datetime(2014, 3, 10, 15, 6, 10), 
    datetime(2014, 3, 10, 16, 6, 54), 
    datetime(2014, 3, 10, 17, 8, 31), 
    datetime(2014, 3, 10, 18, 8, 55), 
    datetime(2014, 3, 10, 19, 9, 20), 
    datetime(2014, 3, 10, 22, 9, 35)] 

# creates list of datetimes where ticks should be set 
ticks = [datetime(2014, 3, 10, 8, 0, 0), 
     datetime(2014, 3, 10, 10, 0, 0), 
     datetime(2014, 3, 10, 12, 0, 0), 
     datetime(2014, 3, 10, 14, 0, 0), 
     datetime(2014, 3, 10, 16, 0, 0), 
     datetime(2014, 3, 10, 18, 0, 0), 
     datetime(2014, 3, 10, 20, 0, 0), 
     datetime(2014, 3, 10, 22, 0, 0) ] 

# generate labels for the datetimes used as ticks 
ticklabels = [str(tick)[11:] for tick in ticks] 

# PLOT 
fig=plt.figure(figsize=(20,10)) 
ax=plt.gca() 
plt.xticks(rotation=25) 

# set the ticks according to the list tick 
ax.set_xticks(ticks) 
## set labels to human readable format 
ax.set_xticklabels(ticklabels) 

plt.title("Temperature") 
plt.ylabel(r'Temperature, $^{o}C$') 
ax.plot(datenumes, val, marker='.', lw=0) 
plt.show() 

enter image description here

+0

它的作品,但@Leb的答案是好的 – emax