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
  • I think what you did to get x, y is fine. np.cumsum is the right tool for this job.

  • To fill below the plot, check out fill_between. Fill between the curve and the x-axis.

  • To get the dates on the x-axis, just use the dates instead of x. Or, try using plot_date instead of just plot.

于 2013-09-26T21:09:32.860 に答える