Как построить определенные строки для двух графиков в Gnuplot?

Данные

ID BlockSize Size Blocks - 511.991 241520288 471728 001 511.868 24152000 47184 0001 503.2 241520 480 00001 510.829 2415200 4728 000001 511.360 4782240 9352 0000001 486.935 120760 248 000 511.889 24103840 47088 0000 493.265 193360 392 00000 511.019 2367040 4632 000000 511.262 4830400 9448 0000000 483.4 96680 200 

где я хочу

  • столбцы 3: 4, используемые для участков
  • постройте график из строк 2: 6
  • другой от 7:11

Мой старт основан на этом блоге

 set terminal qt; plot "<(sed -n '2,6p' sandboxgp.data)" using 3:4 with lines; plot "<(sed -n '7,11p' sandboxgp.data)" using 3:4 with lines; 

который дает вам только один график.

Выход Марко

Я поместил здесь logscale на ось y для ясности, где некоторый код основан на этом ответе

 set terminal qt; plot "<(sed -n '2,6p' sandbox_gp_pure.data)" using 3:4 with linespoints; replot "<(sed -n '7,11p' sandbox_gp_pure.data)" using 3:4 with linespoints; set logscale y 10; set xlabel "Size"; set ylabel "log(Blocks)"; set grid xtics ytics mxtics mytics lc rgb 'blue' lt 1, lc rgb 'red' lt 1; set mxtics; set mytics 5; set out; 

дающий

введите описание изображения здесь

Не используйте команду replot , вместо этого используйте запятую ,
Поскольку в вашем сценарии я не вижу явных причин, чтобы использовать команду replot , я предлагаю использовать запятую непосредственно , чтобы отделить две кривые, которые будут построены: plot sin(x), cos(x) например.

Возьмите его как хорошую привычку, но это больше, в принципе это принципиально (см. Ниже).
Вам может показаться интересным положить \ качестве последнего символа для разделения одной строки (обратите внимание, что это требует, чтобы после пробелов не было пробелов или других символов). Это делает скрипт более чистым.

 # ... set style data linespoint # To avoid to repeat it on each line of plot command # Note below no spaces after the `\` plot "<(sed -n '2,6p' sandbox_gp_pure.data)" using 3:4 \ , "<(sed -n '7,11p' sandbox_gp_pure.data)" using 3:4 

С replot команды replot вместо этого вы replot снова каждую кривую, уже присутствующую на графике (перечитывая данные и повторяя все следующие операции), и только после того, как вы построите новую кривую.

Это хорошая привычка, потому что, используя снова свой сценарий завтра, у вас может быть общее замедление вашего рабочего процесса, когда файлов много, огромно или в удаленной файловой системе; когда вы выполняете длительные операции для обработки данных; когда эффективно создаются точки, и вам нужно еще больше ждать графического обновления окна, если вы работаете через соединение ssh -X

Более того, в терминале как pdfcairo с

 set terminal pdfcairo; set output 'my.pdf' ; plot sin(x) replot cos(x) set output ; set terminal qt # or whatever is your default terminal 

вы получите документ на 2 страницы и файл huger pdf.


Примечание. Вы можете использовать every ключевое слово без необходимости создавать подоболочки () и вызывать внешние программы, такие как sed . Если вы не можете предварительно упорядочить их с помощью сортировки , вы можете добавить smooth unique для построения набора данных с linespoints стиля linespoints который любит записи, упорядоченные по координате x .

 plot "sandbox_gp_pure.data" every ::1::5 us 3:4 t "set 1" w linesp \ , '' every ::6::10 us 3:4 t "set 2" w linesp 

Или, если вы хотите, чтобы они заказали

 plot "sandbox_gp_pure.data" every ::1::5 u 3:4 smooth unique t "set 1" w linesp\ , '' every ::6::10 u 3:4 smooth unique t "set 2" w linesp 

Другим преимуществом является переносимость. Он будет работать даже там, где sed не установлен и должен работать даже под Windows.
Вы можете заметить сдвиг в номере линии , потому что он начинается с 0 .

Первая опорная точка в каждом блоке пронумерована '0', как и первый блок в файле.


help replot вывод:

Команда replot без аргументов повторяет последнюю команду plot или splot . Это может быть полезно для просмотра сюжета с различными параметрами set или при создании одного и того же графика для нескольких устройств.

Аргументы, указанные после того, как команда replot будет добавлена ​​в последнюю команду plot или splot ( с подразумеваемым разделителем ',' ) до повторения.

replot этого replot второй график. Тогда он не будет перезаписывать первый график.

 # will plot one graph gnuplot -p -e 'plot sin(x); plot cos(x)' # will plot two graphs gnuplot -p -e 'plot sin(x); replot cos(x)'