2017-08-15 38 views
6

मैं वाई-अक्ष पर मानों और एक्स-अक्ष पर दिनांक के साथ एक सीएसवी फ़ाइल से डेटा प्लॉट कर रहा हूं। मेरे डेटासेट में केवल जून, जुलाई और अगस्त से 15 वर्ष की अवधि में डेटा शामिल है। हालांकि, जब मैं इस डेटा को साजिश करने का प्रयास करता हूं, तो यह सीएसवी फ़ाइल में गर्मियों के महीनों की बजाय पूरे अवधि में एक्स-अक्ष पर सभी तिथियों को प्लॉट करता है। नीचे क्या मेरी साजिश वर्तमान में लग रहा हैएक्स-अक्ष के साथ समान रूप से दिनांक डेटा कैसे प्लॉट करें?

तरह

enter image description here

यहाँ कोड है कि इस छवि का उत्पादन किया है:

infile = r'data.csv' 

with open(infile,'r') as f: 
    data = list(reader(f)) 

date = [parser.parse(i[10]) for i in data[1:]] #3 
date = mdates.date2num(date) 
date = mdates.num2date(date) 

value = [i[16] for i in data[1:]] 

fig = plt.figure() 
plt.plot(date, value, '.r') 

अनिवार्य रूप से, मैं के बीच रिक्त स्थान के सभी के बिना इस एक ही भूखंड पाने के लिए कोशिश कर रहा हूँ प्रत्येक वर्ष का डेटा।

यहां मेरे डेटा का स्निपेट दिखता है (2002-2016 से वर्षों के साथ)। दिनांक कॉलम (कॉलम एल) तारों के होते हैं। यह डेटा एक्सेल में प्रदर्शित एक सीएसवी फ़ाइल से है। enter image description here

+1

आप सेट कर सकते हैं 'xticks' लेकिन मुझे लगता है अपने भूखंड अतर्कसंगत बन जाएगा? आपके पास ग्राफ पर सभी द्रव्यमान बिंदु और एक्स-अक्ष के साथ हर जगह असमान कूद होंगे। दृश्यमान, यह आपके वर्तमान ग्राफ की तुलना में मेरे लिए व्यर्थ होगा। – roganjosh

+1

* क्षमा करें, और आपका प्रश्न "एक्स-अक्ष के साथ समान रूप से" कहता है जो आपके पास पहले से ही है। आपकी इच्छा में _uneven_ x-axis होना प्रतीत होता है और जब तक कि आप उस साजिश के साथ कुछ और करने की योजना नहीं बनाते हैं, यह वास्तव में मैंने कभी देखा है कि सबसे भ्रमित ग्राफों में से एक होगा। क्या आप वाकई यह चाहते हैं? – roganjosh

+0

मैं देख सकता हूं कि आपका भ्रम कहां है। मेरा पूरा डेटा प्रत्येक वर्ष एक ही तीन महीनों से है, इसलिए आदर्श रूप में मैं एक्स-अक्ष को और अधिक पढ़ना चाहूंगा: 06/2013, 07/2013, 08/2013, 06/2014, 07/2014, 08 /2014,...etc। प्लॉट में कुछ भी देखना मुश्किल है, और ऐसा लगता है कि एक्स-अक्ष को केवल तीन महीनों में शामिल करना इसे और अधिक उपयोगी बना देगा। – glayne

उत्तर

3

मैं कई सबप्लॉट्स का उपयोग करके कल्पना कर सकता हूं क्योंकि दिनांक सीमाएं एक विकल्प हो सकती हैं। सादगी के लिए, आप सभी सबप्लॉट्स पर सभी डेटा प्लॉट कर सकते हैं, लेकिन प्रत्येक सबप्लॉट को एक दिनांक सीमा तक सीमित कर सकते हैं।

import numpy as np; np.random.seed(24191) 
import datetime 
import matplotlib.pyplot as plt 
import matplotlib.dates 

## generate some data x and y 
n= 1000 
year = np.random.randint(2000,2009, size=n) 
month = np.random.randint(6,9, size=n) 
day = np.random.randint(1,32, size=n) 
x = [datetime.date(y,m,d) for y,m,d in zip(year,month,day)] 
y = np.abs(np.random.randn(n)) 

