подгонка поддиапазона по временным данным в gnuplot - PullRequest
0 голосов
/ 20 января 2019

Позвольте мне начать с того, что я работаю над:

$ gnuplot --version

gnuplot 5.2, уровень исправления 2

Я хотел бы построить и подогнать данные даты / времени в gnuplot, чтобы только выполнялась подгонка, а затем отображалась в поддиапазоне графика.

Пример данных, с которыми я играл, может, например, можно найти здесь . РЕДАКТИРОВАТЬ : я понял, что данные в файле не совпадают с подписью timefmt, я добавил /06 к каждой линии, чтобы точка была нарисована в середине года, что позволило составить график вместе с ежемесячными данными из того же источника.

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

set key left
set yrange[-0.75:1.0]
set xdata time
set timefmt '%Y/%m'
r=10e-10
e(x) = r*x+s
fit e(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via r,s
a=10e-10
f(x) = a * x + b
set xrange ["1970/06":"2018/06"]
fit f(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via a,b
g(x) = ( x > "1970/06" ) ? f(x) : 1/0
set xrange ["1850/06":"1970/06"]
c=9.24859e-11
h(x) = c * x + d
fit h(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via c,d
i(x) = ( x < "1970/06" ) ? h(x) : 1/0
set xrange ["1849/06":"2018/06"]
set term png size 1500,1000
set output 'annual_average_with_fit.png'
plot 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 with lp lw 2 t'annual avg (decadally smoothed)', e(x) t'full range fit' lw 2, i(x) t'1850-1970 fit' lw 2, g(x) t'1970-2018 fit' lw 2

который дает этот участок

enter image description here

Это все хорошо и хорошо, но (и вот здесь возникает вопрос) в принципе, я должен быть в состоянии достичь того же результата и другими способами.

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

fit ["1970/06":"2018/06"] f(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via a,b

, что, однако, дает

Прочитано 168 баллов

Пропущено 168 точек за пределами диапазона [x = 1970: 2018]

[...] Нет данных для соответствия

, что кажется странным, учитывая, что set xrange явно дает желаемый эффект.

Во-вторых, пытаясь ограничить построение кривой в соответствии с диапазоном с помощью

plot 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 with lp lw 2 t'annual avg (decadally smoothed)', ["1970/06":"2018/06"] f(x) t'' 

вообще не отображает функцию.

Возможно, я упускаю из виду что-то очень простое, но, пробуя разные вещи, я не вижу, что это такое

1 Ответ

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

Следующий (немного исправленный) код должен делать то, что вы хотите (протестировано с gnuplot 5.2.5).Я предполагаю, что проблема в том, что вы пытались установить диапазон ["1970/06":"2018/06"], но ваши данные сохраняются только до 2017 года. Поэтому лучше оставьте его открытым, например, ["1970/06":] или ["1970/06":*].

edit: добавлено ограниченноеподгонка по диапазону i (x)

reset session
set term png size 1500,1000
set output 'annual_average_with_fit.png'

set key left
set yrange[-0.75:1.0]
set xdata time
set timefmt '%Y/%m'
set format x '%Y'

FILE = 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt'

r=10e-10
f(x) = r*x+s
fit [*:*] f(x) FILE using 1:2 via r,s

c=9.24859e-11
g(x) = c * x + d
fit [*:"1970/06"] g(x) FILE using 1:2 via c,d

a=10e-10
h(x) = a * x + b
fit ["1970/06":*]  h(x) FILE using 1:2 via a,b

p=1e-9
i(x) = p * x + q
fit [strptime("%Y/%m", "1910/06"):strptime("%Y/%m", "1945/06")] i(x) FILE using 1:2 via p,q

set xrange [*:*]
plot FILE using 1:2 with lp lw 2 t'annual avg (decadally smoothed)', \
    f(x) t 'full range fit' lw 2, \
    [:"1970/06"] g(x) t '1850-1970 fit' lw 2, \
    ["1970/06":] h(x) t '1970-2018 fit' lw 2,\
    [strptime("%Y/%m", "1910/06"):strptime("%Y/%m", "1945/06")] i(x) t '1910-1945 fit' lw 2

set output

Выход: enter image description here

...