Gnuplot: осциллографический стиль линий? - PullRequest
1 голос
/ 25 января 2020

Возможно ли в Gnuplot эмулировать стиль рисования аналогового осциллографа, то есть более тонкие линии + диммишеры на больших амплитудах, например:?

my personal oscilloscope-like drawing test

Ответы [ 3 ]

5 голосов
/ 25 января 2020

Эффект, который вы видите на графике осциллографа, связан не с амплитудой, а со скоростью изменения при прорисовке кривой. Если вы знаете эту скорость изменения и можете подать ее на gnuplot в качестве третьего столбца значений, то вы можете использовать его для модуляции цвета линии при ее рисовании:

  plot 'data' using 1:2:3 with lines linecolor palette z

Я не знаю, что Цветовая палитра подойдет лучше всего для ваших целей, но здесь приведено приближение, использующее функцию с очевидной, известной производной.

  set palette gray
  set samples 1000
  plot '+' using ($1):(sin($1)):(abs(cos($1))) with lines linecolor palette

enter image description here

3 голосов
/ 31 января 2020

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

f(x) = sin(2*x) * sin(30*x)
dy = 0.02
plot '+' u 1:(f(x)+dy):(f(x)-dy) w filledcurves ls 1 notitle

Area filled between shifted curves

Это делает не допускается переменный цвет, но визуальный эффект аналогичен.

1 голос
/ 17 апреля 2020

Другой подход:

Как уже говорилось @Ethan, интенсивность каким-то образом пропорциональна скорости движения, то есть производной. Если в качестве формы сигнала используется sin(x), производная равна cos(x). Но что, если вы дали данные? Затем вы должны рассчитать производную численно. Кроме того, в зависимости от фона линия должна исчезнуть с белого (минимальная производная) до полностью прозрачного (максимальная производная), то есть вы должны изменить прозрачность с производной.

Код :

### oscilloscope "imitation"
reset session

set term wxt size 500,400 butt  # option butt, otherwise you will get overlap points
set size ratio 4./5
set samples 1000
set xrange[-5:5]

# create some test data
f(x) = 1.5*sin(15*x)*(cos(1.4*x)+1.5)
set table $Data
    plot '+' u 1:(f($1)) w table
unset table

set xtics axis 1 format ""
set mxtics 5
set grid xtics ls -1
set yrange[-4:4]
set ytics axis 1 format ""
set mytics 5
set grid ytics ls -1

ColorScreen = 0x28a7e0
set obj 1 rect from screen 0,0 to screen 1,1 behind
set obj 1 fill solid 1.0 fc rgb ColorScreen

x0=y0=NaN
Derivative(x,y) = (dx=x-x0,x0=x,x-dx/2,dy=y-y0,y0=y,dy/dx)   # approx. derivative
# get min/max derivative
set table $Dummy
    plot n=0 $Data u (d=abs(Derivative($1,$2)),n=n+1,n<=2? (dmin=dmax=d) : \
                     (dmin>d ? dmin=d:dmin), (dmax<d?dmax=d:dmax)) w table
unset table

myColor(x,y) = (int((abs(Derivative(column(x),column(y)))-dmin)/(dmax-dmin)*0xff)<<24) +0xffffff

plot $Data u 1:2:(myColor(1,2)) w l lw 1.5 lc rgb var not
### end of code

Результат:

enter image description here

...