## define the ranges for the dates 
drange = [[datetime.date(i,6,1),datetime.date(i,8,31)] for i in range(2000,2009)] 

## create as many subplots as there are date ranges 
fig, axes= plt.subplots(ncols=len(drange), sharey=True) 
fig.subplots_adjust(bottom=0.3,wspace=0) 

ymax = 1.1*y.max() 
## loop over subplots and limit each to one date range 
for i, ax in enumerate(axes): 
    ax.set_xlim(drange[i][0],drange[i][1]) 
    ax.set_ylim(0,ymax) 
    ax.scatter(x,y, s=4) 
    loc = matplotlib.dates.MonthLocator([6,7,8]) 
    fmt = matplotlib.dates.DateFormatter("%Y-%b") 
    ax.xaxis.set_major_locator(loc) 
    ax.xaxis.set_major_formatter(fmt) 
    plt.setp(ax.get_xticklabels(), rotation=90) 
    if i!=0: 
     ax.tick_params(axis="y", which="both", length=0) 

plt.show() 

enter image description here

+0

तो क्या यह जवाब है कि आप क्या चाहते हैं? यदि नहीं, तो आप शायद यह बताना चाहते हैं कि यह कितनी दूर तक मदद नहीं करता है या आप और क्या हासिल करना चाहते हैं। बस प्रश्न में नए जोड़े गए डेटा को देखते हुए, यह ऊपर दिए गए कोड में लागू करने के लिए बहुत सीधे आगे लगता है। – ImportanceOfBeingErnest

+0

लंबवत रेखाओं के अतिरिक्त इस साजिश के लिए अभिन्न अंग है। मैंने इसे समझने की कल्पना कभी नहीं की लेकिन मुझे लगता है कि यह उस साधारण संशोधन के साथ हो सकता है। – roganjosh

+0

@roganjosh आपका क्या मतलब है? क्या आप बिना लंबवत रेखाओं के साजिश रखना चाहते हैं? (वे यहां मुफ्त में आते हैं, और काफी आसान हैं, क्योंकि वे साजिश को विभाजित करते हैं जैसे पाठक टूटी हुई डेटा धुरी से उलझन में नहीं है।) – ImportanceOfBeingErnest

1

ऐसा लगता है तो आप बस एक समान सरणी के खिलाफ डेटा प्लॉट करना चाहते हैं और फिर दिनांकों को टिक सेट की तरह,

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

dates = ['06/2015','07/2015','08/2015', '06/2016','07/2016','08/2016'] 
x = [dt.datetime.strptime(d,'%m/%Y').date() for d in dates] 
y = range(len(x)) + np.random.random(len(x)) 

#Plot vs dates 
fig, ax = plt.subplots(2,1) 
ax[0].plot(x,y,'r.') 

#Plot vs number and label 
ax[1].plot(y,'r.') 
ax[1].set_xticks(range(len(y))) 
ax[1].set_xticklabels(dates) 
plt.show() 

कौन इस तरह दिखता है,

enter image description here

+0

चूंकि OP ने डेटा निर्दिष्ट नहीं किया है (अभी तक), यह निश्चित रूप से एक वैध उत्तर है। यह विशेष मामले के लिए एक आसान समाधान है जहां आपके पास प्रति माह बिल्कुल एक डेटा बिंदु है। मुझे वर्तमान में यह सुनिश्चित नहीं है कि इसे सामान्य मामले में कैसे विस्तारित किया जाए, जहां आपके मनमाना डेटा बिंदु हो सकते हैं (जैसे [मेरे उत्तर] से डेटा में (https://stackoverflow.com/a/45716573/4124317))। – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest मैंने ओपी में अपना डेटा कैसा दिखता है इसका एक स्क्रीन शॉट जोड़ा। – glayne

+0

आह मैं @ImportanceOfBeingErnest देखता हूं, मुझे लगता है कि आप टिक लेबल पर एक वगैरह जोड़ सकते हैं, 'set_xticklabels (तिथियां [:: 10])' ओवरक्रॉइडिंग को रोकने के लिए, लेकिन मैं मानता हूं कि यह सामान्य मामले के लिए सबसे अच्छा समाधान नहीं है। मैंने आपका जवाब ऊपर उठाया है :) –

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