Я пытаюсь создать такой сюжет график в matplotlib

На основе фрейма данных pandas, построенного следующим образом:

   2020-01-01  2020-01-02  2020-01-03  ...
X    yellow        red         red     ...
Y    orange       orange       red     ...
Z     red         yellow     yellow    ...
...   ...          ...         ...     ...

Я думал, что это можно сделать с помощью двухмерных гистограмм, но мне не повезло. Я видел, что pcolor может быть той функцией, которую я ищу, но я не могу управлять ею для работы с моим фреймворком временной серии.

0
Andrea italo 31 Мар 2021 в 02:40

1 ответ

Лучший ответ

Вы можете строить с помощью seaborn. Вам нужно заменить цвета на числа, так что у вас будет такой фрейм данных:

dataframe

И вы можете использовать sns.heatmap для построения:

heatmap

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns

data = {'date': pd.date_range("2020-01-01", "2020-01-31", freq="1D").strftime('%d %b'),
        'a': np.random.randint(3, size=31), 'b': np.random.randint(3, size=31),
        'c': np.random.randint(3, size=31), 'd': np.random.randint(3, size=31),
        'e': np.random.randint(3, size=31), 'f': np.random.randint(3, size=31)}
df = pd.DataFrame.from_dict(data)
df = df.set_index('date')
df = df.transpose()

fig, ax = plt.subplots(figsize=[10,2])
ax = sns.heatmap(df, cmap=['yellow', 'orange', 'red'], cbar=False)

Если вы предпочитаете matplotlib, вы можете использовать imshow:

imshow

from matplotlib.colors import ListedColormap

fig, ax = plt.subplots(figsize=[10,2])
ax.set_xticks(np.arange(len(df.columns)))
ax.set_yticks(np.arange(len(df.index)))
ax.set_xticklabels(df.columns)
ax.set_yticklabels(df.index)
plt.setp(ax.get_xticklabels(), rotation=90)
ax.imshow(df, ListedColormap(['yellow', 'orange', 'red']))
2
Marcia Marques 31 Мар 2021 в 02:17