Как отображать часы и минуты, когда они находятся в разных столбцах панд?

У меня есть кадр данных pandas, например:

 hour   minute     cnt
    0        0  904890
    0       30  880374
    1        0  848198
    1       30  816488
    2        0  791761

Я хотел бы построить cnt, используя minute в качестве второстепенных тиков, а hour - в качестве основного тика в matplotlib. Я пробовал несколько вещей, но они не работали. Вот один:

fig, ax = plt.subplots(figsize=(8,5))
df.plot(kind='line', y='cnt', ax=ax)
ax.set_xticks(df['minute'])
ax.set_xticklabels(df['minute'])

Я хотел бы, чтобы моя ось X выглядела как

|---+---+---+---+---+---+---+---|
0   15  30  45  0   30  45  0   15
0               1           2   ...

Спасибо.


person Dervin Thunk    schedule 25.06.2020    source источник


Ответы (1)


Я получаю этот результат:

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

с этим кодом:

# import
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA


# read data and generate time column
df = pd.read_csv('data.csv')
df['time'] = (df['hour'].astype(str) + ':' + df['minute'].astype(str)).apply(lambda x: pd.to_datetime(str(x), format = '%H:%M'))


# prepare figure object and axes
fig = plt.figure(figsize = (8, 6))
minutes = host_subplot(111, axes_class = AA.Axes, figure = fig)
plt.subplots_adjust(bottom = 0.1)
hours = minutes.twiny()


# move at the bottom the secondary axis
offset = -20
new_fixed_axis = hours.get_grid_helper().new_fixed_axis
hours.axis['bottom'] = new_fixed_axis(loc = 'bottom',
                                      axes = hours,
                                      offset = (0, offset))
hours.axis['bottom'].toggle(all = True)


# plot
minutes.plot(df['time'], df['cnt'])


# adjust minutes axis format, ticks and labels
minutes.xaxis.set_major_locator(md.MinuteLocator(byminute = range(0, 60, 15)))
minutes.xaxis.set_major_formatter(md.DateFormatter('%M'))
plt.setp(minutes.xaxis.get_majorticklabels(), rotation = 0)
minutes.set_xlim([df['time'].iloc[0], df['time'].iloc[-1]])


# adjust hours axis format, ticks and labels
hours.xaxis.set_major_locator(md.HourLocator(interval = 1))
hours.xaxis.set_major_formatter(md.DateFormatter('%H'))
hours.set_xlim([df['time'].iloc[0], df['time'].iloc[-1]])


# show the plot
plt.show()

Прежде всего, я создаю столбец datetime ('time'), чтобы объединить столбцы 'hour' и 'minute'. Затем я готовлю фигуру с двумя осями: основной для минут и второстепенной для часов. Затем я продолжаю манипулировать вторичной осью (перемещая ее вниз). Затем я наношу ваши данные на основную ось ('minutes') и, наконец, настраиваю формат основной и вторичной осей, отметки, ограничения и метки (в конечном итоге поворот меток).

person Andrea Blengino    schedule 25.06.2020