gnuplot: как сохранить постоянные цвета с помощью splot и pm3d? - PullRequest
2 голосов
/ 24 апреля 2019

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

Я нашел этот пост ( Gnuplot, pm3d и Surfaces ), который заставил меняДобейтесь этого, сначала нанося сферы на блок данных, а затем на смещенный блок данных (изображение ниже, посередине).

Теперь я хочу добавить несколько линий.Но тогда цвета сфер неожиданно меняют свой цвет (изображение внизу, внизу).Зачем?Как избежать?Как я могу сохранить первоначально предназначенные цвета?

Мой код:

### connected 3D-spheres with splot and pm3d
reset session
set obj 1 rect from screen 0,0,0 to screen 1,1,0 behind 
set obj 1 rect fc rgb "black" fs solid 1.0
set view equal xyz
set view 45,45 
unset border
unset tics
unset colorbox

set style fill solid 1.0 noborder
set pm3d depthorder noborder
set pm3d lighting specular 0.5

set isosamples 50,50
set parametric
set urange [-pi/2:pi/2]
set vrange [0:2*pi]
Radius = 1
set table $Sphere
    splot Radius*cos(u)*cos(v), Radius*cos(u)*sin(v), Radius*sin(u)
unset table
unset parametric

$Pos <<EOD
0 0 0
4 0 0
4 4 0
0 4 0
EOD

$Bonds <<EOD
0 0 0
4 0 0

4 0 0
4 4 0

4 4 0
0 4 0

0 4 0
0 0 0
EOD

PosX(i) = word($Pos[i],1)
PosY(i) = word($Pos[i],2)
PosZ(i) = word($Pos[i],3)

set palette defined (1 'red', 2 'green', 3 'blue', 4 'yellow')

set multiplot layout 3,1
    set parametric
        splot for [i=1:4] Radius*cos(u)*cos(v)+PosX(i), Radius*cos(u)*sin(v)+PosY(i), \
        Radius*sin(u)+PosZ(i) with pm3d not
    unset parametric
    unset obj 1 
    splot \
        for [i=1:4] $Sphere u ($1+PosX(i)):($2+PosY(i)):($3+PosZ(i)):(i) with pm3d not
    splot \
        for [i=1:4] $Sphere u ($1+PosX(i)):($2+PosY(i)):($3+PosZ(i)):(i) with pm3d not,\
        $Bonds u 1:2:3 w l lw 4 lc rgb "grey" not
unset multiplot
### end of code

Результат:

enter image description here

1 Ответ

1 голос
/ 25 апреля 2019

Вот второе решение, которое не требует настройки палитры. Обратите внимание, что для этого требуется функция из ветви разработки gnuplot (версия 5.3). Он появится в будущем стабильном выпуске, но еще не в версии 5.2.6.

[предварительные сведения, как указано выше, затем]

set palette defined (1 'red', 2 'green', 3 'blue', 4 'yellow')
set style line 1 lc 'red'
set style line 2 lc 'green'
set style line 3 lc 'blue'
set style line 4 lc 'yellow'

set multiplot layout 1,3
    set parametric
        splot for [i=1:4] Radius*cos(u)*cos(v)+PosX(i), Radius*cos(u)*sin(v)+PosY(i), \
        Radius*sin(u)+PosZ(i) with pm3d not
    unset parametric
    unset obj 1
    splot \
        for [i=1:4] $Sphere u ($1+PosX(i)):($2+PosY(i)):($3+PosZ(i)):(i) with pm3d not
    splot \
        for [i=1:4] $Sphere u ($1+PosX(i)):($2+PosY(i)):($3+PosZ(i)) with pm3d fc ls i not,\
        $Bonds u 1:2:3 w l lw 4 lc rgb "grey" not
unset multiplot

with pm3d fc lt i также будет работать (типы линий, а не стили линий)

enter image description here

...