Объединить гистограммы в gnuplot (средневзвешенное число бинов)
Допустим, у меня есть две части данных для одного и того же количества, каждая из которых имеет свою ошибку. В частности, у меня есть две гистограммы в файлах gnuplot примерно в форматеxA yA dyA
для гистограммы АxB yB dyB
для гистограммы B
(значения xA и xB одинаковы)
Чтобы увеличить точность гистограмм, я могу "объединить их", чтобы получить лучшую оценку y. На практике я хочу получить гистограмму, в которой значения y представляют собой средневзвешенное значение значений yA и yB с весами, заданными в виде обратной величины их ошибок.
Это довольно стандартная операция при манипулировании данными, и я ожидал, что для гистограмм gnuplot будет существовать какая-то утилита. Оказывается, мне не удалось найти эту утилиту...
Поэтому я хотел бы спросить, есть ли такая программа, которая уже делает это. В случае, если он не существует, я хотел бы попросить предложение на каком языке, чтобы написать это. У меня уже есть кое-что, что делает это в Wolfram Mathematica, но сейчас я хочу выполнить операцию в оболочке Unix, поэтому мне было интересно, будет ли python хорошим выбором для манипулирования файлами gnuplot или есть что-то более подходящее.
Спасибо роберто
Если быть более точным, у меня есть гистограммы в файле.gnu, которые мне дают в формате
# comments
set title "sqrt(p^2(5)) distribution" font "Helvetica, 20"
set xlabel "sqrt(p^2(5))" font "Helvetica, 20"
set ylabel "d{/Symbol s}/dsqrt(p^2(5))" font "Helvetica, 20"
set xrange [ 0.00000: 40.00000]
plot "-" with histeps
4.50000 3986.18 1.27863
5.50000 3986.18 1.27863
6.50000 3986.18 1.27863
e
set title "m(5) distribution" font "Helvetica, 20"
set xlabel "m(5)" font "Helvetica, 20"
set ylabel "d{/Symbol s}/dm(5)" font "Helvetica, 20"
set xrange [ 0.00000: 40.00000]
plot "-" with histeps
4.50000 3986.18 1.27863
5.50000 3986.18 1.27863
6.50000 3986.18 1.27863
e
Я хотел бы извлечь все данные из этого файла, чтобы объединить, например, гистограмму m(5), которая у меня есть в нескольких файлах (объединение означает средневзвешенное значение, как указано выше). Какой-нибудь быстрый способ прочитать эти данные в Python и манипулировать гистограммами, чтобы объединить их?
2 ответа
Да, Python и Numpy - хороший выбор для этого. Если ваши файлы содержат только фиксированное количество чисел в строке, вы можете использовать функцию numpy.loadtxt для их чтения и savetxt для их записи. В противном случае вам придется использовать общие процедуры Python IO.
Самый простой способ - это использовать paste
объединить два файла (при условии, что значения x одинаковы и в одинаковом порядке в обоих файлах) и выполнить вычисления в gnuplot.
Рассмотрим два тестовых файла A.txt
1 5 1
2 1 2
а также B.txt
:
1 3 1
2 4 1
Использование сценария
set style fill solid noborder
set boxwidth 0.8 relative
set yrange [0:*]
weighted_avg(yA, dyA, yB, dyB) = ((yA/dyA + yB/dyB)/(1.0/dyA + 1.0/dyB))
plot '< paste A.txt B.txt' using 1:(weighted_avg($2, $3, $5, $6)) with boxes notitle
Вы получаете следующую гистограмму