Различная шкала для отрицательных и положительных значений по оси Y - Gnuplot - PullRequest
0 голосов
/ 17 ноября 2018

Можно ли построить график с использованием другого масштаба для отрицательных и положительных значений по осям Y в Gnuplot?

Я хочу установить диапазон значений Y по осям Y в диапазоне от -2 до70. Для значений от 0 до 70 я хочу шкалу, например, 0,10,20,30, .. 70.Для значений от 0 до -2 я хочу другую шкалу: 0, -0,1, -0,2, -0,3, ..- 2.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Этот ответ уже принят, но я проделал еще кое-какую работу, которой хочу поделиться;в частности, я хотел иметь больший контроль над двумя подграфами, чем позволяет строка

set multiplot layout 2,1 margins 0.1,0.95,0.1,0.95 spacing 0

.Нижний подграф должен быть заметно «тоньше» верхнего.Пользуясь случаем, я также хотел ответить на вопрос Владимира в его комментарии.Итак, мы идем:

### set up multiplot so that the two subgraphs are joined
set multiplot
 # we need to set a left margin to keep the subgraphs aligned,
 # and we need enough space for the ylabel
set lmargin 10
# no bottom margin, so that the second subgraph touches the upper one
set bmargin 0
# no titles please
unset key
# but we want a ylabel
set ylabel "Scales"
# no xtics
unset xtics

Для Владимира: см. help set border

# we want left, top and right 2 + 4 + 8
# but no bottom border
set border 14

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

set size 1,0.5                          # full with, half hight
set origin 0,0.5                        # start at the left border, half way up
# optional: colour background
# set object 1 rect from -2,0 to 2,80 fc rgb "yellow" fillstyle solid .15 noborder

Готов нарисовать график:

plot[-2:2][0:80] "so.dat" using 2:($3>0?$3:NaN)\
                  w points pt 7 ps 2

Остальное за один раз:

# we do want xtics a label at the bottom
set xtics -2,.5,2 nomirror
set xlabel "Multiplot In Action"
set ylabel "Different"

set size 1,0.3                  # full width, 30% of height, keep space for xlabel
set origin 0,0.2                # left, keep bottom 20% free
set tmargin 0                   # no top margin, touch the upper subgraph
set bmargin 2                   # for the xlabel
set border 11                   # we want left, bottom and right border, no top 1 + 2 + 8
# set object 2 rect from -2,-2 to 2,0 fc rgb "blue" fillstyle solid .15 noborder
plot[-2:2][-2:0] "so.dat" using 2:($3<0?$3:NaN)\
                 w points pt 5 ps 2

# cleanup
unset multiplot
reset

Это дает нам

enter image description here

Мне бы понравились цветные фоны, но нижний рисует точки в верхнем, и я не смог это исправить (back не помогает).

0 голосов
/ 25 ноября 2018

Начиная с gnuplot 5.2, вы можете определять нелинейные системы координат с помощью set nonlinear. Это работает аналогично set link: вы должны предоставить функцию отображения и ее инверсию для оси, которую вы хотите изменить.

В вашем случае функция отображения будет масштабировать все положительные значения y и оставлять отрицательные значения немасштабированными:

RATIO=0.1
map(y) = y > 0 ? y*RATIO : y
inv_map(y) = y > 0 ? y/RATIO : y
set nonlinear y via map(y) inverse inv_map(y)

set xrange[-5:50]
plot x 

enter image description here

0 голосов
/ 19 ноября 2018

Понимая ваше намерение в целом, я не уверен, что данные, которые вы предоставляете, достаточно хороши, чтобы проиллюстрировать ваш желаемый результат, поэтому я добавил еще две точки данных, где фактически используется раздел с отрицательной осью Y (см. Нанижняя часть поста).

Я использовал

  • multiplot, чтобы создать два отдельных графика, один для значений y больше и один для тех, кто меньше нуля
  • троичный оператор (a ? b : c) для разделения даты для каждого графика

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

# set up multiplot so that the two subgraphs are joined
set multiplot layout 2,1 margins 0.1,0.95,0.1,0.95 spacing 0
# no titles please
unset key
# we don't want tics for the upper half
unset xtics

plot[-2:2][0:70] "so.dat" using 2:($3>0?$3:NaN)\
                 w points pt 7 ps 2

# we do want xtics at the bottom
set xtics
plot[-2:2][-2:0] "so.dat" using 2:($3<0?$3:NaN)\
                 w points pt 5 ps 2

# cleanup
unset multiplot
reset

доходность

enter image description here

Моя версия данных so.dat:

#                   TCP                     TFO
"Preparation"       1.126717                68.852979 
"Establishment"     -0.0436158              1.5529298
"Transfer"          -0.1172298              0.5735358
"Interruption"      0.125                   -1.25
"Execution"         -1.5                    -0.05
...