2016-07-01 12 views
9

I Unixのタイムスタンプされているのx、yのペアとxとyの両方として、次のデータサンプルを持っている:は、日付値をティック

1354648326,1354648326 
1354649456,1371775551 
1354649664,1429649819 
1354649667,1429644021 
1354649683,1356976159 
1354649767,1441369794 
1354649863,1414467362 
1354650486,1366297316 
1354650757,1456962664 
1354650789,1359398128 
1354651552,1354656458 
1354651555,1368631443 
1354651591,1456420412 
1354651616,1354651616 
1354651715,1444573208 
1354652048,1454443352 
1354652382,1394722546 
1354652687,1355993864 
1354653448,1387378662 
1354653731,1396094300 
1354653769,1417765024 
1354654110,1457230519 
1354654111,1452854788 
1354654179,1423877890 
1354654266,1355148505 
1354654374,1446848232 
1354654374,1456864004 
1354654615,1355858928 
1354654700,1456945892 
1354654707,1456265183 
1354654744,1442939141 
1354654747,1388436654 
1354654771,1449799848 
1354654775,1355177773 
1354654808,1456857861 
1354654809,1411369798 
1354654855,1355934384 
1354654915,1457100468 
1354654962,1388784204 
1354655085,1454446403 
1354655219,1364196550 
1354655232,1387214819 
1354655262,1377170885 
1354655264,1369689630 
1354655289,1388750388 
1354655389,1387387305 
1354655434,1389255185 
1354655436,1387165968 
1354655592,1374369153 
1354655661,1456912753 
1354655811,1354718201 
1354655889,1426675579 
1354656139,1420486774 

と私はせずに、散乱としてそれをプロットしたいのですが、 x軸とy軸に表示される醜いタイムスタンプ形式。 代わりに、(YYYY-MM-DD形式またはその他の判読可能な形式で)軸上に日付をプロットし、3か月間の違いを表示する必要がありました。

私は次のコードを持っている:さて、問題はそのxが

['2012-06-30', '2012-09-30', '2012-12-31', '2013-03-31', '2013-06-30', '2013-09-30', '2013-12-31', '2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31', '2015-03-31', '2015-06-30', '2015-09-30', '2015-12-31', '2016-03-31'] 
['2012-06-30', '2012-09-30', '2012-12-31', '2013-03-31', '2013-06-30', '2013-09-30', '2013-12-31', '2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31', '2015-03-31', '2015-06-30', '2015-09-30', '2015-12-31', '2016-03-31'] 

def getLabels(s,t): #s and t are unix time stamps 
    labels =[] 
    for x in pd.date_range(start=s, end=t, freq='3M'): 
     labels.append(str(x).replace(" 00:00:00","")) 
    print labels 
    return labels 

とのようなものを返します:getLabels(s,t)は次のように定義されて

ax.set_xticklabels(getLabels(s,t),rotation=20) 

を軸の目盛のラベルは、以前の日付の配列とまったく同じように表示されず、代わりに最初の6つの日付のみが表示されます(2012-09-30から2013-12-31まで)

どのような問題がありますか?

+0

