2017-02-13 13 views
2

Обычно у меня нет проблем с установкой x tics, но это решение для меня.gnuplot xtic ярлыки с датами

Plotting некоторых значений по ежедневным временным рядам, так что ведущая с командами

set xdata time 
set timefmt "%m/%d/%Y" # the incoming dates are like 06/19/2016 
set format x "%b %Y" # I want the tics to be like Jun 2016 

У меня есть стрелка в качестве маркеров в сюжете

set arrow 1 from "10/15/2016", 0 to "10/15/2016", 4 

... так что у меня есть вертикальная линия точно по 15 октября 2016 года

Но с командой для моих xtics ...

set xtics "10/15/2016", 2628000 

... У меня должно было быть начало xtics 15 октября и происходило примерно в 15 числа каждого месяца. Проблема в том, что первый xtic показывает, где 1-го октября, а не 15-го числа. Впоследствии интервал действительно составляет около одного месяца, но они все рядом с первым из каждого месяца, а не 15-м.

Стрелка только для того, чтобы дать мне визуальный маркер в дату 15 октября, а его команда использует тот же формат, что и команда xtics. После часа не повезло с каждой конфигурацией, о которой я могу думать, пришло время выйти наружу для нового набора глаз.

+0

интересно, тики кажутся такими же ожидаемыми (gnuplot 5.0.5), когда вы используете 'set xtics '10/15/2016", 3600 * 24 * 28-1', но не с '3600 * 24 * 28' или более. Установка их вручную, например, 'set xtics (" tick label "" 10/16/2016 "0)' работает, хотя ... – ewcz

ответ

2

в дополнении к комментарию к первоначальному вопросу, причина такого поведения, как представляется, что функция setup_tics в src/axis.c множеств источника Gnuplot дерева (строка 862) для значений шага больше, чем 3600*24*28 timelevel из соответствующие основные оси для TIMELEVEL_MONTHS.

Однако, как комментарий в функции time_tic_just по линии 1351 из src/axis.c наводит на мысль (и код ниже подтверждает), то крестики позиция в этом случае действительно округляется до первого дня месяца:

/* skip it, I have not bothered with weekday so far */ 
if (level >= TIMELEVEL_MONTHS) {/* units of month */ 
if (tm.tm_mday > 25) { 
    tm.tm_mon++; 
    if (tm.tm_mon > 11) { 
    tm.tm_year++; 
    tm.tm_mon = 0; 
    } 
} 
tm.tm_mday = 1; 
}