Как использовать или манипулировать выводом (возвращаемыми значениями) hist2d и создавать новую гистограмму - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь разобраться с тем, как использовать возвращаемые значения hist2d. Я вижу, что он возвращает 2d массив («объект гистограммы»), а также ребра бина и изображение. Я пытаюсь создать две гистограммы (из некоторых физических данных), нормализовать их, вычесть их (т.е. вычесть значения бина), а затем гистограмму, что осталось.

Можно начать с этого:

h1 = plt.hist2d(x1, y1,bins=(100,100),normed=True)
h2 = plt.hist2d(x2, y2,bins=(100,100),normed=True)

На самом деле длины h1 и h2 равны 4, а h1 [0] - это двумерный массив со значениями бина. Мне не совсем ясно, что такое h1 1 , h1 2 и h1 [3], но вычитание их приводит к массивам из 0. Однако я могу вычесть h1 [0] и h2 [0] и получить то, что выглядит как значимые значения bin:

h1 = plt.hist2d(x1, y1,bins=(100,100),normed=True)
h2 = plt.hist2d(x2, y2,bins=(100,100),normed=True)
H = h1[0] - h2[0]

Теперь вопрос в том, как я могу сделать гистограмму этих новых значений? Я мог бы написать через h1 [0], но даже тогда, как я могу заново отобразить Hist2D в том же формате, не используя разные типы функций? Можно сделать нечто подобное, используя histogram2d, и, возможно, использовать сетку, но результаты получаются ужасными:

h1, xedges, yedges = np.histogram2d(x1, y1,bins=(100,100),normed=True)
h2, xedges, yedges = np.histogram2d(x2, y2,bins=(100,100),normed=True)
H = h1 - h2
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(121, title='imshow: square bins')
plt.imshow(H, interpolation='nearest', origin='low',extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])
ax = fig.add_subplot(122, title='pcolormesh: actual edges')
X, Y = np.meshgrid(xedges, yedges)
ax.pcolormesh(X, Y, H)
plt.show()

Subtracted histograms

Как отметил один из комментаторов, имеет смысл, что эти графики перекошены, потому что они теперь (100,100), а не исходные оси, которые были (0,1000), (- 100,100). Это можно исправить:

plt.imshow(H, interpolation='nearest', origin='low')

Тем не менее, выходной сигнал странным образом поворачивается. Я могу сказать, потому что смутный туманный бар должен быть вертикальным:

unsquished output

1 Ответ

2 голосов
/ 18 января 2020

Две проблемы.

  1. Вам необходимо использовать одинаковые ячейки для обеих гистограмм, иначе они не могут быть вычтены.
  2. Вы не можете вычесть плотности, если не уверены, что они ссылаются на одно и то же число точки и тот же диапазон данных. Поскольку маловероятно, что имеется одинаковое количество точек, рассчитайте абсолютные частоты, которые можно легко вычесть, если они живут в одних и тех же ячейках.

Следовательно, оно должно быть

h1, xedges, yedges = np.histogram2d(x1, y1, bins=(100,100),normed=False)
h2, _, __ = np.histogram2d(x2, y2, bins=(xedges, yedges), normed=False)
H = h1 - h2

При построении помните, что выходной массив np.histogram2d должен быть транспонирован перед построением; т.е. plt.imshow(H.T, ...) или plt.pcolormesh(X, Y, H.T, ...).

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