Условное построение Gnuplot: функция stringcolumn () относительно дат - PullRequest
1 голос
/ 24 марта 2020

У меня есть следующий фрагмент данных (пример):

#Time      Data
07/22/2013 6286
07/22/2013 10695
07/22/2013 17868
07/22/2013 18880
07/22/2013 19206
07/22/2013 20365
07/22/2013 18459
07/11/2013 3420
07/11/2013 3256

Я бы хотел построить дату на оси X и второй столбец на оси Y.

При условии, он должен отображать только те строки, где дата равна "22.07.2013".

это то, что я пробовал:

set datafile separator " "
set xdata time
set timefmt "%m/%d/%Y"   
set xrange ["07/21/2013" : "07/23/2013"]
set yrange [3000:21000]  
set format x "%m/%d"
plot "test_date.txt" using (stringcolumn(1) eq "07/22/2013"? $1:1/0):2 w p title "spots" lc 7

В результате Gnuplot пытается построите биграмму, но точки данных не установлены (см. следующий рисунок «Результат»)

Результат

Кто-нибудь знает, почему это так? Должен ли я использовать «timecolumn ()» вместо «stringcolumn ()»? если так, как бы я это сделал?

Буду признателен за любые подсказки.

1 Ответ

1 голос
/ 24 марта 2020

Думаю, проблема в том, что $1 пытается извлечь число и найдет только 07. Если вы нажмете кнопку Autoscale в окне терминала, вы увидите, что есть некоторые данные, но не там, где вы ожидаете их "00:07".

. Быстрое решение проблемы - заменить $1 на timecolumn(1). Согласно Итану set xdata time является реликтом из более ранних версий gnuplot (но он все еще работает). Я бы сделал это следующим образом:

Код:

### time data plot with ternary filter
reset session

$Data <<EOD
#Time      Data
07/22/2013 6286
07/22/2013 10695
07/22/2013 17868
07/22/2013 18880
07/22/2013 19206
07/22/2013 20365
07/22/2013 18459
07/11/2013 3420
07/11/2013 3256
EOD

myTimeFmt = "%m/%d/%Y"
set xrange[strptime(myTimeFmt,"07/21/2013"):strptime(myTimeFmt,"07/23/2013")]
set yrange [3000:21000]  
set format x "%m/%d" time

plot $Data u (strcol(1) eq "07/22/2013" ? timecolumn(1,myTimeFmt):NaN):2 w p title "spots" lc 7
### end of code

Результат:

enter image description here

...