Я создаю 3D-график с помощью splot в gnuplot 6.0 и хочу вручную установить масштабирование (/соотношение сторон) всех трех осей.
Есть несколько связанных команд, но ни одна из них не делает этого:
Масштаб оси Z можно установить с помощью четвертого аргумента команды set view. Это именно то, что я хочу, но команда работает только для оси Z. Вот почему в названии написано «x и y», должен быть какой-то другой способ масштабировать эти два.
Для 2D-графика вы можете установить соотношение сторон осей X и Y с помощью set size ratio <r>
, но это не работает в 3D-графике.
(Вы также можете использовать set size <xscale>,<yscale>
, который работает для 2D-графика, но для 3D-графика масштабируется конечная 2D-проекция на экране, а не оси.)
Единственный вариант трехмерного графика, который я могу найти, который устанавливает масштабирование x и y, — это set view equal xy
(или set view equal xyz
), что приводит к соотношению сторон 1:1(:1). Но я хочу установить соотношение сторон, отличное от 1:1(:1).
(Единственный обходной путь, который я могу придумать, — это масштабировать сами данные, а затем изменять деления для компенсации. Но кажется, что должен быть лучший способ.)
Вот простая линия с двумя прямоугольными «импульсами», один в направлении y, другой в направлении z. Он изображен с splot "data.csv" with lines
без каких-либо дальнейших изменений:
Вот как выглядит data.csv
:
0 0 0
1 0 0
1 3 0
2 3 0
2 0 0
3 0 0
4 0 0
4 0 3
5 0 3
5 0 0
6 0 0
Я хочу что-то вроде этого, где масштабирование x:y:z составляет 5:1:1 (поэтому одна единица длины по оси x отображается в 5 раз длиннее, чем одна единица длины по оси y или z, а y и z масштабируются одинаково).
(Это было достигнуто с помощью описанного выше обходного пути путем исправления масштабирования осей с помощью set view equal xyz
, а затем просто масштабирования данных с помощью splot "data.csv" using ($1*5):2:3 with lines
. Но теперь, конечно, тики будут отображать неправильные значения, поэтому я их отключил.)
Привет, спасибо, что заглянули! Я добавил пример к вопросу, надеюсь, это поможет. (Изображения представляют собой просто снимки экрана с интерактивного терминала (угол обзора также устанавливается интерактивно), но мой вопрос относится и к неинтерактивным терминалам.)
Спасибо за предоставленный эскиз. Это значительно облегчило понимание.
Вот предложение, которое может помочь вам немного дальше.
Я предполагаю, что «секрет» заключается в следующих строках, которые по сути представляют собой сопоставление с различными координатами (проверьте help nonlinear
).
set view equal xyz
Rx = 5.0
set nonlinear x via x*Rx inverse x/Rx
Однако есть еще несколько вещей:
set view 60,30, 3,3
: масштабируйте x и z в 3 раза, чтобы заполнить холст графиком.set xtics 1 scale 4.0 offset -1.0,-0.5
чтобы отрегулировать длину xtic и смещение xticlabels. Аналогично для ytics и zticsЧто мне пока не ясно, например. на случай, если вы хотите установить соотношение x:y:z
из 5:1:2
set nonlinear z via z*Rz inverse z/Rz
смещает график за пределы холста и как сместить его обратно?Скрипт:
### set visually different xyz ratio than 1:1:1
reset session
$Data <<EOD
0 0 0
1 0 0
1 3 0
2 3 0
2 0 0
3 0 0
4 0 0
4 0 3
5 0 3
5 0 0
6 0 0
EOD
set view equal xyz
set view 60,30, 3,3
Rx = 5.0
Ry = 1.0
Rz = 1.0
set nonlinear x via x*Rx inverse x/Rx
set nonlinear y via y*Ry inverse y/Ry
# set nonlinear z via z*Rz inverse z/Rz # this will lead to a shift of the graph
unset key
set tics out
set xtics 1 scale 4.0 offset -1.0,-0.5
set mxtics Rx
set yrange[-1:4]
set ytics 1 scale 0.333 offset -2.0, 0.5
set ztics 1 scale 1.0
set xyplane relative 0
set grid x,mx,y,z vertical
set border 1+2+4+8+16+32+64+256+512
splot $Data u 1:2:3 w l lw 2 lc "red"
### end of script
Результат:
Это решает проблему! Огромное вам спасибо, а также за то, что вы приложили дополнительную работу, чтобы все красиво оформить, вместо того, чтобы просто решить проблему. Я также получаю странное смещение при использовании set nonlinear z ...
, я полагаю, это ошибка? Смещение даже не зависит от Rz
. Можно вернуть сюжет в поле зрения, используя что-то вроде set origin 0,0.4
.
@Fii, пожалуйста! Я думаю, что смещение/сдвиг — это не ошибка, а скорее недостаток нашего понимания того, как оно на самом деле масштабируется. Я пробовал что-то с set margins
или set bmargin
, но вы правы, я не подумал о set origin
. Пока не знаю, как вычислить правильное начало координат, которое может зависеть от z-масштабирования и, возможно, угла обзора.
Каковы типичные диапазоны данных по x,y,z и каковы желаемые визуальные соотношения x,y,z? Какие углы обзора или это на интерактивном терминале? Не могли бы вы показать на иллюстрации, что у вас есть и как вы хотите, чтобы это выглядело?