2017-08-15 92 views
6

Bir csv dosyasındaki verileri y eksenindeki değerler ve x eksenindeki tarih ile çiziyorum. Veri kümem yalnızca 15 yıllık bir süre boyunca Haziran, Temmuz ve Ağustos'tan verileri içerir. Ancak, bu verileri çizmeye çalıştığımda, csv dosyasında sadece yaz aylarında değil, tüm periyot boyunca x ekseni üzerindeki tüm tarihleri ​​çiziyor. Aşağıda İşte Tarih verileri x ekseni boyunca nasıl eşitlenir?

enter image description here

bu resim üretti kodu

gibi benim arsa şu anda görünür: Esasen

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') 

, ben arasındaki boşluklar olmadan bu aynı arsa almaya çalışıyorum her yılın verileri.

Verilerimin nipelinin neye benzediği (2002-2016 yılları arasında). Tarih sütunu (sütun L) dizelerden oluşur. Bu veri, sadece Excel'de görüntülenen bir csv dosyasından. sadece tek tip dizide karşı verileri çizmek istiyorum, sonra tarihlerine kene set gibi enter image description here

+1

Sen ayarlayabilirsiniz 'xticks' ama senin arsa saçma olacak sence? Grafiğin her yerinde bir kütle kapalı noktaya ve x ekseni boyunca her yerde eşit olmayan atlayışlara sahip olursunuz. Görsel olarak, mevcut grafiğinizle karşılaştırıldığında bu benim için anlamsız olurdu. – roganjosh

+1

Of * Üzgünüm, ve sorunuz "eşit olarak x ekseni boyunca", tam olarak sahip olduğunuz şeyleri belirtir. Senin arzun bir _uneven_ x-eksenine sahip olmak gibi görünüyor ve bu arsa ile daha fazlasını yapmayı planlamıyorsanız, gerçekten gördüğüm en kafa karıştırıcı grafiklerden biri olurdu. Bunu istediğine emin misin? – roganjosh

+0

Karışıklıklarınızın nerede olduğunu görebiliyorum. Tüm verilerim her yıl aynı üç aydan itibaren ideal olarak x ekseni daha çok okumak isterim: 06/2013, 07/2013, 08/2013, 06/2014, 07/2014, 08 /2014,...etc. Çizelgede olduğu gibi herhangi bir şey görmek zordur ve x ekseninin sadece bu üç aydan oluşmasını daha görsel olarak daha kullanışlı hale getireceğini düşünür. – glayne

cevap

3

Tarih aralıkları bir seçenek olabileceğinden birçok alt alan kullanmayı hayal edebiliyordum. Basitlik için, tüm verileri alt yazılara çizebilir, ancak alt bölümlerin her birini bir tarih aralığıyla sınırlayabilirsiniz.

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

Yani bu cevap o zaman ne istiyorsun? Aksi takdirde, muhtemelen ne kadar yardım etmediğini veya başka ne başarmak istediğinizi söylemek isteyebilirsiniz. Sadece soruya yeni eklenen verilere bakarak, yukarıdaki kodda uygulanması oldukça basit görünüyor. – ImportanceOfBeingErnest

+0

Dikey çizgilerin eklenmesi bu çizim için ayrılmazdır. Bunu hiç bir zaman mantıklı görmedim ama sanırım bu basit değişiklikle mümkün olabilir. – roganjosh

+0

@roganjosh Ne demek istiyorsun? Çizgiyi dikey çizgiler olmadan yapmak ister misiniz? (Buraya ücretsiz gelirler ve oldukça kullanışlıdırlar, çünkü arsaları bölüp okuyucunun kırık veri ekseni ile karıştırılmaması gibi bölüştürürler.) – ImportanceOfBeingErnest

1

O sesler

şöyle
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 (henüz) verileri belirtmediğinden, bu kesinlikle geçerli bir cevaptır. Ayda tam olarak bir veri noktasına sahip olduğunuz özel durum için kolay bir çözümdür. Şu anda, genel veriye nasıl genişletilebileceğinden emin değilim, ki burada rastgele veri noktalarına sahip olabilirsiniz ([yanıtım] 'daki gibi (https://stackoverflow.com/a/45716573/4124317)). – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Verilerimin OP'de nasıl göründüğüne dair bir ekran görüntüsü ekledim. – glayne

+0

Ah görüyorum @ImportanceOfBeingErnest, aşırı kalabalık önlemek için kene etiketleri, 'set_xticklabels (tarihler [:: 10])' bir atlama ekleyebilirsiniz sanırım ama ben genel durum için en iyi çözüm olmadığını kabul ediyorum. Cevabını yedim :) –