2014-04-17 21 views
8

Vì vậy, tôi mới để lập trình với matplotlib. Tôi đã tạo một ô màu bằng cách sử dụng imshow() và một mảng. Lúc đầu, trục chỉ là số hàng và cột của mảng của tôi. Tôi sử dụng mức độ = (xmin, xmax, ymin, ymax) để có được trục x trong thời gian và độ cao unix, tương ứng.Ngày trong xaxis cho một âm mưu matplotlib với imshow

Tôi muốn thay đổi trục x từ thời gian unix (982376726,982377321) thành UT (02:25:26, 02:35:21). Tôi đã tạo danh sách khoảng thời gian trong HH: MM: SS. Tôi không chắc chắn làm thế nào để thay thế trục x hiện tại của tôi với những con số mới, mà không thay đổi âm mưu màu (hoặc làm cho nó biến mất).

Tôi đã xem datetime.time nhưng tôi đã nhầm lẫn với nó.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+0

Bạn có thể cung cấp những gì mã bạn có cho đến nay? – Ffisegydd

Trả lời

18

Tôi đã đặt cùng một số mã mẫu để giúp bạn giải quyết vấn đề của mình.

Mã trước tiên tạo một số dữ liệu ngẫu nhiên bằng cách sử dụng numpy.random. Sau đó nó tính toán các giới hạn x và giới hạn y của bạn, nơi các giới hạn x sẽ dựa trên hai dấu thời gian unix được đưa ra trong câu hỏi của bạn và các giới hạn y chỉ là các số chung.

Mã sau đó vẽ dữ liệu ngẫu nhiên và sử dụng các phương thức pyplot để chuyển đổi định dạng trục x thành chuỗi đại diện độc đáo (thay vì dấu thời gian hoặc số mảng).

Mã này cũng được nhận xét và nên giải thích mọi thứ bạn cần, nếu không vui lòng nhận xét và yêu cầu làm rõ.

import numpy as np 
import matplotlib.pyplot as plt 

import matplotlib.dates as mdates 

import datetime as dt 

# Generate some random data for imshow 
N = 10 
arr = np.random.random((N, N)) 

# Create your x-limits. Using two of your unix timestamps you first 
# create a list of datetime.datetime objects using map. 
x_lims = list(map(dt.datetime.fromtimestamp, [982376726, 982377321])) 

# You can then convert these datetime.datetime objects to the correct 
# format for matplotlib to work with. 
x_lims = mdates.date2num(x_lims) 

# Set some generic y-limits. 
y_lims = [0, 100] 

fig, ax = plt.subplots() 

# Using ax.imshow we set two keyword arguments. The first is extent. 
# We give extent the values from x_lims and y_lims above. 
# We also set the aspect to "auto" which should set the plot up nicely. 
ax.imshow(arr, extent = [x_lims[0], x_lims[1], y_lims[0], y_lims[1]], 
      aspect='auto') 

# We tell Matplotlib that the x-axis is filled with datetime data, 
# this converts it from a float (which is the output of date2num) 
# into a nice datetime string. 
ax.xaxis_date() 

# We can use a DateFormatter to choose how this datetime string will look. 
# I have chosen HH:MM:SS though you could add DD/MM/YY if you had data 
# over different days. 
date_format = mdates.DateFormatter('%H:%M:%S') 

ax.xaxis.set_major_formatter(date_format) 

# This simply sets the x-axis data to diagonal so it fits better. 
fig.autofmt_xdate() 

plt.show() 

Example plot

+0

Điều đó rất hữu ích !! Chỉ cần làm rõ, là những điều mà tôi nên luôn luôn làm để có thể làm việc với cốt truyện và các trục? – user3546200

+0

Không nhất thiết. Bạn có thể sử dụng 'plt.plot' đơn giản hơn nhưng bạn sẽ phải làm' plt.xaxis_date() 'tôi nghĩ. Bạn cũng có thể phải làm 'gca(). Xaxis.set_major_formatter (...)' trong đó hàm 'gca' đơn giản trả về đối tượng trục hiện tại (tương đương với chỉ có vả, rìu ở đầu). – Ffisegydd

+0

Có cách nào để Matplotlib tự động chọn độ phân giải thời gian trong nhãn không? Nó thực hiện điều này bình thường (ví dụ, khi sử dụng 'plot()' với các ngày trên trục x), nhưng nếu tôi bỏ qua trình định dạng định dạng trong 'DateFormatter' trong ví dụ của bạn, tôi chỉ nhận được năm (ví dụ: [2015, 2015 , 2015, ...]). –

Các vấn đề liên quan