Gnuplot 3d-глубинный заказ с несколькими участками - PullRequest
0 голосов
/ 12 июня 2018

Используя эту запись gnuplotting в качестве вдохновения, я пытаюсь создать трехмерный гистограммный график, как показано ниже: respects depthorder
Однако при просмотре под большими углами depthorder не соблюдается: does not respect depthorder

Команды gnuplot ( версия 5.2 ), используемые для создания графиков, включают:

set terminal pngcairo  enhanced  size 800,600 
set output "cube_depthorder.png"
set cbrange [0:10] 
set palette defined ( 1 '#ff4c4d', 2 '#ce4c7d', 3 '#ae559e', 4 '#df866d', 5 '#ffb66d', 6 '#ffe7cf', 7 '#cecece', 8 '#6d6d6d', 9 '#4c4c8e', 10 '#4c4cef' )
set view 60,45,1,1
set xrange [-0.09:1.99] 
set xyplane at 0
set yrange [-0.1125:2.0125] 
set pm3d at s depthorder border
unset colorbox
splot   "-" binary record=(5,4) format="%double%double%double"   using 1:2:3 notitle with lines  dt solid  linecolor  rgb  "black "  ,   "-" binary record=(5,4) format="%double%double%double"   using 1:2:3 notitle with lines  dt solid  linecolor  rgb  "black "  ,   "-" binary record=(5,4) format="%double%double%double"   using 1:2:3 notitle with lines  dt solid  linecolor  rgb  "black "  ,   "-" binary record=(5,4) format="%double%double%double"   using 1:2:3 notitle with lines  dt solid  linecolor  rgb  "black "  

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

Я подозреваю, что depthorder измеряет четырехугольники от их центров до области просмотра окна.Сюжет и сортирует по расстоянию.Существует такой угол, что высокие четырехугольники имеют центры ближе, чем более короткие четырехугольники, и, следовательно, вытягиваются в другом порядке.

Правильно ли это подозрение, или здесь есть другая проблема?Есть ли решение для depthorder измерения «правильно» в этом случае?

Для тех, кто хочет воссоздать эти графики, вот файл данных, содержащий изолинии (каждая строка пять (х, y, z) точек, для каждого куба есть 4 строки (2 горизонтальных и 2 вертикальных) и четыре куба):

0 1 0 
0 1.9 0 
0 1.9 2 
0 1 2 
0 1 0 

1 1 0 
1 1.9 0 
1 1.9 1 
1 1 1 
1 1 0 

0 0 0 
0 0.9 0 
0 0.9 1 
0 0 1 
0 0 0 

1 0 0 
1 0.9 0 
1 0.9 0 
1 0 0 
1 0 0 


0.9 1 0 
0.9 1.9 0 
0.9 1.9 2 
0.9 1 2 
0.9 1 0 

1.9 1 0 
1.9 1.9 0 
1.9 1.9 1 
1.9 1 1 
1.9 1 0 

0.9 0 0 
0.9 0.9 0 
0.9 0.9 1 
0.9 0 1 
0.9 0 0 

1.9 0 0 
1.9 0.9 0 
1.9 0.9 0 
1.9 0 0 
1.9 0 0 


0 1 0 
0 1.9 0 
0.9 1.9 0 
0.9 1 0 
0 1 0 

1 1 0 
1 1.9 0 
1.9 1.9 0 
1.9 1 0 
1 1 0 

0 0 0 
0 0.9 0 
0.9 0.9 0 
0.9 0 0 
0 0 0 

1 0 0 
1 0.9 0 
1.9 0.9 0 
1.9 0 0 
1 0 0 


0 1 2 
0 1.9 2 
0.9 1.9 2 
0.9 1 2 
0 1 2 

1 1 1 
1 1.9 1 
1.9 1.9 1 
1.9 1 1 
1 1 1 

0 0 1 
0 0.9 1 
0.9 0.9 1 
0.9 0 1 
0 0 1 

1 0 0 
1 0.9 0 
1.9 0.9 0 
1.9 0 0 
1 0 0 

Ответы [ 2 ]

0 голосов
/ 23 августа 2019

Я знаю, что это старый вопрос, но, вдохновленный той же записью gnuplotting , я решил попробовать что-то, что действительно будет работать на gnuplot 5.2.7.Это на самом деле доказательство концепции !
Я понял, что даже при использовании depthorder base правильный z-порядок достигается просто путем создания граней куба в определенной последовательности.
Для иллюстрации я использовал следующий файл данных для построения "кубов" .

0.1 0.1 0.0
0.9 0.1 0.0
0.9 0.1 1.0
0.1 0.1 1.0
0.1 0.1 0.0

0.9 0.1 0.0
0.9 0.9 0.0
0.9 0.9 1.0
0.9 0.1 1.0
0.9 0.1 0.0

0.9 0.1 1.0
0.9 0.9 1.0
0.1 0.9 1.0
0.1 0.1 1.0
0.9 0.1 1.0

0.9 0.1 0.0
0.9 0.9 0.0
0.1 0.9 0.0
0.1 0.1 0.0
0.9 0.1 0.0

Используя этот код ...

reset
set terminal pngcairo font "Ubuntu,10" size 1000,800
set output "3D_Graph.png"
set tics out nomirror
unset key
set xyplane at 0
unset colorbox

