Создайте субплоты гистограммы для каждой строки в кадре данных - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть датафрейм, например, следующий, где Material, A и B - заголовки столбцов:

    Material    A           B
0   Iron        20.30000    5.040409
1   Antimony    0.09200     0.019933
2   Chromium    1.70000     0.237762
3   Copper      8.10000     2.522951

Я хочу иметь 2x2 вспомогательных участков, состоящих из гистограмм на основе 4 строк. Заголовок каждого из 4 участков будет материалом. У каждого подпункта было бы два столбца для каждого значения A и B, каждый столбец в подплоте имеет цвет, связанный с A и B. Наконец, также было бы неплохо иметь легенду, показывающую цвет и то, что он представляет, то есть A и B.

import matplotlib.pyplot as plt
import pandas as pd 
import seaborn as sns
import matplotlib.style as style 
sns.set_style("darkgrid")

fig, ax = plt.subplots(2,2)

#Enter for loop 

Я думаю, что для l oop было бы лучшим способом сделать это, но просто не могу понять, для l oop. Спасибо.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020
fig, axs = plt.subplots(2,2, constrained_layout=True)
for ax,(idx,row) in zip(axs.flat, df.iterrows()):
    row[['A','B']].plot.bar(ax=ax, color=['C0','C1'])
    ax.set_title(row['Material'])

proxy = ax.bar([0,0],[0,0], color=['C0','C1'])
fig.legend(proxy,['A','B'], bbox_to_anchor=(1,1), loc='upper right')

enter image description here

Обратите внимание, что тот же результат может быть достигнут с использованием только pandas, но сначала вам нужно изменить данные

df2 = df.set_index('Material').T

>>
Material       Iron  Antimony  Chromium    Copper
A         20.300000  0.092000  1.700000  8.100000
B          5.040409  0.019933  0.237762  2.522951

df2.plot(kind='bar', subplots=True, layout=(2,2), legend=False, color=[['C0','C1']])

enter image description here

0 голосов
/ 21 февраля 2020

Вы можете сделать это следующим образом:

df = df.set_index('Material')
fig = plt.figure(figsize=(10,8))

for i, (name, row) in enumerate(df.iterrows()):
    ax = plt.subplot(2,2, i+1)
    ax.set_title(row.name)
    ax.get_xaxis().set_visible(False)
    df.iloc[i].plot.bar(color=['C0', 'C1'])
fig.legend(ax.bar([0,0],[0,0], color=['C0','C1']),['A','B'], loc=5)

plt.show()

enter image description here

...