У меня есть ежедневные данные (одна точка в день), которые я рисую с помощью Gnuplot, используя fillsteps
. fillsteps
заполняет пространство между линией, выполненной с помощью steps
, и нулем.
Однако мне бы хотелось заполнить пространство между линией, выполненной с помощью fsteps
, и нулем.
Самый простой способ, который приходит на ум, — вообще отказаться от fsteps
и добавить точки, чтобы получилась лестница, а затем заполнить ее filledcurves
.
boxes
?Вы просите другой вариант шагов, который не рассматривается как стиль прямого построения в gnuplot, как в этих примерах.
Вы должны сделать это сами. Да, вы можете это сделать with boxxyerror
, проверьте help boxxy
.
Скрипт:
### plot with filled fsteps
reset session
$Data <<EOD
0 1
1 4
3 3
6 7
7 5
EOD
set offset 1,1,1,0
set style fill solid 0.3 noborder
set tics out
set key noautotitle invert
plot x1=y1=NaN $Data u (x0=x1,x1=$1,y0=y1,y1=$2,(x1+x0)/2): \
(y1/2):((x1-x0)/2):(y1/2) w boxxy lc "green" ti "filled fsteps", \
'' u 1:2 w fsteps lw 2 lc "red" ti "fsteps"
### end script
Результат:
Добавление:
На самом деле, если вы посмотрите внимательно (увеличите масштаб), вы заметите несколько более ярких вертикальных линий x=1,3,6
.
Этого можно избежать, если изменить:
set style fill solid 1.0 border
и задайте цвет lc rgb 0xb3ffb3
... w boxxy lc rgb 0xb3ffb3 ...
Результат: (без более ярких вертикальных линий)
Дополнение 2:
@Франческо Поторти, после твоего ответа похоже, что ты просто ищешь простую гистограмму с данными о времени. Вы можете сделать это проще. Проверьте help strptime
и help strcol
.
Скрипт:
### plot a bar chart (with boxes)
reset session
$Data <<EOD
Date Value
2024-01-10 1
2024-01-11 4
2024-01-13 3
2024-01-16 7
2024-01-17 2
2024-01-18 3
EOD
myFmt = "%Y-%m-%d"
set style fill solid
set format x "%m-%d" timedate
set boxwidth 86400 absolute # one day 24*3600 s
set yrange[0:]
plot $Data u (strptime(myFmt,strcol("Date"))):"Value" w boxes ti "Value"
### end of script
Результат:
@FrancescoPotortì рад, что ты смог «расшифровать» мой сценарий. Иногда я не трачу слишком много времени на подробное объяснение сценария, потому что некоторые пользователи никогда не отвечают. Поздравляю, вы сделали хорошее упражнение. Если ваша проблема решена, спасибо, что приняли ответ, указав, что на ваш вопрос дан ответ. ПС. Мне придется изменить некоторые мелкие детали, потому что если вы посмотрите очень внимательно, вы увидите более яркие вертикальные линии в точках x=1,3 и 6.
@FrancescoPotortì еще одна маленькая деталь: приведенный выше сценарий отображает поля по центру даты. Например, если вы хотите, чтобы поле «01-13» варьировалось от «01-13 00:00» до «01-13 23:59», вам следует добавить половину дня, т. е.: (strptime(myFmt,strcol("Date"))+43200)
.
Да, как только вы направили меня на правильный путь, я подробно остановился на этом, спасибо!
Хотя решение, предложенное теожем, является общеупотребительным и в большинстве случаев лучшим, поскольку у меня ровно один балл в день, я придумал решение, на мой взгляд более читабельное. С этой целью он использует форму с шестью аргументами boxxyerror
, а не форму с четырьмя аргументами, используемую теожом. Он более подробный, но более читабельный.
Итак, я придумал следующее:
$Data <<EOD
Date Value
2024-01-10 1
2024-01-11 4
2024-01-13 3
2024-01-16 7
2024-01-17 2
2024-01-18 3
EOD
set xdata time
set style fill solid
set timefmt "%Y-%m-%d"
set format x "%m-%d"
plot d=24*3600 $Data \
using 1:2:(x=timecolumn(1,"%Y-%m-%d")):(x+d):(0):"Value" with boxxyerror \
title "Value"
Что производит это:
Есть кое-что, что меня раздражает: хотя я могу написать "Date":"Value"
в качестве первых двух аргументов boxxyerror
(вместо 1:2
), я не могу написать timecolumn("Date","%Y-%m-%d")
вместо timecolumn(1,"%Y-%m-%d")
.
P.S. Последнее дополнение в ответе Теожа даже проще моего, поэтому я приму его.
Вы запросили заполненные fsteps и не предоставили данных, поэтому я что-то предположил. Но если я увижу ваш ответ, вы, вероятно, сможете сделать это намного проще with boxes
и set boxwidth 86400
(это один день).
Спасибо. Поскольку я не владею Gnuplot, мне пришлось немного поработать, чтобы понять его.
x1=y1=NaN
— это выражение, инициализирующее две переменные x1 и y1: вы можете поместить постоянное выражение в качестве первого аргументаplot
. Затем для каждой точки вы вычисляете четыре аргумента стиляboxxyerror
. При вычислении первого аргумента вы переназначаете эти переменные, используя $1 и $2, которые представляют собой значения, взятые из первого и второго столбца каждой точки. Остерегайтесь круглых скобок, они важны.