1

x 軸に日付を入れていくつかの線をプロットしたいのですが、見つけることができるすべての例では、12-31-2012 のようなアメリカン スタイルを使用しています。しかし、私は31.12.2012が欲しいのですが、日付フォーマッタをから変更するだけではうまくいかないようです

dateFormatter = dates.DateFormatter('%Y-%m-%d')

dateFormatter = dates.DateFormatter('%d.%m.%y')

私の日付リストは次のように機能します。「firstDay」を手動で定義してから、連続する X 日を生成します。その結果リストを印刷するとわかるように、これは機能します。しかし、そのリスト (num2date で変換) をプロットしたい場合、日付がまったく異なります。

たとえば、firstDay を 2012 年の 1 月 15 日である 734517.0 に設定します。

ここに私の完全なコードがあります:

import numpy as np
import matplotlib.pyplot as plot
import matplotlib.ticker as mticker
from matplotlib import dates
import datetime

fig = plot.figure(1)
DAU = (  2,  20,  25,  60, 190, 210,  18, 196, 212, 200, 160, 150, 185, 175, 316, 320, 294, 260, 180, 145, 135,  97,  84,  80,  60,  45,  37,  20,  20,  24,  39,  73,  99)
WAU = ( 50, 160, 412, 403, 308, 379, 345, 299, 258, 367, 319, 381, 461, 412, 470, 470, 468, 380, 290, 268, 300, 312, 360, 350, 316, 307, 289, 321, 360, 378, 344, 340, 346)
MAU = (760, 620, 487, 751, 612, 601, 546, 409, 457, 518, 534, 576, 599, 637, 670, 686, 574, 568, 816, 578, 615, 520, 499, 503, 529, 571, 461, 614, 685, 702, 687, 649, 489)

firstDay = 734517.0     #15. Januar 2012

#create an array with len(DAU) entries from given starting day...
dayArray = []
for i in xrange(len(DAU)):
    dayArray.append(firstDay + i)

#...and fill them with the converted dates
dayLabels = [dates.num2date(dayArray[j]) for j in xrange(len(DAU))]

for k in xrange(len(DAU)):
    print dayLabels[k]

spacing = np.arange(len(DAU)) + 1

line1 = plot.plot(spacing, DAU, 'o-', color = '#336699')
line2 = plot.plot(spacing, WAU, 'o-', color = '#993333')
line3 = plot.plot(spacing, MAU, 'o-', color = '#89a54e')

ax = plot.subplot(111)
plot.ylabel('', weight = 'bold')
plot.title('', weight = 'bold')
ticks, labels = plot.xticks(spacing, dayLabels)
plot.setp(labels, rotation = 90, fontsize = 11)

dateFormatter = dates.DateFormatter('%d.%m.%y')
ax.xaxis.set_major_formatter(dateFormatter)
#ax.fmt_xdata = dates.DateFormatter('%Y-%m-%d')
#fig.autofmt_xdate()

yMax = max(np.max(DAU), np.max(WAU), np.max(MAU))
yLimit = 100 - (yMax % 100) + yMax
plot.yticks(np.arange(0, yLimit + 1, 100))

plot.grid(True, axis = 'y')
plot.subplots_adjust(bottom = 0.5)
plot.subplots_adjust(right = 0.82)

legend = plot.legend((line1[0], line2[0], line3[0]),
                     ('DAU',
                     'WAU',
                     'MAU'),
                     'upper left',
                     bbox_to_anchor = [1, 1],
                     shadow = True)

frame = legend.get_frame()
frame.set_facecolor('0.80')
for t in legend.get_texts():
    t.set_fontsize('small')

plot.show()

この日付フォーマッタでも問題ありません。

ax.fmt_xdata = dates.DateFormatter('%Y-%m-%d')

ただし、タイムスタンプも表示されます。たとえば、 2012-01-15 00:00:00+00:00 です。誰かが時間の切り方を教えてくれたら、それは本当に素晴らしいことです!!

4

1 に答える 1

4

最も簡単な方法は、実際の Datetime オブジェクトを使用することだと私には思えます。このようにして、 を使用しdatetime.timedelta(days=i)て日付範囲を作成できます。また、日付が規則的でない場合、matplotlib は自動的に間隔を考慮します。また、matplotlib のデフォルトの日付形式オプションを使用することもできます。

簡単にするためにいくつかのコードを省略しましたが、これをスクリプトと組み合わせることができるはずです。

![import numpy as np
import matplotlib.pyplot as plot
import matplotlib.ticker as mticker
from matplotlib import dates
import datetime

fig = plot.figure(1)
DAU = (  2,  20,  25,  60, 190, 210,  18, 196, 212, 200, 160, 150, 185, 175, 316, 320, 294, 260, 180, 145, 135,  97,  84,  80,  60,  45,  37,  20,  20,  24,  39,  73,  99)
WAU = ( 50, 160, 412, 403, 308, 379, 345, 299, 258, 367, 319, 381, 461, 412, 470, 470, 468, 380, 290, 268, 300, 312, 360, 350, 316, 307, 289, 321, 360, 378, 344, 340, 346)
MAU = (760, 620, 487, 751, 612, 601, 546, 409, 457, 518, 534, 576, 599, 637, 670, 686, 574, 568, 816, 578, 615, 520, 499, 503, 529, 571, 461, 614, 685, 702, 687, 649, 489)

firstDay = datetime.datetime(2012,1,15)     #15. Januar 2012
   
dayArray = [firstDay + datetime.timedelta(days=i) for i in xrange(len(DAU))]

ax = plot.subplot(111)

line1 = ax.plot(dayArray, DAU, 'o-', color = '#336699')
line2 = ax.plot(dayArray, WAU, 'o-', color = '#993333')
line3 = ax.plot(dayArray, MAU, 'o-', color = '#89a54e')

ax.xaxis.set_major_formatter(dates.DateFormatter('%d.%m.%Y'))]

ここに画像の説明を入力

スクリプトとの主な違いは、dayArray作成方法 (およびプロット コマンドで x 値として使用される方法) と、x 軸の形式を設定する最後の行です。

于 2012-12-19T11:22:21.950 に答える