Gnuplot: изменение плотности пунктирной линии в пятне

#gnuplot #heatmap #dotted-line

#gnuplot #тепловая карта #пунктирная линия

Вопрос:

Я пытаюсь нанести пунктирную линию внутри пятна с помощью следующего кода в Gnuplot 4.6 patchlevel 4:

 set terminal "pdfcairo" enhanced dashed size 15,10
set pm3d map
set output "test.pdf"
splot 'map.dat' using 1:($2/1000):3 notitle, 
   'line1.dat' using 1:($2/1000):1 notitle with lines ls 2, 
   'line2.dat' using 1:($2/1000):1 notitle with lines ls 2
unset output
  

Тепловая карта работает, как и line1.dat. Однако вторая строка выглядит в основном сплошной. Разница в том, что line1.dat содержит 70 записей, а line2.dat — 900. Вторая строка имеет переход между двумя точками, и там она пунктирная.

Кто-нибудь знает, как я могу изменить плотность точек, чтобы вся линия выглядела пунктирной. Изменение исходного файла данных не является опцией.

Спасибо за вашу помощь,

нет

Редактировать:

Один из найденных мной обходных путей заключается в

 splot 'line2.dat' every ...
  

но это может стать неудобным при скачке данных.

Ответ №1:

Команда (s)plot 'line.dat' with lines сначала отображает точки данных, а затем соединяет точки данных с помощью линий с соответствующим стилем строки. Если точки данных расположены слишком близко друг к другу, при использовании стиля пунктирной линии для некоторых пробелов не останется места.

Чтобы отобразить пунктирную линию, вы можете попробовать заменить точки функцией или уменьшить количество точек.

  • Попробуйте использовать пунктирные линии вместо пунктирных. Linestyle и linecolor могут быть установлены независимо: splot 'line.dat' with lines ls 0 lc 2 . 900 точек может быть слишком много для этого подхода.

  • Установка функции могла бы сработать, но, вероятно, слишком сложно найти подходящую функцию.

  • every Опция уменьшает количество точек.

  • Другой возможностью уменьшить количество точек было бы интерполировать точки с помощью smooth опции. Для этого требуется временный файл и работает следующим образом:

     # [prepare plot]
    set samples 100
    set table "line2.dat.tmp"
    plot 'line2.dat' using 1:($2/1000) smooth mcsplines with lines ls 2 
    unset table
    
    set terminal "pdfcairo" enhanced dashed size 15,10
    set pm3d map
    set output "test.pdf"
    
    # [plot]
    splot 'map.dat' using 1:($2/1000):3 notitle, 
       'line1.dat' using 1:($2/1000):1 notitle with lines ls 2, 
       'line2.dat.tmp' using 1:2:1 notitle with lines ls 2
    
    unset output
      

В разделе [подготовить график] создается временный файл «line2.dat.tmp», который содержит точки данных, интерполирующие line2.dat. Вам придется поиграть с set samples , чтобы набрать нужное количество очков. В примере мы имеем 100 равноудаленных точек вместо 900 точек с разными расстояниями.
Опция smooth mcsplines сохраняет монотонность и выпуклость исходных точек данных, см. help smooth mcsplines в оболочке gnuplot.

В разделе [график] исходные «lines2.dat» заменяются интерполированными данными.

Этот подход работает, если исходные данные достаточно сглажены, так что замена 900 точек на 100 точек не пропускает важную информацию. Возможно, вы хотите отобразить обе «lines2.dat» и «lines2.dat.tmp» на одной диаграмме, чтобы сравнить их.

Комментарии:

1. Спасибо за вашу помощь. Для перехода в данных я использовал три «every» (один для первой части, один для правильного перехода и один для второй части).

Ответ №2:

Используйте каждое ключевое слово, вот так:

 'line2.dat' every 20 using 1:($2/1000):1 notitle with lines ls 2