2014-04-17 15 views
8

Tak więc jestem nowy w programowaniu z matplotlib. Stworzyłem kolorystykę używając imshow() i tablicy. Początkowo oś była po prostu rzędem i kolumną mojej tablicy. Użyłem extent = (xmin, xmax, ymin, ymax), aby uzyskać odpowiednio oś x w czasie unixowym i wysokości.Daty w xaxis dla wykresu matplotlib z imshow

Chcę zmienić oś X z czasu unix (982376726,982377321) na UT (02:25:26, 02:35:21). Stworzyłem listę przedziału czasu w GG: MM: SS. Nie jestem pewien, jak zastąpić bieżącą oś X tymi nowymi numerami, bez zmiany koloru wykresu (lub spowodowania, że ​​zniknie).

Patrzyłem na datetime.time, ale się z tym pogubiłem.

Każda pomoc będzie bardzo ceniona!

+0

można podać jaki kod masz tak daleko? – Ffisegydd

Odpowiedz

18

Połączyłem kilka przykładowych kodów, które powinny pomóc w rozwiązaniu problemu.

Ten kod generuje najpierw dane zrandomizowane za pomocą numpy.random. Następnie oblicza limity x i y-limit, gdzie limity x będą oparte na dwóch znacznikach czasowych unix podanych w pytaniu, a limity y są tylko liczbami ogólnymi.

Kod następnie rysuje losowe dane i wykorzystuje metody pyplot do konwersji formatowania osi X na ładnie reprezentowane łańcuchy znaków (zamiast znaczników czasowych unix lub numerów tablic).

Kod jest dobrze skomentowany i powinien wyjaśnić wszystko, czego potrzebujesz, a jeśli nie, skomentuj i poproś o wyjaśnienia.

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

To było bardzo pomocne !! Żeby wyjaśnić, czy wątki są czymś, co zawsze powinienem robić, aby móc pracować z fabułą i toporami? – user3546200

+0

Nie niekoniecznie. Możesz użyć prostszego 'plt.plot', ale będziesz musiał zrobić' plt.xaxis_date() 'Myślę. Prawdopodobnie będziesz musiał także wykonać 'gca(). Xaxis.set_major_formatter (...)' gdzie funkcja 'gca' po prostu zwraca bieżący obiekt osi (odpowiednik tylko figi, siekiery na początku). – Ffisegydd

+0

Czy istnieje sposób, aby Matplotlib automatycznie wybrał rozdzielczość czasu na etykietach? Robi to normalnie (np. Używając 'plot()' z datami na osi X), ale jeśli pominę specyfikator formatu w 'DateFormatter' w twoim przykładzie, dostaję rok (np. [2015, 2015 , 2015, ...]). –

Powiązane problemy