Гистограмма с накоплением Matplotlib от Pandas обрезается странной линией

что-то странное происходит в matplotlib.

У меня есть кадр данных pandas, и я создаю гистограмму с накоплением, используя два ее столбца. Один столбец — это числа с плавающей запятой, которые входят в ячейки гистограммы. Другой столбец содержит только 0 и 1, которые используются для разделения данных на два стека. Мой фактический код немного сложнее, но он выглядит примерно так:

print(df)

    df =
        col1    col2
        1.7       1
        2.4       0
        3.1       0
        4.0       1
        etc      etc

# First I separate the data by the 0's and 1's in col2
df_1 = df.loc[df['col2']==1]
df_0 = df.loc[df['col2']==0]
    fig, axes = 

Построение графика с помощью функции гистограммы matplotlib работает нормально. Если я назову это:

fig,axes= plt.subplots(nrows=1, ncols=1)

n,bins,patches= axes.hist( [ df_0['col1'], df_1['col1'] ] , histtype='step', stacked=True, Fill=True)

... Я получаю очень хороший сюжет:

Гистограмма 1: работает нормально

ОДНАКО, что-то очень странное происходит, если я меняю порядок df_0 и df_1, когда я вызываю hist(). Например, если я сделаю это вместо этого:

n,bins,patches= axes[0].hist( [ df_1['col1'], df_0['col1'] ] , histtype='step', stacked=True, Fill=True)

введите здесь описание изображения

... Я получаю сюжет с перевернутыми стеками (как и ожидалось), НО теперь сюжет подхватил странный артефакт; есть как бы невидимая линия, которая обрезает и закрашивает некоторые места графика цветом.

Что, черт возьми, здесь происходит? Моя первая мысль заключалась в том, что, возможно, в столбце1 или столбце2 были значения NaN или что-то в этом роде, но я проверил их, и значения столбца в порядке. Любые идеи о том, что может быть причиной этого?


person Programmer    schedule 17.05.2018    source источник
comment
Возможно, это первый подтвержденный сюжет загадочного Бермудского треугольника.   -  person Ami Tavory    schedule 17.05.2018
comment
Используйте 1_.   -  person Stop harming Monica    schedule 17.05.2018


Ответы (1)


fill не является полезным аргументом для hist. Это веский аргумент, потому что вы можете залить любой патч в matplotlib. Однако здесь у вас нет закрытого патча для заливки.

Вместо этого вы можете искать различные histtype параметры, показанные в примере histogram_histtypes.

  • histtype="stepfilled"
  • histtype='bar'

В этом случае они оба дают один и тот же сюжет,

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

a = np.random.rayleigh(size=20)
b = np.random.randn(20)+3
df = pd.DataFrame({"col1" : np.concatenate((a,b)),
                   "col2" : [0]*20 + [1]*20})

df_1 = df.loc[df['col2']==1]
df_0 = df.loc[df['col2']==0]

fig,axes= plt.subplots(ncols=2)

n,bins,patches= axes[0].hist([df_0['col1'], df_1['col1']], histtype='stepfilled', stacked=True)
n,bins,patches= axes[1].hist([df_0['col1'], df_1['col1']], histtype='bar', stacked=True)

plt.show()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 17.05.2018