Линейный график в GnuPlot, где ширина линии - третий столбец в моем файле данных?
У меня есть файл данных, который имеет три столбца:
1 1.0 1
2 1.5 2
3 0.0 3
4 1.2 2.5
5 1.0 1
6 1.1 5
где первый столбец - это мое значение X, второй столбец - это мое значение Y, а третий столбец - это ширина линии. Я бы хотел, чтобы каждый сегмент линии отображался в соответствии с шириной линии третьего столбца.
Я старался:
plot 'file1.dat' using 1:2:3 with lines lw var
Но я получаю неопределенную переменную: var error.
Возможно ли это в gnuplot?
Благодарю.
3 ответа
Если вы определили столбец 3 как ширину линии между точками n и n+1 (поэтому значение столбца 3 строки будет игнорироваться), вы можете обмануть:
stat 'file1.dat'
n=STATS_records
plot for [i=0:0] 'file1.dat' using 1:2:(alma=$3) every ::i::i w l lc 1 lw 1
plot for [i=0:n-1] 'file1.dat' using 1:2:(alma=$3) every ::i::i+1 w l lc 1 lw alma notitle
ИЛИ ЖЕ
plot 'file1.dat' u 0:1
n=GPVAL_DATA_X_MAX
plot for [i=0:0] 'file1.dat' using 1:2:(alma=$3) every ::i::i w l lc 1 lw 1
plot for [i=0:n] 'file1.dat' using 1:2:(alma=$3) every ::i::i+1 w l lc 1 lw alma notitle
Вам нужен первый plot for[i=0:0]
"инициализировать" переменную "alma".
Как упоминал @Christoph в комментариях, у вас есть точки (строки) иN
значения ширины линии, но толькоN-1
соединительные линии. Таким образом, вы должны решить, какое значение ширины линии следует применить к какой линии. Какой пропустить? Первый или последний? Здесь пропущен последний.
По сути, это укороченная версия решения @Tom Solid. На самом деле, вы можете получить начальное значение уже во времяstats
команда.
Как упомянул @Joce и предлагает @Ilya Zakharevich в своем ответе, если вы не боитесь дополнительных усилий, вы также можете рисовать конические линии .
Данные:
# x y linewidth
1 1.0 1
2 1.5 2
3 0.0 3
4 1.2 2.5
5 1.0 1
6 1.1 5
Скрипт: (работает с gnuplot 4.6.0, март 2012 г.)
### workaround for variable linewidth
reset
FILE = "SO/SO37925489.dat"
stats FILE u ((N=$0)==0?Lw0=$3:0) nooutput
set grid
plot for [i=0:N] FILE u 1:2:(Lw0=$3) every ::i::i+1 w l lw Lw0 lc rgb "red" notitle
### end of script
Результат:
stat 'varwidth.dat' nooutput
n=STATS_records; prex=0; prey=0; SC=2 # How y-axis is expanded relative to the x-axis
plot for [i=0:n-1] for [try=0:1] '' using 1:((try==0?dx=$1-prex:1),(try==0?sl=($2-prey)/(dx==0?1:dx):1),(try==0?prex=$1:1),(try==0?prey=$2:1),$2+(w=$3/80*sqrt(1+(SC*sl)**2))/2):($2-w/2) every ::i::i+1 w filledcurves lc 1 notitle
Это дает правильную ширину линии (в отличие от "высоты строки", как в ответе на связанный вопрос). Понятия не имею, как совместить "линии" там, где они соединяются (кажется, невозможно без поддержки изнутри).gnuplot
).
(Предполагается, что данные в вопросе находятся в файле varwidth.dat
.)