Линейный график в 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.)

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