У меня есть данные, которые содержат 16 столбцов, из которых 1 столбец — это столбец «Время», а другие 15 столбцов — это столбцы, представляющие цвета. Данные выглядят так:
Что мне нужно, так это иметь график, на котором каждая временная метка представляет эти 15 цветов.
Вывод должен выглядеть так:
есть идеи как это сделать?
Спасибо!!
Привет @ user2246849, я пытался сделать это с помощью гистограммы matplotlib, использовал время как значение «x» и длину кадра данных как значение «y», затем добавил цвет из «SG15», но это не так. Работа.
Вместо использования bar
в таких случаях обычно удобнее использовать обычный plot
в сегментах. Вот игрушечный пример.
import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame({'Time':[0.3, 1.5, 1.8, 4.7, 5.8],
'SG1':['red', 'green', 'grey', 'yellow', 'red'],
'SG2':['grey', 'red', 'grey', 'yellow', 'grey'],
'SG3':['red', 'red', 'grey', 'yellow', 'red'],
'SG4':['red', 'green', 'grey', 'green', 'red']})
Time SG1 SG2 SG3 SG4
0 1 red grey red red
1 2 green grey red green
2 3 grey grey grey green
3 4 yellow yellow yellow green
4 5 red grey red red
Код:
LINE_THICKNESS = 10
FIG_SIZE = (4, 3) # Size (width, height).
f, ax = plt.subplots(figsize=FIG_SIZE)
groups = sorted([c for c in df.columns if 'SG' in c])
for i, group in enumerate(groups):
colors = df[group]
for (color, t0), t1 in zip(zip(colors, df['Time']), df['Time'][1:]):
ax.plot([t0, t1], [i, i], color=color, linewidth=LINE_THICKNESS)
plt.xlabel('Time')
plt.ylim([-0.5, len(groups)-0.5])
plt.yticks(range(len(groups)), groups)
plt.ylabel('Groups')
plt.title("Signal plan 2", weight='bold')
plt.tight_layout()
plt.show()
Который дает:
Вы можете поиграть с размерами LINE_THICKNESS
и FIG_SIZE
.
Обновлено:
zip
встроенная функция берет итерации и объединяет их в кортеж. Так:
zip(colors, df['Time'])
получает кортеж (color, time_start), чтобы связать временные точки с цветом. Назовем это time_colors
в следующей строке.zip(time_colors, df['Time'][1:])
аналогичным образом связывает кортежи (color, time_start) со следующей точкой времени. Это необходимо, чтобы знать предел, чтобы прекратить рисовать линию.Спасибо, это работает!! У меня только один вопрос: что означает "zip(zip(colors, df['Time']), df['Time'][1:])" во втором цикле for?
@Jan Zarcký Я отредактировал ответ с кратким объяснением. Я предлагаю вам научиться пользоваться zip
, это действительно полезно!
Вы уже пробовали что-то самостоятельно?