Как сделать так, чтобы пунктирные линии сетки пересекались, создавая перекрестие в gnuplot? - PullRequest
2 голосов
/ 11 апреля 2019

Я строю некоторые данные и хочу использовать пунктирные линии сетки.

Подойдет любая пунктирная линия сетки, но я предпочитаю формат "длинная черта, короткая черта, длинная черта".

Например, учитывая следующий код

set grid lc rgb "#000000" lt 1 dt (50, 25, 20, 25)
plot x**2

я получаю этот результат plot x**2 naive approach

Но я бы предпочел, чтобы пересечение линий сетки происходило всегда в середине двух штрихов, как это

grid lines intersecting appropriately

Если бы я мог сделать горизонтальные линии сетки отличными от вертикальных линий сетки, и я мог бы добавить какое-то смещение к каждой из них, то я бы подумал, что есть способ сделать это. Но я тоже не могу этого сделать.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Похоже, gnuplot не может иметь два разных стиля отображения для x-grid и y-grid.Один обходной путь, который я вижу в настоящее время, состоит в том, чтобы построить два идентичных графика друг на друге.Одна с соответствующими линиями x-сетки, а другая с соответствующими линиями y-сетки.

Если вы хотите пунктирный узор с пропорциями (50-25-20-25), это соответствует (25-25-20-25-25-0) или (5-5-4-5-5-0) между двумя тиками.Кроме того, цифры длины тире и промежутка, например, в dt (50,25,20,25), похоже, находятся в фиксированном отношении к размеру графика.«Эмпирический» коэффициент равен 11 с хорошим приближением (по крайней мере, для терминала wxt, который я тестировал в gnuplot 5.2.6).

Правка: на самом деле приведенный ниже код даетразные результаты с qt терминалом.И это не просто другой фактор.Это сложнее и, вероятно, трудно решить без понимания исходного кода.Таким образом, тот факт, что следующее, похоже, работает с терминалом wxt (может быть, даже только под Windows?), Возможно, был удачным ударом.

С этим вы можете автоматически создавать свои штриховые линии, что приводит к перекрестиюна пересечениях основных линий сетки.

Допущения:

  1. ваш первый и последний тики находятся на границах
  2. вы знаете число х иy-интервалы

Вам также необходимо знать размер графика.Эти значения хранятся в переменных GPVAL_TERM..., но только после построения .Вот почему вам нужно replot, чтобы получить правильные значения.

Этот обходной путь должен, по крайней мере, всегда давать перекрестие на пересечении основных линий сетки.

Редактировать 2: просто для "полноты".Факторы для получения одинакового (или похожего) пользовательского штрихового рисунка на разных терминалах значительно различаются.wxt ок.11 qt ок.5,6 pngcairo ок.0.25.Это не то, что я ожидал.Кроме того, похоже, что факторы немного зависят от x и y, а также от размера графика.Чтобы получить «точное» перекрестие, вам, возможно, придется немного подправить эти цифры.

Код:

### dashed grid lines with crosshairs at intersections
reset session

TERM = "wxt"   # choose terminal

if (TERM eq "wxt") {
    set term wxt size 800,600
    FactorX = 11.    # wxt
    FactorY = 11.    # wxt
}
if (TERM eq "qt") {
    set term qt size 800,600
    FactorX = 5.58  # qt
    FactorY = 5.575   # qt
}
if (TERM eq "pngcairo") {
    set term pngcairo size 800,600
    set output "tbDashTest.png"
    FactorX = 0.249    # pngcairo
    FactorY = 0.251    # pngcairo
}

set multiplot
set ticscale 0,0

Units = 24   # pattern (5,5,4,5,5,0) are 24 units

# set interval and repetition parameters
IntervalsY = 10
RepetitionsY = 1
IntervalsX = 4
RepetitionsX = 3

# initial plot to get graph size
plot x**2
gX = real(GPVAL_TERM_YMAX-GPVAL_TERM_YMIN)/IntervalsY/Units/FactorY/RepetitionsY
gY = real(GPVAL_TERM_XMAX-GPVAL_TERM_XMIN)/IntervalsX/Units/FactorX/RepetitionsX
# first plot with x-grid lines
set grid xtics lt 1 lc rgb "black" dt (gX*5,gX*5,gX*4,gX*5,gX*5,0)
replot
unset grid
# second plot with y-grid lines
set grid ytics lt 1 lc rgb "black" dt (gY*5,gY*5,gY*4,gY*5,gY*5,0)
replot

unset multiplot
set output
### end of code

Результат:

enter image description here

2 голосов
/ 11 апреля 2019

Не совсем. Самое близкое, о чем я могу подумать, это

set grid x y mx my
set grid lt -1 lc "black" lw 1 , lt -1 lc bgnd lw 16
set ticscale 1.0, 0.01
set mxtics 4
plot x**2 lw 2

Но это оставляет вертикальные линии сетки сплошными. enter image description here

...