我有一个包含用户注册的数据库。对于每个用户,我都有注册日期。
我想将该日期范围内的用户总数绘制为阶梯线图,并填充该行下方的区域。
我的第一个想法是首先创建一个Numpy数组,在可能的日期范围内每天都有0值,然后遍历所有日期并递增相应的数组项。然后可以使用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()
结果:
我对此有疑问:
答案 0 :(得分:3)
我认为您为x
,y
所做的一切都很好。 np.cumsum
是这项工作的正确工具。
要填写图表下方,请查看fill_between。在曲线和x轴之间填充。
要在x轴上获取日期,只需使用dates
代替x
。或者,尝试使用plot_date
而不是plot
。