Vẽ thời gian trong Python với Matplotlib


163

Tôi có một mảng dấu thời gian ở định dạng (HH: MM: SS.mmmmmm) và một mảng số dấu phẩy động khác, mỗi mảng tương ứng với một giá trị trong mảng dấu thời gian.

Tôi có thể vẽ thời gian trên trục x và các số trên trục y bằng Matplotlib không?

Tôi đã cố gắng, nhưng bằng cách nào đó nó chỉ chấp nhận mảng phao. Làm thế nào tôi có thể có được nó để âm mưu thời gian? Tôi có phải sửa đổi định dạng theo bất kỳ cách nào không?

Câu trả lời:


178

Trước tiên, bạn phải chuyển đổi dấu thời gian của mình sang datetimecác đối tượng Python (sử dụng datetime.strptime). Sau đó sử dụng date2numđể chuyển đổi ngày thành định dạng matplotlib.

Vẽ sơ đồ ngày và giá trị bằng cách sử dụng plot_date:

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

2
nó sẽ vẽ ngày hoặc chỉ thời gian? Tôi chỉ muốn thời gian kể từ khi chuyển đổi sang datetime, năm được đặt thành 1990.
RandomTh Think

"... khi chuyển đổi thành datetime, năm được đặt thành 1990": Bạn có thể vui lòng đăng mã bạn sử dụng để chuyển đổi từ chuỗi sang datetime không? Một cái gì đó có thể sai với việc chuyển đổi. Re. định dạng của nhãn biểu đồ, xem liên kết date_demo1 được cung cấp bởi JK Seppänen. Các tài liệu lib matplot là tuyệt vời, BTW. matplotlib.sourceforge.net/index.html
codeape

14
plot_dates -> matplotlib.pyplot.plot_date (ngày, giá trị)
Pete

3
Điều gì về một âm mưu phân tán? Tôi muốn cung cấp một mảng kích thước để xác định kích thước của các bong bóng phân tán, nhưng không có tương đương scatter_date()và không có cách rõ ràng / trực tiếp để có được biểu đồ này.
lùn 5/10/2016

4
Ở trên trả về một danh sách với một đối tượng loại: đối tượng matplotlib.lines.Line2D. Bây giờ làm thế nào để tôi sử dụng này để hiển thị biểu đồ?
Arindam Roychowdhury

87

Bạn cũng có thể vẽ các dấu thời gian, các cặp giá trị bằng cách sử dụng pyplot.plot (sau khi phân tích chúng từ biểu diễn chuỗi của chúng). (Đã thử nghiệm với các phiên bản matplotlib 1.2.0 và 1.3.1.)

Thí dụ:

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

Hình ảnh kết quả:

Sơ đồ đường


Đây giống như một âm mưu phân tán:

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

Tạo ra một hình ảnh tương tự như thế này:

Âm mưu phân tán


4
@andi nó sẽ hoạt động giống như trong ví dụ của tôi (đổi plotthành scatter).
moooeeeep

1
Tôi không hiểu tại sao đây là câu hỏi thứ 5 tôi gặp phải khi không ai thực sự TRIỆT sử dụng cốt truyện phân tán - nó không hoạt động. Type Error - invalid type promotion.
lùn

1
@dwanderson Sau đó, có thể bạn đang làm gì đó sai. Tôi đã thêm một ví dụ cho biểu đồ phân tán với datetime.datetimecác đối tượng trên trục x vào bài viết của mình.
moooeeeep

Đối với phần bổ sung lướiplt.grid(True)
Barshe Roussy

1
@AimForClarity Hoạt động với tôi với matplotlib.__version__2.2.2. Mặc dù, biểu đồ phân tán có một số giới hạn x quá rộng được đặt mặc định. Câu trả lời này dường như cung cấp một cách giải quyết khác ngoài điều chỉnh thủ công plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep

23

7 năm sau và mã này đã giúp tôi. Tuy nhiên, thời gian của tôi vẫn không hiển thị chính xác.

nhập mô tả hình ảnh ở đây

Sử dụng Matplotlib 2.0.0 và tôi đã phải thêm một đoạn mã sau từ Chỉnh sửa định dạng ngày của nhãn đánh dấu trục x trong matplotlib của Paul H.

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

Tôi đã thay đổi định dạng thành (% H:% M) và thời gian hiển thị chính xác. nhập mô tả hình ảnh ở đây

Tất cả là nhờ cộng đồng.


16

Tôi gặp rắc rối với điều này khi sử dụng phiên bản matplotlib: 2.0.2. Chạy ví dụ từ trên tôi có một bộ bong bóng xếp chồng ở giữa.

đồ thị với chồng bong bóng ở giữa

Tôi "sửa" vấn đề bằng cách thêm một dòng khác:

plt.plot([],[])

Toàn bộ đoạn mã trở thành:

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

Điều này tạo ra một hình ảnh với các bong bóng phân phối như mong muốn.

đồ thị với bong bóng phân phối theo thời gian


Không hoạt động trên py2.6 cho tôi. Tôi nhận được ValueError: giới hạn xem tối thiểu -0.05500000000000001 nhỏ hơn 1 và là giá trị ngày Matplotlib không hợp lệ. Điều này thường xảy ra nếu bạn chuyển một giá trị phi thời gian cho một trục có đơn vị thời gian <Hình kích thước 432x288 với 1 Trục>
AimForClarity

Một giải pháp cho các x-lims lạ là tự đặt chúng: stackoverflow.com/questions/21423158/
Kẻ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.