Python: Гистограмма возвращает неправильные значения для подсчетов (РЕДАКТИРОВАНИЕ: более общее с примером)

#python #matplotlib #histogram

Вопрос:

РЕДАКТИРОВАТЬ: Я нашел общий пример, где это тоже не работает! Я пытаюсь извлечь данные для гистограммы, но разные подсчеты кажутся неправильными. В качестве примера кода:

 import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(1000000)
bins = np.arange(0,1,0.0001)
a,b,c = plt.hist(data,bins)
 

Это дает мне довольно запутанную гистограмму, и я сохранил подсчеты как a, а интервал как b. Теперь, рисуя a и b, я должен ожидать одну и ту же гистограмму, верно? Но это не то, что я понимаю:

 plt.scatter(b[0:len(b)-1],a,s=2)
 

что дает мне это, что совсем не соответствует! Кроме того, когда я пытаюсь найти максимальное значение a, оно дает мне 144, что хорошо согласуется с диаграммой рассеяния, но не с функцией гистограммы.

Если я сам посчитаю числа со следующим кодом:

 len(np.intersect1d(np.where(data>=b[np.argmax(a)]),np.where(data<b[np.argmax(a) 1])))
 

тогда это также дает мне 144, в соответствии с ценностями. Итак, отображаемая гистограмма по какой-то причине просто неверна, и я должен проигнорировать ее и просто взять извлеченные данные?

Старое, неотредактированное сообщение:

Для курса физики я пытаюсь записать свои результаты следующим образом:

 import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as ss
from scipy.optimize import curve_fit
plt.rc("font", family=["Helvetica", "Arial"]) 
plt.rc("axes", labelsize=18)
plt.rc("xtick", labelsize=16, top=True, direction="in")
plt.rc("ytick", labelsize=16, right=True, direction="in")
plt.rc("axes", titlesize=22)
plt.rc("legend", fontsize=16)

data_Ra = np.loadtxt('Ra226_cal2_ch001.txt',skiprows=5)
t_Ra = data_Ra[:,0]*10**-8 # time in seconds 
channels_Ra = data_Ra[:,1]
channels_Ra = channels_Ra[np.where(channels_Ra>0)] # removing all the measurements at channel = 0
intervalspace = 2 #The intervals in which we count
bins=np.arange(0,4000,intervalspace)


counts, intervals , stuff = plt.hist(channels_Ra,bins)
plt.xlabel('Channels')
plt.ylabel('Counts')
plt.show()
 

Здесь график гистограммы выглядит совершенно нормально, максимум около 13000 отсчетов. Но когда я затем использую np.max(количество), мне дают около 24000, и когда я пытаюсь просто построить значения, которые он мне дает, с:

 plt.scatter(intervals[0:len(intervals)-1] intervalspace/2,counts,s=1)
plt.xlabel('Channels')
plt.ylabel('Counts')
plt.title('Ra225')
plt.show()
 

это выглядит так, что совершенно по-другому, и я не могу понять, почему. Я ожидаю, что диаграмма рассеяния будет напоминать гистограмму, и, хотя пики расположены в одних и тех же точках x, высота не совпадает.

Эта проблема существует и в других больших наборах данных.

Я не думаю, что мне разрешено оставлять здесь txt-файл? Так что я не уверен, сколько еще я могу показать, но любая помощь будет оценена по достоинству!

Ответ №1:

Я не знаю, почему вы так интерпретируете результаты.

Если вы посмотрите на график гистограммы, вы сможете увидеть, что максимальное значение оси y составляет 25 000. Это означает, что есть некоторые значения, близкие к 25 000. Этот факт можно проверить на диаграмме рассеяния.

Ваша точечная диаграмма показывает фактические значения. Было бы понятнее, если бы вы описали, как выглядит ваш ожидаемый сюжет.

Если вы хотите удалить некоторые точки выбросов, вам следует применить некоторую фильтрацию перед построением графика данных.

Комментарии:

1. Из того, как я понимаю переменные, которые дает мне plt.hist, использование первых двух переменных в диаграмме рассеяния должно дать мне точки, соответствующие гистограмме, просто незаполненной ниже. Поэтому я ожидал, что моя диаграмма рассеяния будет напоминать гистограмму, и, хотя пики имеют одинаковые значения x, высота их совсем не совпадает. Так что я не совсем понимаю…