2015-12-11 4 views
1

Я пытаюсь отобразить поверхность, но мне не удается получить красивую визуализацию. plot_surface функция от matplotlib дает мне следующий рисунок:Правильно сделанный 3d plot_surface в matplotlib

plot_surface

произведенный код ниже. Как я могу избавиться от этой прозрачности и каркаса, который все еще отображается, если вы внимательно посмотрите?

import numpy as np 
import matplotlib.pyplot as pl 
from mpl_toolkits.mplot3d import Axes3D 
pl.ion() 

nx = 512 
ny = 512 

Lx = 2.e6 
Ly = 2.e6 

x = np.linspace(0., Lx, nx) 
y = np.linspace(0., Ly, ny) 

xx, yy = np.meshgrid(x,y) 

Ld = 6.e4 
h = np.exp(-((xx - 0.5*Lx)**2 + (yy - 0.5*Ly)**2)/Ld**2) 

pl.figure() 
ax = pl.subplot(111, projection='3d') 
ax.plot_surface(xx/1000., yy/1000., h, alpha=1., cstride=1, rstride=1, linewidth=0) 
ax.set_zlim3d(-0.2, 1.) 

ответ

1

Это только обходное решение, но это работает для большинства подпрограмм matplotlib, таких как, например, contourf (где раньше у меня была такая же проблема); называя сюжет обычной (в данном случае plot_surface) дважды решает обе проблемы:

enter image description here

Левая фигура с вызовом plot_surface раз, право один назвав его дважды.

Для непрозрачной поверхности установка antialiased=False помогает (слева внизу), с прозрачностью antialiased=True производит очень тонкие линии на краях многоугольника (я подозреваю, что многоугольники слегка перекрываются), но они едва заметны (справа внизу).

enter image description here

fig = pl.figure() 
ax = pl.subplot(121, projection='3d') 
surf = ax.plot_surface(xx/1000., yy/1000., h, alpha=1.0, cstride=1, rstride=1, linewidth=0, antialiased=False) 

ax = pl.subplot(122, projection='3d') 
surf = ax.plot_surface(xx/1000., yy/1000., h, alpha=0.3, cstride=1, rstride=1, linewidth=0, antialiased=True) 

 Смежные вопросы

  • Нет связанных вопросов^_^