Обшивка барплота из сводной таблицы - PullRequest
1 голос
/ 27 апреля 2020

У меня есть такая таблица:

ID var1. var2. var3. var4. var5. var6. var7 var8 var9 ... var22 ...
A.  1.   1.    7.    0.     0.6.   0.   7.  2.    2,4.   ....
B   9.   1.    7.    0.     0.6.   0.   7.  2.    2,4.   ....
C   0.   1.    0.    8.     0.5.   5.   7.  2.9.  2,8.   ....

И я хочу построить гистограмму для каждого идентификатора и связать их все на панели, мое представление о панели похоже на здесь .
Итак, 'x' будет переменными (которые являются именами столбцов), а 'y' - значениями, которые являются значениями столбцов в этом фрейме данных.

Одна важная вещь заключается в том, что Я не хочу, чтобы отображал на графике переменные, имеющие нулевое значение для данного идентификатора , поэтому, например: для идентификатора 'A', var4 и var6 не будут быть на графике с идентификатором 'A', но они будут на графике с идентификатором 'C', например.

Пока у меня есть:

Транспонирование столбцов :

df_melted = res.melt(id_vars='ID')

Затем я удаляю все нули:

df_melted_no_zeros = df_melted[df_melted.value != 0]

Тогда, поскольку мне не удалось построить панель, я фильтрую по одному ID:

ID_A = df_melted_no_zeros[(df_melted_no_zeros.ID == "A")]

Затем на графике так много переменных, и я не могу найти, как я могу разместить их на графике, чтобы они были читабельными, поскольку существует так много имен (например, 20 для каждого графика на оси x). Для меня это будет работать, чтобы показать только легенду о 5 лучших ценностях, но я не мог понять, как это сделать. Хотя мои переменные в основном находятся между 0,004 и 0,009, но всегда есть две переменные, которые имеют значение 4 или 5, поэтому остальные значения как бы не имеют значения на графике.

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
variables = ID_A['variable']
values = ID_A['value']
ax.bar(variables,values)
plt.show()

1 Ответ

1 голос
/ 27 апреля 2020

С этим подмножеством вашего DataFrame:

ID var1. var2. var3. var4. var5. var6. var7 var8 var9
A.  1.   1.    7.    0.     0.6   0.   7.  2.    2.4
B   9.   1.    7.    0.     0.6   0.   7.  2.    2.4
C   0.   1.    0.    8.     0.    5.   7.  2.9   2.8

От широкого к длинному:

df_melted = df.melt(id_vars='ID')

Получить только несколько лучших:

df_top5 = df_melted[df_melted['value'].isin(
                    df_melted.groupby('ID')['value'].nlargest(5).unique())] 

Участок с seaborn :

import seaborn as sns

g = sns.FacetGrid(df_top5,col="ID",sharex=False,sharey=False,col_wrap=2)
g.map(sns.barplot,'variable','value',order=None,hue=df_top5['variable'],
      dodge=False,palette='deep')
plt.show() 

Результат:
enter image description here

...