Matplotlib Scatter не может использовать время в качестве оси X?

Мне нужно использовать matplotlib, scatter, чтобы нарисовать фигуру, которая использует время как x asix. Пример таков:

t=pd.DataFrame({'Time':pd.to_datetime(['07:42:34','08:01:20','10:12:32','14:20,37','18:36:27']).time,
                'Num':[3,3,3,3,3]})

Когда я рисую линию, используя следующий код:

plt.plot(t.loc[:,'Time'],t.loc[:,'Num'])
plt.show()

Фигура выглядит нормально:

Но если я использую следующий код для рисования точечной фигуры:

plt.scatter(t.loc[:,'Time'],t.loc[:,'Num'])
plt.show()

Тогда у меня есть следующая информация об ошибке:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Python35\lib\site-packages\matplotlib\pyplot.py", line 3378, in      scatter
    edgecolors=edgecolors, data=data, **kwargs)
  File "C:\Python35\lib\site-packages\matplotlib\__init__.py", line 1717, in inner
    return func(ax, *args, **kwargs)
  File "C:\Python35\lib\site-packages\matplotlib\axes\_axes.py", line 4032, in scatter
    alpha=alpha
  File "C:\Python35\lib\site-packages\matplotlib\collections.py", line 878, in __init__
    Collection.__init__(self, **kwargs)
  File "C:\Python35\lib\site-packages\matplotlib\collections.py", line 149, in __init__
    offsets = np.asanyarray(offsets, float)
  File "C:\Python35\lib\site-packages\numpy\core\numeric.py", line 544, in asanyarray
    return array(a, dtype, copy=False, order=order, subok=True)
TypeError: float() argument must be a string or a number, not 'datetime.time'

Кто-нибудь, пожалуйста, помогите мне здесь? Пожалуйста, объясните, почему это происходит и как нарисовать график рассеяния, используя время в качестве оси x. Я хочу просто время, без даты.

1 ответ

Решение

DataFrame.plot правильно работает с датой и временем при построении линий, но обычно имеет проблемы с другими типами графиков, такими как bar а также scatterplot

Несколько дешевый и простой обходной путь - просто использовать kind='line' (что по умолчанию) и установите ширину линии на ноль и укажите маркер.

t.plot(x='Time', y='Num', lw=0, marker='o', figsize=(8,4)) 

Другие вопросы по тегам