web-dev-qa-db-ja.com

matplotlib xticks構文を理解する

私は本を​​読んでいて、このコードに出会いました:

import matplotlib.pyplot as plt
plt.scatter(x,y)
plt.title("Web traffic over the last month")
plt.xlabel("Time")
plt.ylabel("Hits/hour")
plt.xticks([w*7*24 for w in range(10)], 
  ['week %i'%w for w in range(10)])
plt.autoscale(tight=True)
plt.grid()
plt.show()

コンテキストでは、xは1時間に対応する整数の配列です。 yは、その特定の時間における(ユーザーからWebサイトへの)「ヒット」の配列です。

コードは1週間で表示できるようにすべての時間を蓄積することを理解していますしかし、誰かがこれらの関数が何をするのか説明してもらえますか?私の目標はこの行のすべての構文を理解することです

plt.xticks([w*7*24 for w in range(10)], 
  ['week %i'%w for w in range(10)])

具体的には:

  • rangeとは何ですか?

これが生成されます: enter image description here

追加のコンテキストのサンプルデータを次に示します。

1   2272
2   nan
3   1386
4   1365
5   1488
6   1337
7   1883
8   2283
9   1335
10  1025
11  1139
12  1477
13  1203
14  1311
15  1299
16  1494
17  1159
18  1365
19  1272
20  1246
21  1071
22  1876
23  nan
24  1410
25  925
26  1533
27  2104
28  2113
29  1993
30  1045
15
user1477388

範囲を理解するには、pythonを開いて、次のコマンドを順番に記述します。

 range(7) 
 range(4,8) 
 range(3,11,2)

Plt.xticks内のリスト内包表記の場合、それらは基本的にループを記述するコンパクトな方法です。それらは非常に一般的で、便利で、きちんとしています。それらを理解するために:

 [w*2 for w in range(10)] 
 [w*2 for w in range(10) if w < 4] 

最後に、コマンドplt.xticks自体について http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.xticks をチェックすると、簡単な例で非常に簡単な説明が得られます。

7
Jblasco

rangeは、与えられた引数のリストを作成するpython2の関数です:

range(5) -> [0,1,2,3,4]
range(1,5) -> [1, 2, 3, 4]

一般にrange(lower_index, upper_index+1)[ lower_index, upper_index]python2と同等のリストを生成します。

xrangeを使用してパフォーマンスを向上させることができます(遅延評価を使用し、必要なときに計算します)またはpython3rangexrangeとして動作しますpython2

今すぐ行:

plt.xticks([w*24*7 for w in range(10)],['week %i'%w for w in range(10)])

実際、xticksはx軸の目盛りまたは測定の間隔です。したがって、測定レベルはhoursであるため、週の1時間ごとに目盛りを付けるのが適切です(つまり、7 days * 24 hours)データセットの週、および2番目のリスト内包は、その1週間のlabel's間隔( week 0, week 1 .....)

注目すべき点の1つは、実際に本から使用したデータセットには748行あるため、およそ(748 /(24 * 7))= 4.45週間、

したがって、実際にrange(5)を使用してグラフをプロットできます。出力プロットがweek0-week4にスケーリングされる理由は、ラインplt.autoscale(tight=True)が原因であり、plt.autoscaleがない場合、プロットは次のように表示されますこの。wihtout plt.autoscale(tight=True) and plt.grid()

それが役に立てば幸い。

11
lazarus