Невозможно получить значения верхней оси через связь с нижней осью в графике GNU - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь связать верхнюю ось с нижней осью в графике gnu, то есть вывести значения на верхней оси, учитывая соотношение между величинами верхней оси и значениями нижней оси. Отношения между ними

x2 = 2*c**2/(2*x1**2-c**2) с c=1.548458. Следующего должно быть достаточно

set xlabel "Quantity lower"
set xtics nomirror
set x2label "Quantity Upper"
set x2tics nomirror
set link x2 via 2*(2*1.548458)**2/(2*x**2-(2*1.548458)**2) inverse sqrt((2*1.548458)**2*(2+x)/2/x)

#set link x via 1239.8/x inverse 1239.8/x

set ylabel "Quantity y"
set ytics 0.2
set samples 400
Spectrum(x) = exp(-(x-500)**2/(400))

set xrange[30:2000]

set format x2 "%.2f"
plot Spectrum(x) w l title "Spectrum"

Я также отформатировал ось х через

set logscale x set format x "10^{%L}"

, но независимо от того, включаю ли я форматирование журнала, я не могу распечатать какие-либо значимые значения на верхней оси. (Функция для y предназначена только для иллюстративных целей, значение для y в моем реальном сценарии основано на чтении данных из файла)

Я хотел бы распечатать значения на верхней оси, скажем, два значения x = 100, скажем, 1000. Спасибо!

1 Ответ

1 голос
/ 30 мая 2019

Я не знаю, как установить тики автоматически. Но, по крайней мере, вы можете установить их явно.

Вы хотите установить тики x2 при заданных значениях x1. Поскольку команда set x2tics занимает тиковые позиции в координатах x2, вы можете преобразовать данные значения x1 в значения x2. Я изменил ваш сценарий, чтобы проиллюстрировать, что я имею в виду:

set xlabel "Quantity lower"
set xtics nomirror
set x2label "Quantity Upper"
set x2tics nomirror

# avoid warnings by setting the xrange before linking the axes
set xrange[30:2000]

# setup the link functions
c = 1.548458 # or 2*1.548458 ? 
link_x1_x2(x) = 2*c**2/(2*x**2-c**2) 
link_x2_x1(x) = c*sqrt((2+x)/(2*x))

set link x2 via link_x1_x2(x) inverse link_x2_x1(x)

# you want to set x2 tics at x1 = 100 and x1 = 1000
# check the corresponding x2 values 
print "x2 = x1( 100) = ", link_x1_x2(100)
print "x2 = x1(1000) = ", link_x1_x2(1000)

# set the tics with formatted tic labels as an example
set x2tics ("a: %.2e" link_x1_x2(100), "b: %.2e" link_x1_x2(1000))

set ylabel "Quantity y"
set ytics 0.2
set samples 400
Spectrum(x) = exp(-(x-500)**2/(400))


# this seems not to work with explicit tics
# set format x2 "%.2f"

plot Spectrum(x) w l title "Spectrum"

Это вывод:

x2 axis linked to x1 axis

Если вам нужны логарифмические оси, а команда set link не работает, вы можете заменить ее, явно указав для свойства x2axis значение set x2range. Смотрите модифицированный скрипт:

set xlabel "Quantity lower"
set xtics nomirror
set x2label "Quantity Upper"
set x2tics nomirror


# setup the link functions
c = 1.548458 # or 2*1.548458 ?
link_x1_x2(x) = 2*c**2/(2*x**2-c**2) 
link_x2_x1(x) = c*sqrt((2+x)/(2*x))

xmin = 30
xmax = 2000
set xrange[xmin:xmax]
set x2range[link_x1_x2(xmin):link_x1_x2(xmax)]

set logscale x 
set logscale y 
set logscale x2

# set the tics at x1 = 100 and x1 = 1000
set x2tics ("a: %.2e" link_x1_x2(100), "b: %.2e" link_x1_x2(1000))

set ylabel "Quantity y"
#set ytics 0.2 # this must be improved for logarithmic plotting
set samples 400
Spectrum(x) = exp(-(x-500)**2/(400))

plot Spectrum(x) w l title "Spectrum"

Это результат:

manual linkage

Обратите внимание, что падение функции примерно при x1 = 1000 вызвано уменьшением числа.

...