Сроки Matplotlib
Я хочу взять Python DataFrame с кучей временных шкал в нем и построить их на одном рисунке. Индексы DataFrame представляют собой метки времени, и есть определенный столбец, который мы назовем "sequence", который содержит строки типа "A" и "B". Таким образом, DataFrame выглядит примерно так:
+--------------------------+---+
| 2014-07-01 00:01:00.0000 | A |
+--------------------------+---+
| 2014-07-01 00:02:00.0000 | B |
+--------------------------+---+
| 2014-07-01 00:04:00.0000 | A |
+--------------------------+---+
| 2014-07-01 00:08:00.0000 | A |
+--------------------------+---+
| 2014-07-01 00:08:00.0000 | B |
+--------------------------+---+
| 2014-07-01 00:10:00.0000 | B |
+--------------------------+---+
| 2014-07-01 00:11:00.0000 | B |
+--------------------------+---+
Я ищу сюжет примерно так:
B | * * **
A | * * *
+------------
Timestamp
1 ответ
Решение
Я просто сопоставил бы каждую категорию со значением y, используя словарь.
import random
import numpy as np
import matplotlib.pyplot as plt
import pandas
categories = list('ABCD')
# map categories to y-values
cat_dict = dict(zip(categories, range(1, len(categories)+1)))
# map y-values to categories
val_dict = dict(zip(range(1, len(categories)+1), categories))
# setup the dataframe
dates = pandas.DatetimeIndex(freq='20T', start='2012-05-05 13:00', end='2012-05-05 18:59')
values = [random.choice(categories) for _ in range(len(dates))]
df = pandas.DataFrame(data=values, index=dates, columns=['category'])
# determing the y-values from categories
df['plotval'] = df['category'].apply(cat_dict.get)
# make the plot
fig, ax = plt.subplots()
df['plotval'].plot(ax=ax, style='ks')
ax.margins(0.2)
# format y-ticks look up the categories
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, pos: val_dict.get(x)))
И я получаю:
Обратите внимание, что поскольку у вас, вероятно, уже есть фрейм данных, вы можете создать cat_dict
а также val_dict
как это:
# map categories to y-values
cat_dict = dict(zip(pandas.unique(df['category']), range(1, len(categories)+1)))
# map y-values to categories
val_dict = dict(zip(range(1, len(categories)+1), pandas.unique(df['category'])))