พล็อตเวลาใน Python ด้วย Matplotlib


164

ฉันมีอาเรย์ของการประทับเวลาในรูปแบบ (HH: MM: SS.mmmmmm) และอาเรย์ของตัวเลขจำนวนจุดลอยตัวอีกอันแต่ละอันสอดคล้องกับค่าในอาเรย์การประทับเวลา

ฉันสามารถกำหนดเวลาบนแกน x และตัวเลขบนแกน y โดยใช้ Matplotlib ได้หรือไม่?

ฉันพยายาม แต่อย่างใดมันก็แค่ยอมรับอาร์เรย์ของการลอย ฉันจะทำให้มันวางแผนเวลาได้อย่างไร ฉันต้องแก้ไขรูปแบบหรือไม่?

คำตอบ:


178

ก่อนอื่นคุณต้องแปลงการประทับเวลาของคุณเป็นdatetimeวัตถุPython (ใช้datetime.strptime) จากนั้นใช้date2numเพื่อแปลงวันที่เป็นรูปแบบ matplotlib

เขียนวันที่และค่าโดยใช้plot_date:

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

3
มันจะพล็อตเดทหรือแค่เวลา? ฉันต้องการเวลาตั้งแต่การแปลงเพื่อ datetime ปีจะถูกกำหนดให้ปี 1990
randomThought

"... ในการแปลงเป็นวันที่และเวลาปีถูกตั้งค่าเป็นปี 1990": คุณช่วยกรุณาโพสต์รหัสที่คุณใช้ในการแปลงจากสตริงเป็นวันที่และเวลาได้หรือไม่? มีบางอย่างผิดปกติกับการเปลี่ยนใจเลื่อมใส เรื่อง การจัดรูปแบบของฉลากแผนภูมิดูลิงค์ date_demo1 ที่จัดทำโดย JK Seppänen เอกสารประกอบการ matplot lib เป็นเลิศ BTW matplotlib.sourceforge.net/index.html
codeape

14
plot_dates -> matplotlib.pyplot.plot_date (วันที่, ค่า)
Pete

3
สิ่งที่เกี่ยวกับพล็อตกระจาย ฉันต้องการให้อาร์เรย์มีขนาดเพื่อกำหนดขนาดของฟองอากาศ แต่ไม่มีอะไรเทียบเท่าscatter_date()และไม่มีวิธีที่ชัดเจน / ตรงเพื่อให้ได้กราฟนี้
dwanderson

4
ด้านบนส่งคืนรายการที่มีหนึ่งประเภทของวัตถุ: matplotlib.lines.Line2D วัตถุ ตอนนี้ฉันจะใช้สิ่งนี้เพื่อแสดงกราฟได้อย่างไร
Arindam Roychowdhury

87

คุณสามารถพล็อตเวลาประทับคู่ของค่าโดยใช้pyplot.plot (หลังจากแยกวิเคราะห์จากการแสดงสตริง) (ทดสอบกับ matplotlib เวอร์ชัน 1.2.0 และ 1.3.1)

ตัวอย่าง:

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

ภาพผลลัพธ์:

พล็อตสาย


นี่คือพล็อตของการกระจาย:

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

สร้างภาพที่คล้ายกับสิ่งนี้:

แผนการกระจาย


4
@ และมันควรจะทำงานเช่นเดียวกับในตัวอย่างของฉัน (เปลี่ยนplotเป็นscatter)
moooeeeep

1
ผมไม่เข้าใจว่าทำไมนี้เป็นคำถามที่ 5 ผมเคยพบที่ไม่มีใครได้จริงพยายามใช้พล็อตที่กระจาย - มันไม่ทำงาน Type Error - invalid type promotion.
dwanderson

1
@dwanderson จากนั้นบางทีคุณอาจทำอะไรผิดพลาด ฉันได้เพิ่มตัวอย่างสำหรับพล็อตกระจายที่มีdatetime.datetimeวัตถุบนแกน x ลงในโพสต์ของฉัน
moooeeeep

สำหรับตารางเพิ่มplt.grid(True)
Christophe Roussy

1
@AimForClarity ใช้งานได้กับฉันด้วยmatplotlib.__version__2.2.2 พล็อตกระจายมีความกว้าง x เกินขีด จำกัด ที่ตั้งไว้เป็นค่าเริ่มต้น คำตอบนี้ดูเหมือนจะให้วิธีแก้ปัญหาอื่นนอกจากการปรับด้วยตนเองplt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep

23

7 ปีต่อมาและรหัสนี้ช่วยฉัน อย่างไรก็ตามเวลาของฉันยังคงไม่ปรากฏขึ้นอย่างถูกต้อง

ป้อนคำอธิบายรูปภาพที่นี่

การใช้ Matplotlib 2.0.0 และฉันต้องเพิ่มโค้ดต่อไปนี้เล็กน้อยจากการแก้ไขการจัดรูปแบบวันที่ของเลเบลเห็บแกน x ใน matplotlibโดย Paul H.

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

ฉันเปลี่ยนรูปแบบเป็น (% H:% M) และเวลาแสดงอย่างถูกต้อง ป้อนคำอธิบายรูปภาพที่นี่

ขอบคุณทุกชุมชน


16

ฉันมีปัญหากับเรื่องนี้โดยใช้เวอร์ชัน matplotlib: 2.0.2 การเรียกใช้ตัวอย่างจากด้านบนฉันได้ชุดฟองที่เรียงซ้อนกันเป็นศูนย์กลาง

กราฟที่มีฟองสบู่ที่อยู่กึ่งกลาง

ฉัน "แก้ไข" ปัญหาโดยเพิ่มอีกบรรทัด:

plt.plot([],[])

ข้อมูลโค้ดทั้งหมดกลายเป็น:

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

สิ่งนี้จะสร้างภาพที่มีฟองอากาศกระจายตามที่ต้องการ

กราฟที่มีฟองอากาศกระจายอยู่ตามเวลา


ใช้งานไม่ได้กับ py2.6 สำหรับฉัน ฉันได้รับ ValueError: จำนวนการดูขั้นต่ำ -0.05500000000000001 น้อยกว่า 1 และเป็นค่าวันที่ของ Matplotlib ที่ไม่ถูกต้อง สิ่งนี้มักจะเกิดขึ้นหากคุณส่งค่าที่ไม่ใช่วันที่และเวลาไปยังแกนที่มีหน่วยข้อมูลและเวลา <รูปขนาด 432x288 พร้อม 1 แกน>
AimForClarity

วิธีแก้ปัญหาสำหรับ x-lims ที่แปลกประหลาดคือการตั้งค่าด้วยตัวคุณเอง: stackoverflow.com/questions/21423158/…
Qaswed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.