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]()