あなたが与えたすべてのポイントの最初の要素は、同じ日(2012-12-04)に対応し、最初と最後の行の間に2時間以上の差はありません。ダニの3ヶ月間の普及について話している場合は、広がりの広いデータポイントのサンプルを提供すると役に立ちます。また、最小、完全、および検証可能な例(http://stackoverflow.com/help/mcve)を提供してください。 –

答えて

5

あなたの問題は、グラフに5つのティックしかないため、5つのラベルしか表示できないということです。すべてのラベルを表示する場合は、同じ数のティックがあることを確認する必要があります。

私はパンダがインストールされておらず、とにかく完全なデータがないので、ラベルを再作成できません。私はあなたが提供したラベルのリストを単純にコピーしました。また、ラベルからX軸の最小値&を「リバース・エンジニアリング」して、正しい場所にデータがプロットされるようにします。

次の行:ax.xaxis.set_ticks(np.arange(min_x, max_x, int((max_x-min_x)/len(labels)))) ラベルと同じ数のダニを持つようにします。

ラベルの水平方向のアライメントを変更しているので、ラベルがどれくらいの刻み目に対応しているかは分かりません。このデータスライスは正しい場所にプロットされているように見えるので、ラベルが適切な場所にあることは間違いありません。

は(明らかにy軸は同じ方法で処理することができる)あなたのX軸データの

import matplotlib.pyplot as plt 
import numpy as np 
import time 
import datetime 

labels =['2012-06-30', '2012-09-30', '2012-12-31', '2013-03-31', 
     '2013-06-30', '2013-09-30', '2013-12-31', '2014-03-31', 
     '2014-06-30', '2014-09-30', '2014-12-31', '2015-03-31', 
     '2015-06-30', '2015-09-30', '2015-12-31', '2016-03-31'] 
x = [] 
y = [] 
with open('data.txt','r') as myfile: 
    for line in myfile: 
     _x, _y = line.strip().split(',') 
     x.append(int(_x)) 
     y.append(int(_y)) 

min_x = int(time.mktime(datetime.datetime.strptime('2012-06-30','%Y-%m-%d').timetuple())) 
max_x = int(time.mktime(datetime.datetime.strptime('2016-03-31','%Y-%m-%d').timetuple())) 

print (datetime.datetime.fromtimestamp(min(x)).strftime('%Y-%m-%d')) 
# Confirm that we are plotting in the right place for this sample 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
ax.set_xlim(min_x, max_x) 
ax.xaxis.set_ticks(np.arange(min_x, max_x, int((max_x-min_x)/len(labels)))) 
ax.set_xticklabels(labels, rotation=20, horizontalalignment = 'right') 
ax.scatter(x,y) 
plt.show() 

enter image description here

1

制限のみ2012-12-05 06:12:06から2012-12-05 08:22:19です。期間を拡張する必要があります。あなたは、x軸を設定するには、このコードを使用することが

は、すべての3ヶ月のダニ:

import matplotlib.pyplot as plt 
from itertools import izip 
import datetime 
import numpy as np 
import pandas as pd 

def grouped(iterable, n): 
    return izip(*[iter(iterable)]*n) 

def getLabels(s,t): 
    labels =[] 
    for x in pd.date_range(start=s, end=t, freq='3M'): 
     labels.append(x.strftime("%Y-%m-%d")) 
    print labels 
    return labels 

arr = [1354648326,1354648326, 
1354649456,1371775551, 
... 
1354655889,1426675579, 
1354656139,1420486774] 

# convert timestamps to datetime objects 
X = list() 
Y = list() 
for x, y in grouped(arr, 2): 
    X.append(datetime.datetime.fromtimestamp(x)) 
    Y.append(datetime.datetime.fromtimestamp(y)) 

# range of X list is only one day: 2012-12-05 
# you have to enlarge data of X 
print np.min(X),np.max(X) 

# sample data 
data = np.random.uniform(-10, 10, size=len(X)*len(Y)) 

# plot 
plt.scatter(X, Y, s = data) 
ax = plt.gca() 
# set limits for X-axis 
ax.set_xlim([np.min(X),np.max(X)]) 
# generate labels 
xlabels = getLabels(np.min(X),np.max(X)) 
# set ticks and labels 
ax.set_xticks(xlabels) 
ax.set_xticklabels(xlabels,rotation=20) 

plt.show() 

私はあなたのデータにこのような何かを得るのx軸の範囲を拡大した場合:

... 
# plot 
plt.scatter(X, Y, s = data) 
ax = plt.gca() 
# set limits for X-axis 
xmin = datetime.datetime(2012,1,1,0,0,0) # np.min(X) 
xmax = xmin + datetime.timedelta(days = 360) # np.max(X) 
ax.set_xlim([xmin, xmax]) 
# generate labels every 3 month 
xlabels = getLabels(xmin, xmax) 
# set ticks and labels 
ax.set_xticks(xlabels) 
ax.set_xticklabels(xlabels,rotation=20) 
plt.show() 

enter image description here

もっと複雑な日時目盛りラベルが必要な場合は、このanswerをお読みください。

関連する問題