Сложенная гистограмма Matplotlib от Pandas пересекается странной линией - PullRequest
0 голосов
/ 17 мая 2018

что-то странное происходит в 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)

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

Histogram 1: Works fine

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

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

enter image description here

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

Какого черта здесь происходит? Сначала я подумал, что, возможно, column1 или column2 имеют значения NaN или что-то в этом роде, но я проверил их, и значения столбцов в порядке. Любые идеи о том, что может быть причиной этого?

1 Ответ

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

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()

enter image description here

...