Gnuplot: как добавить шкалу оси y2 для разных единиц

Я рисую данные из файла. Точки данных находятся в метрических единицах. Я хочу показать вторую шкалу справа (y2), что в стандартных единицах.

Файл представляет собой ракетный двигатель с течением времени. Данные находятся в Ньютонах. Я хочу показать ньютонов слева (это происходит сам по себе, естественно) и сила силы справа. Преобразование является простым фактором (умножьте N на 0.2248, чтобы получить lbf).

Я могу установить y2tics, и если я задаю y2range вручную, они появятся справа. То, что я не знаю, как сделать, - установить y2range автоматически на y1range * factor.

Мое возможное решение состоит в том, чтобы построить график дважды, один раз в Ньютонах на y1 и один раз в фунтах на y2, и сделать график y2 почти невидимым:

plot '-' using 1:($2*0.2248) with dots axes x1y2 lc rgb 'white' notitle, \
      '' using 1:2 with lines lc rgb '<color>' title '<title>'

Вышеприведенное решение часто генерирует несколько разные шкалы y: с авторанье, gnuplot округляет диапазон, поэтому верхний тик на каждой оси является круглым числом, и, конечно, округление для разных единиц отличается.

В конечном итоге я заканчиваю кодом Python, который находит наивысшее значение тяги в каждом графе, затем я явно устанавливаю yrange на это число и y2range на это число * 0.2248:

f.write("set yrange [0:%s]; set y2range[0:%s]\n" % (peak_thrust, peak_thrust*NEWTON_LBF));

Вот конечный результат: http://www.lib.aero/hosted/motors/cesaroni_12-15-12.html (примерный график ниже) enter image description here

Ответ 1

Мне кажется, что самый простой способ сделать это - просто масштабировать данные:

set y2tics
plot sin(x) w lines, 5*sin(x) w lines axes x1y2

Конечно, вы рисуете данные из файла, поэтому он будет выглядеть примерно так:

set y2tics
FACTOR=0.2248  #conversion factor from newtons to lbf
plot 'datafile' u 1:2 w lines, '' u 1:(FACTOR*$2) w lines

Если вы задаете yrange явно (что вам может понадобиться):

set yrange [ymin:ymax]
set y2range [ymin*FACTOR:ymax*FACTOR]

Наконец, если вы действительно хотите полагаться на автомасштабирование, вам понадобится сделать "гимнастику".

Сначала установите фиктивный терминал, чтобы мы могли plot без создания графика:

set term unknown
plot 'datafile' u 1:2  #collect information on our data

Теперь, когда мы собрали информацию о данных, мы можем установить наш реальный y2range

FACTOR=0.2248
set y2range [FACTOR*GPVAL_Y_MIN : FACTOR*GPVAL_Y_MAX]
set y2tics nomirror
set ytics nomirror

Теперь установите терминал и запишите данные:

set term ...
set output ...
plot 'datafile' u 1:2 w lines

Ответ 2

В версии 5.0 добавлена ​​поддержка таких отношений между осью y и y2 (или также x и x2):

set xrange[0:370]
set ytics nomirror
set y2tics
set link y2 via 0.2248*y inverse y/0.2248
plot x

example for <code>set link</code>

Ответ 3

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

Я просто использую модифицированные метки для x2axis. В вашем случае это будет

set y2tics ("10" 10/0.2248, "20" 20/0.2248 etc etc...

который может быть зациклен таким образом

do for [i=0:1000:10] { set y2tics add (sprintf("%i",i) i/0.2248) }

где диапазон for должен быть скорректирован в соответствии с вашими данными (вы можете использовать stats и переменную GPVAL_DATA_Y_MAX для полного спокойствия). Не забывайте

set ytics nomirror

Это даст именно то, что вы ищете, в (почти) одном лайнере: enter image description here

Если вы хотите использовать сетку и иметь преобразованные коэффициенты на x2axis, так что, например, для метки y = 50 N будет соответствовать y2 = 11.2 (она держит вещи в порядке, если вы используете сетку), вы можете сделать

do for [i=0:1000:50] { set y2tics add (sprintf("%5.1f",i*0.2248) }

Это результат: enter image description here