Учитывая df формы

df = pd.DataFrame(
    {
    "date": [datetime.datetime(2018, 1, x) for x in range(1, 8)],    
    "label": ["A", "A", "B", "B", "C", "A", "C"],
    "value1": [1, 22, 3, 4, 5, 6, 7],
    "value2": [10, 4, 30, 5, 6, 8, 9]
    }
)
df.set_index('date', inplace=True)

Я хотел бы иметь один график, содержащий все 6 строк: значение value1 и value2 для каждой из групп. Я просмотрел другие ответы, но не смог найти, как это правильно сделать. Лучшее, что у меня есть, это

fig, ax = plt.subplots()
for label, df in grouped:
    df.plot(ax=ax, label="Value for {}".format(label))
plt.legend()

Что дает такой результат:

enter image description here

Здесь есть две проблемы (вероятно, то же самое):

  • Кажется, я не могу контролировать текст метки
  • ярлык бесполезен, как он сейчас, потому что он не информативен

Любые идеи?

0
meto 16 Апр 2018 в 19:36

1 ответ

Лучший ответ

Возможно, просто используйте оси для построения графика вместо DataFrame и явно укажите, что вы хотите построить?

grouped = df.groupby('label')
fig, ax = plt.subplots()
for label, df2 in grouped:
    ax.plot(df2['value1'], label=label+' value1')
    ax.plot(df2['value2'], label=label+' value2')
plt.xticks(rotation=30)
plt.xlabel(df.index.name)
plt.legend()

enter image description here

Или, если вы не хотите записывать это много раз, просто укажите, какие столбцы вы хотите построить заранее, и используйте другой цикл.

plot_vals = ['value1', 'value2']

fig, ax = plt.subplots()
for label, df2 in grouped:
    for col in df2.columns[df2.columns.isin(plot_vals)]:
        ax.plot(df2[col], label=label+ ' ' + col)
plt.xticks(rotation=30)
plt.xlabel(df.index.name)
plt.legend()
2
ALollz 16 Апр 2018 в 17:09