Панды (горизонтальные) с накоплением баров, с сортировкой сегмента на брус - PullRequest
0 голосов
/ 01 мая 2018

Я могу создавать горизонтальные столбцы с многоиндексными данными с помощью следующего кода:

arrays = [np.array(['bar', 'bar', 'bar', 'baz', 'baz', 'baz', 'foo', 'foo', 'foo', 'qux', 'qux', 'qux']),
          np.array(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'])]

s = abs(pd.Series(np.random.randn(12), index=arrays))

ax = s.unstack(level=1).plot.barh(stacked=True, colormap='Paired')

plt.show()

это выводит

horizontal stacked bars

но я бы хотел, чтобы самый большой сегмент на каждом баре (независимо от категории) всегда появлялся у основания бара ( i . e ). налево). Я не нашел никаких параметров для barh(), которые бы помогли, и сортировка s на уровне 0 не помогает, учитывая unstack -ing.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Поскольку фрейм данных довольно разреженный, т. Е. Только одно значение на столбец, вы можете просто отсортировать столбцы по этому значению.

import pandas as pd
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt

arrays = [np.array(['bar', 'bar', 'bar', 'baz', 'baz', 'baz', 'foo', 'foo', 'foo', 'qux', 'qux', 'qux']),
          np.array(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'])]

s = abs(pd.Series(np.random.randn(12), index=arrays))
df = s.unstack(level=1)
df = df[df.columns[np.argsort(df.sum())[::-1]]]
ax = df.plot.barh(stacked=True, colormap='Paired')

plt.show()

enter image description here

0 голосов
/ 01 мая 2018

Вы можете использовать matplotlib.barh напрямую:

barh(range(4), ax.sum(axis=1), color=['blue' if one else 'green' for one in ax.one == ax.max(axis=1)]);
barh(range(4), ax.max(axis=1), color=['green' if one else 'blue' for one in ax.one == ax.max(axis=1)]);

enter image description here

Конечно, вы можете сделать галочки и метки более привлекательными с помощью yticks и т. Д.


Редактировать

Для общего случая вот схема того, как масштабировать вещи.

Сначала начните с

d = s.unstack(level=1).as_matrix()

Теперь повторяем до np.nansum(d) == 0.

Для каждой итерации длина столбцов должна быть

np.nansum(d, axis=1)

Чтобы получить цвета на графике, вы можете использовать

np.nanargmin(d, axis=1)

(вам нужно сопоставить эти числа с цветами). В конце каждой итерации используйте

d[:, np.nanargmin(d, axis=1)] = np.nan

Это построит более короткие столбцы поверх длинных столбцов, создавая иллюзию сложенных столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...