2016-07-01 5 views
9

मैं एक्स, वाई जोड़े और दोनों 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 

और मैं बिखराव के रूप में यह साजिश चाहते हैं, लेकिन बिना एक्स और वाई अक्ष पर दिखाया गया बदसूरत समय टिकट प्रारूप। इसके बजाय, मैं धुरी पर तारीखों को प्लॉट करना चाहता था (प्रारूप YYYY-MM-DD या किसी अन्य पठनीय प्रारूप में) और उन्हें 3 महीने के अंतर के साथ दिखाएं। जहां getLabels(s,t) के रूप में परिभाषित किया गया है

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

:

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 

और की तरह कुछ देता है:

मैं निम्नलिखित कोड है

['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'] 

अब, समस्या यह है कि एक्स है अक्ष टिक्स लेबल्स बिल्कुल ठीक नहीं दिखाए जाते हैं क्योंकि वे तिथियों की पिछली सरणी में हैं, इसके बजाय, यह केवल पहली 6 तिथियां दिखाती है (2012-09-30 से शुरू होती है और 2013-12-31 के साथ समाप्त होती है)

समस्या क्या है?

+0

आपके द्वारा दिए गए सभी बिंदुओं का पहला घटक उसी दिन (2012-12-04) से मेल खाता है, जिसमें पहली और आखिरी पंक्तियों के बीच दो घंटे से अधिक अंतर होता है। यदि आप टिकों के लिए 3 महीने के फैलाव के बारे में बात कर रहे हैं, तो यह उपयोगी होगा यदि आपने व्यापक प्रसार के साथ डेटा पॉइंट का नमूना दिया है। साथ ही, कृपया न्यूनतम, पूर्ण और सत्यापन योग्य उदाहरण प्रदान करने का प्रयास करें (http://stackoverflow.com/help/mcve) –

उत्तर

5

आपकी समस्या यह है कि आपके ग्राफ में केवल पांच टिक हैं, इसलिए यह केवल पांच लेबल प्रदर्शित कर सकता है। यदि आप सभी लेबल प्रदर्शित करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि आपके पास समान संख्या में टिक हों।

मेरे पास पांडा स्थापित नहीं हैं, और वैसे भी, पूर्ण डेटा नहीं है इसलिए लेबल फिर से नहीं बना सकते हैं। मैंने आपके द्वारा प्रदान किए गए लेबल की सूची कॉपी की है। मैंने लेबल्स से एक्स-अक्ष के लिए अधिकतम & अधिकतम 'रिवर्स-इंजीनियर' भी किया है (ताकि डेटा सही जगह पर प्लॉट हो)।

यह लाइन: ax.xaxis.set_ticks(np.arange(min_x, max_x, int((max_x-min_x)/len(labels)))) सुनिश्चित करता है कि आपके पास लेबल के समान संख्या में टिक हैं।

ध्यान दें कि मैंने लेबल के क्षैतिज संरेखण को भी बदल दिया है, यहां तक ​​कि जब भी squashed हो, यह अभी भी स्पष्ट है कि लेबल के साथ मेल खाता है। डेटा का यह टुकड़ा सही स्थान पर साजिश प्रतीत होता है, इसलिए मुझे पूरा यकीन है कि लेबल सही जगह पर हैं।

(जाहिर है y- अक्ष एक ही तरीके से इलाज किया जा सकता)

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

अपने x- अक्ष डेटा की सीमाएं केवल 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 पढ़ें।

संबंधित मुद्दे