Matplotlib ile Python'da çizim zamanı


164

(HH: MM: SS.mmmmmm) biçiminde zaman damgaları dizi ve kayan nokta sayıları, her zaman damgası dizisindeki bir değere karşılık gelen başka bir dizi var.

Matplotlib kullanarak x ekseni üzerindeki zamanı ve y ekseni üzerindeki sayıları çizebilir miyim?

Yapmaya çalışıyordum, ama bir şekilde sadece şamandıra dizilerini kabul ediyordu. Zamanı çizmeyi nasıl alabilirim? Biçimi herhangi bir şekilde değiştirmem gerekiyor mu?

Yanıtlar:


178

Önce zaman damgalarınızı Python datetimenesnelerine dönüştürmelisiniz (kullanın datetime.strptime). Ardından date2numtarihleri ​​matplotlib biçimine dönüştürmek için kullanın .

Tarihleri ​​ve değerleri aşağıdakileri kullanarak çizin plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)

3
Tarihi mi yoksa sadece zamanı mı çizecek? Sadece datetime'a
geçişten

"... datetime'a dönüştürüldüğünde, yıl 1990 olarak ayarlandı": Lütfen dizeden datetime'a dönüştürmek için kullandığınız kodu gönderir misiniz? Dönüşümde bir sorun olabilir. Yeniden. grafik etiketlerinin biçimlendirilmesi için JK Seppänen tarafından sağlanan date_demo1 bağlantısına bakın. Matplot lib belgeleri mükemmel, BTW. matplotlib.sourceforge.net/index.html
codeape

14
plot_dates -> matplotlib.pyplot.plot_date (tarihler, değerler)
Pete

3
Dağılım grafiğine ne dersiniz? Dağılım kabarcıklarının boyutunu belirlemek için bir boyut dizisi sağlamak istiyorum, ancak eşdeğer scatter_date()ve bu grafiği almak için hiçbir belirgin / doğrudan yolu yoktur.
dwanderson

4
Yukarıda bir nesne türü olan bir liste döndürülür: matplotlib.lines.Line2D object. Şimdi bunu grafiği göstermek için nasıl kullanabilirim?
Arindam Roychowdhury

87

Ayrıca zaman damgasını, değer çiftlerini pyplot.plot kullanarak (dize gösterimlerinden ayrıştırdıktan sonra) çizebilirsiniz . (Matplotlib 1.2.0 ve 1.3.1 sürümleriyle test edilmiştir.)

Misal:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

Ortaya çıkan resim:

Çizgi Grafiği


Dağılım grafiğiyle aynı:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.scatter(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

Buna benzer bir görüntü üretir:

Dağılım grafiği


4
@andi o (değişim benim örnekte olduğu gibi sadece çalışmalıdır plotiçin scatter).
moooeeeep

1
Bunun neden hiç kimsenin gerçekten bir dağılım grafiği kullanarak TRIED yapmadığı karşılaştığım 5. soru olduğunu anlamıyorum - işe yaramıyor. Type Error - invalid type promotion.
dwanderson

1
@dwanderson O zaman, belki yanlış bir şey yapıyorsunuzdur. Yazıma datetime.datetimex eksenindeki nesnelerle dağılım grafiği için bir örnek ekledim .
moooeeeep

Izgara eklemek içinplt.grid(True)
Christophe Roussy

1
@AimForClarity matplotlib.__version__2.2.2 ile benim için çalışıyor . Ancak dağılım grafiğinde varsayılan olarak ayarlanmış aşırı geniş x sınırları vardır. Bu yanıtın manuel olarak ayarlama dışında bir çözüm sağladığı görülüyor plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep

23

7 yıl sonra bu kod bana yardımcı oldu. Ancak, zamanlarım hala doğru görünmüyordu.

resim açıklamasını buraya girin

Matplotlib 2.0.0 kullanarak ve Paul H tarafından matplotlib x ekseni kene etiketlerin tarih biçimlendirmesini düzenleme gelen aşağıdaki kod biti eklemek zorunda kaldı .

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)

Biçimi (% H:% M) olarak değiştirdim ve saat doğru görüntülendi. resim açıklamasını buraya girin

Topluluğa teşekkürler.


16

Matplotlib sürüm 2.0.2 kullanarak bu sorun vardı. Yukarıdaki örneği çalıştırarak ortalanmış bir yığın kabarcıklar aldım.

Ortalanmış kabarcık yığını ile grafik

Başka bir satır ekleyerek sorunu "düzelttim":

plt.plot([],[])

Kod pasajının tamamı:

import datetime
import random
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


# make up some data
x = [datetime.datetime.now() + datetime.timedelta(minutes=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot([],[])
plt.scatter(x,y)

# beautify the x-labels
plt.gcf().autofmt_xdate()
myFmt = mdates.DateFormatter('%H:%M')
plt.gca().xaxis.set_major_formatter(myFmt)

plt.show()
plt.close()

Bu, kabarcıkların istendiği gibi dağıtıldığı bir görüntü üretir.

zaman içinde dağıtılmış kabarcıkları ile grafik


Benim için py2.6 üzerinde çalışmıyor. ValueError: minimum görüntüleme limiti -0.05500000000000001 1'den küçük ve geçersiz bir Matplotlib tarih değeri. Bu genellikle datetime olmayan bir değeri <1 Eksenli Şekil boyutu 432x288 olan bir eksene datetime dışı bir değer iletirseniz
AimForClarity

Garip x-
lims
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.