[英]Plot histogram of epoch list, x axis by month-year in PyPlot
有了一個紀元日期列表, pyplot
或numpy
是否有一個參數可以得到一個直方圖,其中bins
與data
列表中的月份相匹配? 在此示例中,列表對應於2012年至2013年的隨機日期。如果data
的值僅對應於這些月份的日期,我希望直方圖顯示2012年2月至2013年10月的條形圖。
此代碼生成直方圖,但它為bins=24
手動分隔。
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import random
data = [int(random.randint(1293836400, 1356994800)) for _ in range(1000)]
# convert the epoch format to matplotlib date format
mpl_data = mdates.epoch2num(data)
fig, ax = plt.subplots(1,1)
ax.hist(mpl_data, bins=24, ec='black')
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%y'))
fig.autofmt_xdate()
plt.show()
為此,您必須選擇每月開始的時間戳。 日期/時間總是比常規數字更棘手,所以雖然這段代碼看起來有點麻煩,但確實有效。
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import random
data = [int(random.randint(1293836400, 1356994800)) for _ in range(1000)]
# create your bins as timestamps marked at the beginning of each month, using datetime objects to increment
import datetime as d
mindate = d.datetime.fromtimestamp(min(data))
maxdate = d.datetime.fromtimestamp(max(data))
bindate = d.datetime(year=mindate.year, month=mindate.month, day=1)
bins = [bindate.timestamp()]
while bindate < maxdate:
if bindate.month == 12:
bindate = d.datetime(year=bindate.year + 1, month=1, day=1)
else:
bindate = d.datetime(year=bindate.year, month=bindate.month + 1, day=1)
bins.append(bindate.timestamp())
bins = mdates.epoch2num(bins)
mpl_data = mdates.epoch2num(data)
fig, ax = plt.subplots(1,1, figsize=(16, 4), facecolor='white')
ax.hist(mpl_data, bins=bins, ec='black')
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%y'))
fig.autofmt_xdate()
另一種方法是使用pandas
按月對數據進行分組,然后對它們進行計數。 代碼要短得多,你可以制作一個快速的條形圖。 要重新創建上面的圖表需要花費更多的工作,但這可以讓您感受到使用其他工具可以做的事情:
srs = pd.DatetimeIndex(pd.Series(data) * 1e9) # convert sec to nsec
df = pd.DataFrame({'count': np.ones(shape=len(srs))}, index=srs)
fig, ax = plt.subplots(1, 1, figsize=(16,4), facecolor='white')
df.groupby(pd.Grouper(freq='M')).count().plot.bar(ax=ax)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.