如何在matplotlib中的不透明表面上绘制图形?

时间:2013-04-03 17:53:38

标签: matplotlib

我想在球体表面绘制一些点。为了我的目的,我需要能够在三维球体周围绘制线条。球体应是不透明的,这样在视图中人们只能看到球体可见半部分上的点。目前我只是使用以下代码段绘制点数:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 1 * np.outer(np.cos(u), np.sin(v))
y = 1 * np.outer(np.sin(u), np.sin(v))
z = 1 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride =5,
    cstride = 5, color ='yellow')
plt.plot(CatVec[:,0],CatVec[:,1],CatVec[:,2],'ro')

这给我以下情节: 3D plot with a line that goes around the sphere once. Only 50% of the points should be visible.

不幸的是,所有点都可见。那些实际上位于球体背面的那些。

如何使球体不透明,以便只能看到球体正面的点?

2 个答案:

答案 0 :(得分:2)

由于3D图形的渲染方式,使用matplotlib并不容易。没有 true 3D支持,只有代码可以生成从3D到2D的投影。这对单个艺术家来说很有用,并且可以涵盖很多用例,但艺术家被绘制到画布的方式意味着一个艺术家总是总是在另一个上面,没有办法让艺术家在某些地方切换订单。

你可以排序解决这个问题,方法是“手动”拆分并用正确的顺序绘制你的函数(参见How to draw intersecting planes?),但这意味着你不能旋转出一些小视角,看起来“正确”。

我建议调查mayavi这是一个基于OpenGL的绘图包,它可以做真正的3D。

答案 1 :(得分:0)

什么是使用Mollweide投影?

#!/usr/bin/env python

#some hints from here http://wiki.scipy.org/Cookbook/Matplotlib/Maps

import os
import sys
import numpy
from pylab import *
from mpl_toolkits.basemap import Basemap
from matplotlib import rc
import matplotlib.pyplot as plt

fig = plt.figure()
m=Basemap(projection='moll',lon_0=0,resolution='c')

m.drawmeridians(arange(0, 360, 30))
m.drawparallels(arange(-90, 90, 30))

lats=np.zeros(3,dtype=np.float)
lons=np.zeros(3,dtype=np.float)

lats[0] = 0; lats[1]=30; lats[2]=60
lons[0] = 0; lons[1]=30; lons[2]=-30

x,y = m(lons,lats)

plt.plot(x,y,'r')

plt.savefig('a.ps')
close()