нужна помощь для 3D-сюжета по серии datetime в matplotlib - PullRequest
1 голос
/ 08 марта 2020
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.gca(projection = '3d')

x = np.zeros((2, 24), dtype = 'datetime64[h]')
x[0,  : ] = np.arange('2020-02-27', '2020-02-28', dtype = 'datetime64[h]')
x[1,  : ] = np.arange('2020-02-28', '2020-02-29', dtype = 'datetime64[h]')

y = np.zeros((2, 24), dtype = 'datetime64[D]')
y[0, : ] = np.array(['2020-02-27' for i in range(24)])
y[1, : ] = np.array(['2020-02-28' for i in range(24)])

z = np.zeros((2, 24))
z[0,  : ] = np.arange(24)
z[1,  : ] = np.arange(24)

surf = ax.plot_surface(x, y, z)

plt.show()

Я хочу построить 3D лайки ниже:

enter image description here

Но появляется сообщение об ошибке ниже: «Аргумент TypeError: float () должен быть строка или число, а не datetime.timedelta "

Как мне это сделать?

1 Ответ

1 голос
/ 09 марта 2020

Хотя есть функция plot_date для работы на datetime.timedelta, в вашем случае вы не можете использовать эту функцию в 3D. Вместо этого вы можете создать массив int / float для представления этих данных, преобразовав даты в числа, используя matplotlib.dates.date2num(). Затем вы можете установить метки в любом формате, который вы хотите. Я использовал значение по умолчанию timedelta ниже.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.dates as dates

fig = plt.figure()
ax = fig.gca(projection = '3d')

x = np.zeros((2, 24), dtype = 'datetime64[h]')
x[0,  : ] = np.arange('2020-02-27', '2020-02-28', dtype = 'datetime64[h]')
x[1,  : ] = np.arange('2020-02-28', '2020-02-29', dtype = 'datetime64[h]')
# convert the datetime to num
xt = [[dates.date2num(d) for d in xi] for xi in x]

y = np.zeros((2, 24), dtype = 'datetime64[D]')
y[0, : ] = np.array(['2020-02-27' for i in range(24)])
y[1, : ] = np.array(['2020-02-28' for i in range(24)])
# convert the datetime to num
yt = [[dates.date2num(d) for d in yi] for yi in y]

z = np.zeros((2, 24))
z[0,  : ] = np.arange(24)
z[1,  : ] = np.arange(24)

surf = ax.plot_surface(xt, yt, z)
# set x labels as diff in hours
ax.set_xticklabels(x[0]-min(x[0]))
# set y labels as the two dates 
ax.set_yticklabels([y[0][0],'','','','',y[1][0]])
plt.show()

Результат как ниже. enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...