#graph #gnuplot
Вопрос:
Я пытаюсь отобразить значения в ytics простого графика точек линий в двух разных представлениях, в днях и годах.
Мой файл данных состоит из двух cols, каждый из которых содержит временные метки unix.
1580342400 1492387200
1583107200 1493856000
1584230400 1494201600
1585267200 1495238400
...
Вот что я сделал до сих пор:
set term qt
set xlabel "Current Date"
set ylabel "Time to wait in days and years"
set timefmt "%s"
set format x "%d.%m.n%Y"
set xdata time
set grid
plot 'times.log'
u 1:(($1-$2)/86400)::yticlabels(sprintf("%d (%.1f)",(($1-$2)/86400),(($1-$2)/86400/365)))
with lp lw 2 lt 4 notitle
Единственное, что меня действительно беспокоит, — это то, что ytics распределены неравномерно.
Есть ли какой-либо способ получить желаемый формат и при этом оставаться равноудаленным ytics?
Еще одним вариантом, который пришел мне в голову, было использование новой функции статистики вместе с циклом for, повторяющим все наборы данных и добавляющим одну метку tic для каждого набора данных вручную.
Любой намек приветствуется, однако, я не большой поклонник perl/bash/и т.д., Смешанных с gnuplot, я хотел бы сохранить его gnuplot только в этом случае.
Ответ №1:
Одним из возможных способов было бы следующее: возьмите ось y для дней и ось y2 для лет. Вы должны связать их, проверить help link
. Если вы хотите, чтобы годы также находились с левой стороны по оси y, вы можете «обмануть», например, с set y2tics offset graph -1.105,0
помощью . Вы должны играть со всеми смещениями и полями, чтобы получить оптимальный результат. Я не знаю, что было бы простое автоматизированное решение с чем-то вроде set format y "%tD (%tY)" time
(на самом деле, %tY
это недопустимый спецификатор формата). Проверьте help format specifiers
и help time_specifiers
. Имейте в виду, что, хотя числа для дней будут равноудалены, но числа лет не будут из-за ошибок округления.
Код:
### days and years at the y-axis
reset session
DateStart = "01.01.2020"
DateEnd = "01.10.2021"
myTimeFmt = "%d.%m.%Y"
set xrange[strptime(myTimeFmt,DateStart):strptime(myTimeFmt,DateEnd)]
# create some test data
set samples 20
set table $Data
plot ' ' u 1:($1*1.07 rand(0)*3*86400) w table
unset table
set lmargin 14
set xlabel "Current date"
set format x "%d.%m.n%Y" time
set ylabel "Time to wait in days (years)" offset -5,0
set format y "%.0f"
set ytics offset -5,0
set link y2 via y/365.25 inverse y*365.25
set y2tics
set y2tics offset graph -1.105,0
set format y2 "(%0.2f)"
set grid x,y
set key noautotitle
plot $Data u 1:(($2-$1)/3600/24) w lp pt 7
### end of code
Результат:
Дополнение:
Дни по оси y и годы по оси y2 дают преимущество в установке y2tics
шагов «независимо» с четными числами, но, конечно, сетка будет соответствовать только оси y. Кроме того, вам не нужно возиться со смещениями. Конечно, вы должны связать ось (проверить help link
).
Что касается тестовых данных, вы можете построить или распечатать их в таблице, проверить help table
и help set print
. Как и вы, я предпочитаю делать все (если это возможно) в gnuplot, однако иногда это может быть довольно сложным и длительным. Кроме того, когда я публикую ответ на SO, я всегда стараюсь привести пример «копировать , вставлять и запускать». Если у меня недостаточно данных операции, я обычно включаю генерацию некоторых (случайных) данных, которые напоминают данные операции, чтобы получить разумно выглядящий демонстрационный график. В вашем случае просто пропустите эти строки тестовых данных и замените $Data
в команде plot свое имя файла, в вашем случае 'times.log'
.
Код:
### days at y-axis and years at y2-axis
reset session
DateStart = "01.01.2020"
DateEnd = "01.10.2021"
myTimeFmt = "%d.%m.%Y"
set xrange[strptime(myTimeFmt,DateStart):strptime(myTimeFmt,DateEnd)]
# create some test data
set samples 20
set table $Data
plot ' ' u 1:($1*1.07 rand(0)*3*86400) w table
unset table
set xlabel "Current date"
set format x "%d.%m.n%Y" time
set ylabel "Time to wait in days"
set format y "%.0f"
set ytics nomirror
set link y2 via y/365.25 inverse y*365.25
set y2label "Time to wait in years"
set y2tics 0.02
set format y2 "%0.2f"
set grid x,y
set key noautotitle
plot $Data u 1:(($2-$1)/3600/24) w lp pt 7
### end of code
Результат:
Комментарии:
1. Забавно, потому что я попытался отобразить данные по двум осям y- дни слева, годы справа. Но у меня всегда получалось смещение между ними, потому что я не знал оператора связи. Я бы даже оставил годы на правильной стороне, почему бы и нет. Единственное, чего я абсолютно не понимаю, — это та часть, где вы генерируете данные в эту таблицу. Этого я тоже никогда раньше не видел. Почему случайные данные? Не могли бы вы немного подробнее остановиться на этом? Конечно, большое спасибо!
2. @mefiX спасибо за ваш быстрый ответ. См.Измененный ответ…