开发者

How can one plot time-related information with python in a natural human-readable way?

Often, you have a set of events (visits to a website, price information, whatever) that's related to a time value, let's say a timestamp (though a datetime object is just fine). How can they be plotted so that the time axis gets human-readable, meaningful values instead of just number of seconds?

I've been looking around gnuplot and matplot but I haven't been able to find quite the way to do this. The problem is, while it's possible f开发者_JAVA技巧or matplot to set ticks every hour, it would be better to be able to see textual time info every N hours instead of having to count them up.

I suspect gnuplot is overkill/not really designed for this. Any suggestions?


FWIW here's a simple example of plotting some values against times using the excellent and well-documented matplotlib:

data.csv:
    VISIT_TIME  TOTAL_VISITS
    06:00:00    290
    06:30:00    306
    07:00:00    364
    07:30:00    363
    08:00:00    469
    08:30:00    436
    09:00:00    449
    09:30:00    451
    10:00:00    524
    10:30:00    506
    11:00:00    613
    11:30:00    585
    12:00:00    620
    12:30:00    529
    13:00:00    588
    13:30:00    545

Simple program for illustrative purposes:

import matplotlib.dates as mdates
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import datetime as dt
import sys

def main( datafile ):
    np_rec_array = mlab.csv2rec( datafile, delimiter='\t' )
    np_rec_array.sort() # in-place sort
    # a `figure` is a starting point for MPL visualizations
    fig = plt.figure( figsize=(8,6) ) 
    # add a set of `axes` to above `figure`
    ax = fig.add_subplot(111)
    x = np_rec_array.visit_time
    y = np_rec_array.total_visits
    # `plot_date` is like `plot` but allows for easier x-axis formatting
    ax.plot_date(x, y, 'o-', color='g') 
    # show time every 30 minutes
    ax.xaxis.set_major_locator( mdates.MinuteLocator(interval=30) )
    # specify time format
    ax.xaxis.set_major_formatter( mdates.DateFormatter("%H:%M") )
    # set x-axis label rotation (otherwise they can overlap)
    for l in ax.get_xticklabels():
        l.set_rotation(60)
    plt.title( 'Website Visits' )
    plt.show()

if __name__ == '__main__':
    if len( sys.argv ) == 1:
        sys.stderr.write( 'need a filename, exiting...' )
        sys.exit(-1)
    main( sys.argv[1] )

Output is the following image:

How can one plot time-related information with python in a natural human-readable way?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