set arrow 1 from 0.55,0.40,0 to 1.45,0.4,0 nohead
set arrow 2 from 0.55,0.32,0 to 0.55,0.47,0 nohead
set arrow 3 from 1.45,0.32,0 to 1.45,0.47,0 nohead

set arrow 4 from 1.60,0.55,0 to 1.60,1.45,0 nohead
set arrow 5 from 1.55,0.55,0 to 1.65,0.55,0 nohead
set arrow  from 1.55,1.45,0 to 1.65,1.45,0 nohead

set style textbox opaque noborder fillcolor rgb "white"
set label 1 "0.9" at 0.95,0.2,0.0 boxed
set label 2 "0.9" at 1.70,1.0,0.0 boxed

set style line  1 lw 1.5 lc rgb "#fde725" 

# viridis colormap
set palette defined(\
    1 "#440154",\
    2 "#472c7a",\
    3 "#3b518b",\
    4 "#2c718e",\
    5 "#21908d",\
    6 "#27ad81",\
    7 "#5cc863",\
    8 "#aadc32",\
    9 "#fde725"\
)
# ================================================================================
set multiplot layout 2,2
set xtics 1
set ytics 1
set view equal xyz
set view ,,1.5,1
set cbrange [0:1]
set grid ls -1 lc "gray"
set pm3d depthorder hidden3d
set pm3d implicit
unset hidden3d
set title "{/:Bold single cube}"

splot [0:2][0:2][0:1] "cube_points.dat" u ($1+0.5):($2+0.5):($3):(0) w l ls 1
unset for [i=1:6] arrow i
unset for [i=1:2] label i
# --------------------------------------------------------------------------------
set grid xtics ytics ztics vertical layerdefault ls -1 lc "gray"
set view equal xy
set view ,,1.75,0.55
set xrange [0.25:6.6]
set yrange [0.25:4.0]
set zrange [0:100]
set ztics 20
set cbrange [0:*]

set object polygon from \
    graph 0, 0, 0 to \
    graph 1, 0, 0 to \
    graph 1, 1, 0 to \
    graph 0, 1, 0 to \
    graph 0, 0, 0 fc rgb "gray" fs transparent solid 0.50 noborder

set pm3d depthorder base border lw 0.5
set title "{/:Bold pm3d with depthorder base border lw 0.5}"

splot \
    "cube_points.dat" u ($1+0.5):($2+0.5):($3*15):(1) w pm3d,\
    "cube_points.dat" u ($1+0.5):($2+1.5):($3*65):(1) w pm3d,\
    "cube_points.dat" u ($1+0.5):($2+2.5):($3*85):(1) w pm3d,\
    "cube_points.dat" u ($1+1.5):($2+0.5):($3*30):(2) w pm3d,\
    "cube_points.dat" u ($1+1.5):($2+2.5):($3*75):(2) w pm3d,\
    "cube_points.dat" u ($1+1.5):($2+1.5):($3*50):(2) w pm3d,\
    "cube_points.dat" u ($1+2.5):($2+0.5):($3*30):(3) w pm3d,\
    "cube_points.dat" u ($1+2.5):($2+1.5):($3*40):(3) w pm3d,\
    "cube_points.dat" u ($1+2.5):($2+2.5):($3*60):(3) w pm3d,\
    "cube_points.dat" u ($1+3.5):($2+0.5):($3*20):(4) w pm3d,\
    "cube_points.dat" u ($1+3.5):($2+1.5):($3*50):(4) w pm3d,\
    "cube_points.dat" u ($1+3.5):($2+2.5):($3*85):(4) w pm3d,\
    "cube_points.dat" u ($1+4.5):($2+0.5):($3*25):(5) w pm3d,\
    "cube_points.dat" u ($1+4.5):($2+1.5):($3*40):(5) w pm3d,\
    "cube_points.dat" u ($1+4.5):($2+2.5):($3*50):(5) w pm3d,\
    "cube_points.dat" u ($1+5.5):($2+0.5):($3*15):(6) w pm3d,\
    "cube_points.dat" u ($1+5.5):($2+1.5):($3*30):(6) w pm3d,\
    "cube_points.dat" u ($1+5.5):($2+2.5):($3*40):(6) w pm3d

# --------------------------------------------------------------------------------

set pm3d depthorder base lighting noborder
set title "{/:Bold pm3d with depthorder base lighting noborder}"
replot

# --------------------------------------------------------------------------------

set pm3d depthorder base lighting border lw 0.5
set title "{/:Bold pm3d with depthorder base lighting border lw 0.5}"
replot
unset multiplot

... Iсмог достичь этого результата:

3D boxbar using gnuplot

Работает даже при высоком ракурсе:

3D horizontal rotation

3D vertical rotation

Конечно, этот код не может читать файлы данных x y z -типа или создавать трехмерные столбчатые диаграммы, но это только начало.

0 голосов
/ 13 июня 2018

3D-боксы, подобные этому, теперь поддерживаются в качестве базового типа графика в версии разработки gnuplot.Посмотрите этот онлайн-пример: http://gnuplot.sourceforge.net/demo_5.3/3dboxes.html

Хитрость для этой работы заключается в том, что грани ящика должны быть отсортированы по значению z в ​​основании.Это реализовано в новом варианте команды

set pm3d deeporder base

Я не знаю ни одного способа сделать это правильно в более ранних версиях gnuplot.

...