Выбор бинов для гистограмм с относительно небольшим количеством точек данных - PullRequest
0 голосов
/ 08 февраля 2019

Рассмотрим график с несколькими гистограммами в matplotlib , например:

#! /usr/bin/env python3
import matplotlib.pyplot as plt
import random

# Use the same seed for reproducibility.
random.seed(10586)

data1 = [random.gauss(1e-4, 3e-2) for _ in range(10**3)] + [0.3]
data2 = [random.gauss(1e-2, 3e-3) for _ in range(10**3)] + [0.4]
data3 = [0.2]

if __name__ == '__main__':
    plt.xlim(xmin=0, xmax=0.8)
    plt.yscale('log')
    n1, bins1, patches1 = plt.hist(data1, bins='auto', alpha=0.6)
    n2, bins2, patches2 = plt.hist(data2, bins='auto', alpha=0.6)
    n3, bins3, patches3 = plt.hist(data3, bins='auto', alpha=0.6)
    bin_options = ['auto', 'fd', 'doane', 'scott', 'rice', 'sturges', 'sqrt']
    plt.show()

Однако третий набор данных имеет только одну точку данных, поэтому при использовании plt.hist(data3, bins='auto') мы получаем длинныйстолбец растянут поперек диапазона х и больше не может видеть, что его значение равно 0,2:

stretched out

(это наиболее очевидно только с одной точкой данных,но это проблема, например, с двумя или тремя.)

Один из способов избежать этого - просто повторно использовать ячейки другого набора данных.Например, для plt.hist(data3, bins=bins1) мы можем видеть data3 просто отлично:

what we want

Однако, если мы используем другой набор данных через bins=bins2 ячейки слишком узкие, и мы вообще не видим data3:

all gone

Как мы можем гарантировать, что гистограмма с относительно небольшим количеством точеквидимый, но все еще видят его значение на оси х?

1 Ответ

0 голосов
/ 08 февраля 2019

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

import matplotlib.pyplot as plt
import random
random.seed(10586)

data2 = [random.gauss(1e-2, 3e-3) for _ in range(10**3)] + [0.4]

plt.xlim(0, 0.8)
plt.yscale('log')

n2, bins2, patches2 = plt.hist(data2, bins='auto', alpha=0.6, edgecolor="C0")

plt.show()

enter image description here

Или используйте histtype="stepfilled" для создания многоугольника, потому что отдельные столбцы в любом случае не различимы с таким количеством бинов,

n2, bins2, patches2 = plt.hist(data2, bins='auto', alpha=0.6, histtype="stepfilled")

enter image description here

последний также имеет преимущество подчинения альфе, которая в противном случае не видна из-за перекрытия столбцов.Также должно быть более быстрое рисование одной фигуры, а не 1000 баров.

...