matplotlib 3d график

У меня есть список дат в формате 15/10/2017

Я попробовал следующее

 from matplotlib import pyplot import pandas as pd dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"] dates_formatted = [pd.to_datetime(d) for d in dates ] x = [1,2,3,4] z = [5,6,7,8] pyplot.scatter(x, dates_formatted, z) pyplot.show() 

Он выдает ошибку TypeError: ufunc 'sqrt' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Он показывает, является ли это 2D. например pyplot.scatter(x, dates_formatted)

Я также попробовал следующее

 ax = Axes3D(fig) ax = fig.add_subplot(111,projection='3d') ax.scatter(x, dates_formatted, y) pyplot.show() 

Он выдает ошибку. Float() argument must be a string or number

Не всегда тривиально говорить matplotlib как переводить строки в систему координат. Почему бы просто не установить пользовательские метки меток для осей?

 import pandas as pd from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt fig = plt.figure('scatter dates') ax = fig.add_subplot(111, projection='3d') dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"] dates_formatted = [pd.to_datetime(d) for d in dates ] x = [1,2,3,4] y = [9,10,11,12] z = [5,6,7,8] ax.scatter(x, y, z) ax.xaxis.set_ticks(x) ax.xaxis.set_ticklabels(dates_formatted) plt.show() 

введите описание изображения здесь

Scatter ожидает число. Таким образом, вы можете конвертировать свои даты в номер следующим образом:

 y = [ (d-min(dates_formatted)).days for d in dates_formatted] 

Теперь вы можете построить данные как

 pyplot.scatter(x, y) 

Для 3D-сюжета вы можете попробовать что-то вроде этого …

 import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D plt.ion() x = [1,2,3,4] z = [5,6,7,8] dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"] dates_formatted = [pd.to_datetime(d) for d in dates] y = [ (d-min(dates_formatted)).days for d in dates_formatted] fig = plt.figure() ax = fig.add_subplot(111, projection='3d') plt.scatter(x, y, z) 

Ось y теперь в днях. Вы можете изменить это, найдя строку даты и изменив ее обратно …

 dt = [ pd.Timedelta(d) + min(dates_formatted) for d in ax.get_yticks()] 

Преобразуйте их в строки …

 dtStr = [d.isoformat() for d in dt] 

И верните их обратно

 ax.set_yticklabels(dtStr)