2013-09-26 20 views
0

我有一個包含用戶註冊的數據庫。對於每個用戶,我都有註冊日期。Matplotlib:繪製一段時間內的用戶總數

我想繪製該日期範圍內的用戶總數作爲階梯線圖,線下面的區域被填充。

我的第一個想法是爲了在可能的日期範圍內每天創建一個數值爲0的Numpy數組,然後遍歷所有日期並增加相應的數組項。這可以使用numpy.cumsum(y)進行繪圖。

from django.contrib.auth import get_user_model 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.dates import date2num 

# Get user join dates 
User = get_user_model() 
datetimes = User.objects.values_list('date_joined', flat=True) \ 
         .order_by('date_joined') 
dates = map(lambda d: d.date(), datetimes) # This is now a list of date objects 

# Get some auxilliary values 
min_date = date2num(dates[0]) 
max_date = date2num(dates[-1]) 
days = max_date - min_date + 1 

# Initialize X and Y axes 
x = np.arange(min_date, max_date + 1) 
y = np.zeros(days) 

# Iterate over dates, increase registration array 
for date in dates: 
    index = int(date2num(date) - min_date) 
    y[index] += 1 

# Plot 
plt.plot(x, np.cumsum(y), drawstyle='steps-post') 
plt.show() 

結果:

plot

我的問題關於這一點:

  • 我懷疑還有一個更簡單的方法來實現我做什麼,而不是手動填充x和y軸。有沒有更簡單的方法,如果是的話,它是如何工作的?
  • 如何用純色填充線條下面的區域?
  • 如何獲取日期而不是x軸上的數字?
+1

matplotlib將針對'datetime'對象進行繪圖。 '情節(日期,np.cumsum(y))'應該'正常工作' – tacaswell

回答

3
  • 我認爲你做了什麼讓xy是罰款。 np.cumsum是這個工作的正確工具。

  • 要填寫以下圖表,請查看fill_between。在曲線和x軸之間填充。

  • 要獲取x軸上的日期,只需使用dates而不是x。或者,請嘗試使用plot_date而不是僅使用plot

+0

謝謝!結果在這裏:http://blog.dbrgn.ch/2013/9/26/plot-django-registered-users/ –