Matplotlib:绘制一段时间内的用户总数

时间:2013-09-26 21:04:04

标签: python matplotlib

我有一个包含用户注册的数据库。对于每个用户,我都有注册日期。

我想将该日期范围内的用户总数绘制为阶梯线图,并填充该行下方的区域。

我的第一个想法是首先创建一个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()

结果:

plot

我对此有疑问:

  • 我怀疑有一种更简单的方法来实现我所做的,而不是手动填充x和y轴。有没有更简单的方法,如果有,它是如何运作的?
  • 如何用纯色填充线下方的区域?
  • 如何在x轴上获取日期而不是数字?

1 个答案:

答案 0 :(得分:3)

  • 我认为您为xy所做的一切都很好。 np.cumsum是这项工作的正确工具。

  • 要填写图表下方,请查看fill_between。在曲线和x轴之间填充。

  • 要在x轴上获取日期,只需使用dates代替x。或者,尝试使用plot_date而不是plot