0

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

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

我绘制这个的第一个想法是首先在可能的日期范围内为每一天创建一个 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()

结果:

阴谋

我对此的问题:

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

1 回答 1

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

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

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

于 2013-09-26T21:09:32.860 回答