Matplotlib: интерьер формы другого цвета - PullRequest
0 голосов
/ 22 января 2019

Рассмотрим график псевдосферы , полученный с помощью следующего кода (только синяя форма ниже)

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np

    '''
    ==========================================
    Ploting S^n_1
    '''

    fig = plt.figure(figsize=plt.figaspect(1))  
    ax = fig.add_subplot(111, projection='3d')

    r=1
    u=np.linspace(-2,2,200)
    v=np.linspace(0,2*np.pi,60)
    [u,v]=np.meshgrid(u,v)

    a = 1
    b = 1
    c = 1

    x = a*np.cosh(u)*np.cos(v)
    y = b*np.cosh(u)*np.sin(v)
    z = c*np.sinh(u)

    ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='#428bca')
    ax.set_axis_off()
    plt.show()

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Поскольку matplotlib 3D не способен выполнять множество реальных 3D-операций. Здесь используется простой трюк. Поверхность разделена на 2 части и нарисована разными цветами. Наконец, угол обзора тщательно устанавливается для визуализации изображения.

Вот рабочий код (на основе вашего):

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=plt.figaspect(1))
fig.set_size_inches([8,8])
ax = fig.add_subplot(111, projection='3d')

#r=1

# values for extents of meshes
begp = 0.25
endp = 1+begp
extp = endp+1

u = np.linspace(-2, 2, 200)
#v = np.linspace(0, 2*np.pi, 60)
v = np.linspace(begp*np.pi, endp*np.pi, 30)
[u,v] = np.meshgrid(u,v)

u2 = np.linspace(-2, 2, 200)
v2 = np.linspace(endp*np.pi, extp*np.pi, 30)
[uu2, vv2] = np.meshgrid(u2, v2)

a = 1
b = 1
c = 1

# surface 1
x = a*np.cosh(u)*np.cos(v)
y = b*np.cosh(u)*np.sin(v)
z = c*np.sinh(u)

# surface 2
x2 = a*np.cosh(uu2)*np.cos(vv2)
y2 = b*np.cosh(uu2)*np.sin(vv2)
z2 = c*np.sinh(uu2)

# plot surface 1 in red / surface 2 in blue
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='red', edgecolor='gray')
ax.plot_surface(x2, y2, z2, rstride=4, cstride=4, color='blue', edgecolor='lightgray')

# set viewing angle + perspactive to get best image
ax.azim = 313   # z rotation (default=270)
ax.elev = 16    # x rotation (default=0)
ax.dist = 8    # zoom (define perspective)
ax.set_axis_off()
plt.show()

Сгенерированное изображение:

enter image description here

0 голосов
/ 22 января 2019

Применяя предложения @ Guimoute, я придумал что-то, что немного легче читать. Вот единственная строка, измененная в приведенном выше коде

ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='#428bca', edgecolor='#003366')

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

enter image description here

PS

Я не буду (пока) принимать это как ответ, если кто-то еще что-то придумает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...