Merencanakan waktu dengan Python dengan Matplotlib

163

Saya memiliki array cap waktu dalam format (HH: MM: SS.mmmmmm) dan array lain dari angka floating point, masing-masing sesuai dengan nilai dalam array timestamp.

Bisakah saya merencanakan waktu pada sumbu x dan angka pada sumbu y menggunakan Matplotlib?

Saya berusaha, tetapi entah bagaimana itu hanya menerima array float. Bagaimana saya dapat mengatur waktu? Apakah saya harus memodifikasi format dengan cara apa pun?

Pemikiran acak
sumber

Jawaban:

178

Anda harus terlebih dahulu mengonversi cap waktu Anda menjadi datetimeobjek Python (gunakan datetime.strptime). Kemudian gunakan date2numuntuk mengonversi tanggal ke format matplotlib.

Plot tanggal dan nilai menggunakan plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)
kode kode
sumber
2
apakah ini akan merencanakan tanggal atau hanya waktu? Saya hanya ingin waktu sejak konversi ke datetime, tahun ini diatur ke 1990.
randomThought
"... pada konversi ke datetime, tahun ditetapkan ke 1990": Bisakah Anda memposting kode yang Anda gunakan untuk mengkonversi dari string ke datetime? Mungkin ada yang salah dengan konversi. Kembali. pemformatan label bagan, lihat tautan date_demo1 yang disediakan oleh JK Seppänen. Dokumentasi lib matplot sangat bagus, BTW. matplotlib.sourceforge.net/index.html
codeape
14
plot_dates -> matplotlib.pyplot.plot_date (tanggal, nilai)
Pete
3
Bagaimana dengan sebaran plot? Saya ingin memberikan ukuran array untuk menentukan ukuran gelembung pencar, tetapi tidak ada yang setara scatter_date(), dan tidak ada cara yang jelas / langsung untuk mendapatkan grafik ini.
dwanderson
4
Di atas mengembalikan daftar dengan satu objek tipe: objek matplotlib.lines.Line2D. Sekarang bagaimana saya menggunakan ini untuk menampilkan grafik?
Arindam Roychowdhury
87

Anda juga bisa memplot stempel waktu, pasangan nilai menggunakan pyplot.plot (setelah mem- parsing mereka dari representasi string mereka). (Diuji dengan versi matplotlib 1.2.0 dan 1.3.1.)

Contoh:

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

Gambar yang dihasilkan:

Plot Garis


Berikut sama dengan sebaran plot:

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

Menghasilkan gambar yang mirip dengan ini:

Plot sebar

moooeeeep
sumber
4
@andi itu harus berfungsi seperti pada contoh saya (ubah plotke scatter).
moooeeeep
1
Saya tidak mengerti mengapa ini adalah pertanyaan ke-5 yang saya temui di mana tidak ada yang benar-benar MENCOBA menggunakan sebar plot - tidak berhasil. Type Error - invalid type promotion.
dwanderson
1
@dwanderson Lalu, mungkin Anda melakukan sesuatu yang salah. Saya telah menambahkan contoh untuk plot pencar dengan datetime.datetimeobjek pada sumbu x ke posting saya.
moooeeeep
Untuk grid tambahkanplt.grid(True)
Christophe Roussy
1
@AimForClarity Bekerja untuk saya dengan matplotlib.__version__2.2.2. Plot sebar memiliki beberapa batas x terlalu lebar yang ditetapkan secara default. Jawaban ini tampaknya memberikan solusi selain menyesuaikan secara manual plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep
23

7 tahun kemudian dan kode ini membantu saya. Namun, waktu saya masih tidak muncul dengan benar.

masukkan deskripsi gambar di sini

Menggunakan Matplotlib 2.0.0 dan saya harus menambahkan sedikit kode berikut dari Mengedit format tanggal label centang x-axis di matplotlib oleh Paul H.

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

Saya mengubah format menjadi (% H:% M) dan waktu ditampilkan dengan benar. masukkan deskripsi gambar di sini

Semua berkat komunitas.

GeorgeLPerkins
sumber
16

Saya mengalami masalah dengan ini menggunakan versi matplotlib: 2.0.2. Menjalankan contoh dari atas saya mendapat satu set gelembung ditumpuk terpusat.

grafik dengan tumpukan gelembung terpusat

Saya "memperbaiki" masalah dengan menambahkan baris lain:

plt.plot([],[])

Seluruh potongan kode menjadi:

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

Ini menghasilkan gambar dengan gelembung yang didistribusikan sesuai keinginan.

grafik dengan gelembung yang didistribusikan dari waktu ke waktu

Gereja
sumber
Tidak bekerja pada py2.6 untuk saya. Saya mendapatkan ValueError: batas tampilan minimum -0.05500000000000001 kurang dari 1 dan merupakan nilai tanggal Matplotlib yang tidak valid. Ini sering terjadi jika Anda meneruskan nilai non-datetime ke sumbu yang memiliki unit datetime <Gambar ukuran 432x288 dengan 1 Axes>
AimForClarity
Solusi untuk x-lims aneh adalah mengaturnya sendiri: stackoverflow.com/questions/21423158/…
Qaswed