Сложенный бар панд не использует x-location - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю со следующим фреймом данных панд:

index       A           B      day
0           0.900       NaN    11
1           0.600       NaN    12
2           0.600       NaN    13
3           0.600       NaN    14
4           0.300       NaN    15
5           1.278       NaN    18
6           0.429      0.70    19
7           0.240      1.00    20
8           0.279      0.95    21
9           0.330       NaN    22
10          0.369       NaN    25
11          0.285       NaN    26
12          0.594      0.65    27
13          0.741      0.50    28
14          0.855       NaN    29
15          0.399       NaN    32
16          1.140       NaN    33
17          1.383       NaN    34

Я бы хотел построить бар, где на каждый день складывается количество А и В.Это работает с df.plot.bar(x='days', stacked=True), но барплот Pandas не учитывает неравномерный интервал в переменной x: он помещает каждый столбец на одинаковом расстоянии от предыдущего, даже если разница в днях не является непрерывной.

Тот же график, но с kind='area' или kind='line' правильно выполняет интервал x, но не суммирует A и B четким способом.

Является ли это ожидаемым поведением Панд, и есть ли способ заставить столбец с накоплением использовать индекс для размещения?Я бы предпочел не идти по пути ручного наложения баров (https://matplotlib.org/gallery/lines_bars_and_markers/bar_stacked.html),, поскольку в будущем в кадре данных будет больше столбцов, чем в A и B.

Рисунок, показывающий три типаграфиков, с уложенным столбцом слева

1 Ответ

0 голосов
/ 14 ноября 2018

Сюжет бара панд - это категоричный сюжет.Он будет показывать бары в последовательных позициях 0,1, .. N-1.Линейные или районные графики - это числовые графики, они показывают в реальном масштабе.

A.Использовать matplotlib

Один из вариантов - использовать график matplotlib bar, поскольку он также имеет числовой характер.

u = """index       A           B      day
0           0.900       NaN    11
1           0.600       NaN    12
2           0.600       NaN    13
3           0.600       NaN    14
4           0.300       NaN    15
5           1.278       NaN    18
6           0.429      0.70    19
7           0.240      1.00    20
8           0.279      0.95    21
9           0.330       NaN    22
10          0.369       NaN    25
11          0.285       NaN    26
12          0.594      0.65    27
13          0.741      0.50    28
14          0.855       NaN    29
15          0.399       NaN    32
16          1.140       NaN    33
17          1.383       NaN    34"""

import io
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(io.StringIO(u), delim_whitespace=True)

fig, ax = plt.subplots()
ax.bar(df["day"], df["A"])
ax.bar(df["day"], df["B"], bottom=df["A"])

plt.show()

enter image description here

B.Используйте индекс панд

Если вы не считаете это вариантом, вы можете использовать индекс данных для построения графиков.Это работает здесь, потому что дни все целые числа.Для этого вы можете создать фрейм данных со всеми возможными индексами между минимальным и максимальным днем ​​и заполнить его значениями исходных данных.Затем нанесите на карту обертку для панд.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(io.StringIO(u), delim_whitespace=True)

df2 = pd.DataFrame(columns=["A", "B"], index=range(df["day"].min(),df["day"].max()+1))
df2.update(df.set_index("day"))

fig, ax = plt.subplots()
df2.plot.bar(stacked=True, ax=ax)

plt.show()

enter image description here

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