Gnuplot: установить соотношение сторон осей X и Y на трехмерном графике

Я создаю 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. Но теперь, конечно, тики будут отображать неправильные значения, поэтому я их отключил.)

Каковы типичные диапазоны данных по x,y,z и каковы желаемые визуальные соотношения x,y,z? Какие углы обзора или это на интерактивном терминале? Не могли бы вы показать на иллюстрации, что у вас есть и как вы хотите, чтобы это выглядело?

theozh 19.06.2024 14:00

Привет, спасибо, что заглянули! Я добавил пример к вопросу, надеюсь, это поможет. (Изображения представляют собой просто снимки экрана с интерактивного терминала (угол обзора также устанавливается интерактивно), но мой вопрос относится и к неинтерактивным терминалам.)

Fii 19.06.2024 15:51

Спасибо за предоставленный эскиз. Это значительно облегчило понимание.

theozh 19.06.2024 19:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот предложение, которое может помочь вам немного дальше. Я предполагаю, что «секрет» заключается в следующих строках, которые по сути представляют собой сопоставление с различными координатами (проверьте 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 21.06.2024 17:27

@Fii, пожалуйста! Я думаю, что смещение/сдвиг — это не ошибка, а скорее недостаток нашего понимания того, как оно на самом деле масштабируется. Я пробовал что-то с set margins или set bmargin, но вы правы, я не подумал о set origin. Пока не знаю, как вычислить правильное начало координат, которое может зависеть от z-масштабирования и, возможно, угла обзора.

theozh 22.06.2024 04:42

Другие вопросы по теме