Gnuplot: заполнение и fsteps

У меня есть ежедневные данные (одна точка в день), которые я рисую с помощью Gnuplot, используя fillsteps. fillsteps заполняет пространство между линией, выполненной с помощью steps, и нулем.

Однако мне бы хотелось заполнить пространство между линией, выполненной с помощью fsteps, и нулем.

Самый простой способ, который приходит на ум, — вообще отказаться от fsteps и добавить точки, чтобы получилась лестница, а затем заполнить ее filledcurves.

  1. есть ли более простой способ? может быть проще использовать boxes?
  2. предположим, что я использую лестницу, поскольку я не владею Gnuplot, я бы создал лестницу вне Gnuplot; есть ли простой способ создать его внутри Gnuplot?
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы просите другой вариант шагов, который не рассматривается как стиль прямого построения в 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

Результат:

Спасибо. Поскольку я не владею Gnuplot, мне пришлось немного поработать, чтобы понять его. x1=y1=NaN — это выражение, инициализирующее две переменные x1 и y1: вы можете поместить постоянное выражение в качестве первого аргумента plot. Затем для каждой точки вы вычисляете четыре аргумента стиля boxxyerror. При вычислении первого аргумента вы переназначаете эти переменные, используя $1 и $2, которые представляют собой значения, взятые из первого и второго столбца каждой точки. Остерегайтесь круглых скобок, они важны.

Francesco Potortì 25.02.2024 20:01

@FrancescoPotortì рад, что ты смог «расшифровать» мой сценарий. Иногда я не трачу слишком много времени на подробное объяснение сценария, потому что некоторые пользователи никогда не отвечают. Поздравляю, вы сделали хорошее упражнение. Если ваша проблема решена, спасибо, что приняли ответ, указав, что на ваш вопрос дан ответ. ПС. Мне придется изменить некоторые мелкие детали, потому что если вы посмотрите очень внимательно, вы увидите более яркие вертикальные линии в точках x=1,3 и 6.

theozh 25.02.2024 20:21

@FrancescoPotortì еще одна маленькая деталь: приведенный выше сценарий отображает поля по центру даты. Например, если вы хотите, чтобы поле «01-13» варьировалось от «01-13 00:00» до «01-13 23:59», вам следует добавить половину дня, т. е.: (strptime(myFmt,strcol("Date"))+43200).

theozh 27.02.2024 10:10

Да, как только вы направили меня на правильный путь, я подробно остановился на этом, спасибо!

Francesco Potortì 07.03.2024 16:46

Хотя решение, предложенное теожем, является общеупотребительным и в большинстве случаев лучшим, поскольку у меня ровно один балл в день, я придумал решение, на мой взгляд более читабельное. С этой целью он использует форму с шестью аргументами 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 (это один день).

theozh 25.02.2024 21:01

Другие вопросы по теме