我想通过球体表面上的色彩映射使用Matplotlib绘制数据.另外,我想添加一个3D线图.我到目前为止的代码是这样的:
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
NPoints_Phi = 30
NPoints_Theta = 30
radius = 1
pi = np.pi
cos = np.cos
sin = np.sin
phi_array = ((np.linspace(0, 1, NPoints_Phi))**1) * 2*pi
theta_array = (np.linspace(0, 1, NPoints_Theta) **1) * pi
phi, theta = np.meshgrid(phi_array, theta_array)
x_coord = radius*sin(theta)*cos(phi)
y_coord = radius*sin(theta)*sin(phi)
z_coord = radius*cos(theta)
#Make colormap the fourth dimension
color_dimension = x_coord
minn, maxx = color_dimension.min(), color_dimension.max()
norm = matplotlib.colors.Normalize(minn, maxx)
m …
Run Code Online (Sandbox Code Playgroud) 我想渲染大约500个图像并将它们保存到不同的png文件中,因此我写了一个包含我的数据集和渲染函数的小类
from mayavi import mlab
mlab.options.offscreen=True
class Dataset(object):
def __init__(self):
some init stuff etc
.
.
.
.
def save_current_frame_to_png(self, filename):
mlab.contour3d(self.frame_data, contours =30, opacity=0.2)
mlab.savefig(filename)
mlab.clf()
mlab.close()
gc.collect()
def create_movie_files(self):
folder_name = "animation"
try:
os.makedirs(folder_name)
except OSError:
raise OSError("Directory already exists.")
self.__go_to_first_frame()
for i in range(self.frames):
filename = "".join([folder_name, "/%.5i" % i, ".png"])
print filename
self.save_current_frame_to_png(filename)
self.read_single_frame()
self.__go_to_first_frame()
Run Code Online (Sandbox Code Playgroud)
所以一切似乎都运行良好,但我看看内存使用情况,直到系统崩溃.所以我试图使用mlab.clf()
并gc.collect()
保持我的记忆低,这是行不通的.我发现一个解决方案mlab.close()
似乎适用于内存使用,但这带来了一个新问题.每次渲染新图像时,mayavi都会创建一个新窗口,因此在大约200个窗口之后程序崩溃.也许是否有可能完全禁用Windows?在我看来,mlab.options.offscreen=True
只禁用当前窗口内的绘图.
编辑:
self.frame_data
是一个numpy形状的数组(100,100,100),self.read_single_frame()
只是从文本文件中读取下一帧并存储它self.frame_data
.这个函数不会增加内存,如果我关闭渲染内存使用率保持在1.2%.
我正在尝试使用镜面着色在Python中创建美学上令人愉悦的3D绘图,并且迄今为止尝试使用Matplotlib与3D轴和Mayavi的表面绘图,例如,来自Mayavi冲浪示例网页:
结果看起来很好,在Mayavi中似乎有合理的照明控制,虽然我似乎无法实现"闪亮"的外观.
在Matlab中,这可以通过使用'Phong'照明来实现:
因此,我的问题是:如何在基于Python的3D绘图中实现这种Phong风格的闪亮阴影?
我想做一些3D绘图来可视化一些数据.我正在使用matplotlib但是matplotlib的3D功能没有2D绘图那么强大.我发现Mayavi非常强大.甚至matplotlib也在http://matplotlib.org/mpl_toolkits/mplot3d/faq.html中推荐它
但是,我之前的大多数工作都是在Python 3中完成的,但MayaVi还不支持Python 3.
我怎么能在Python 3中绘制3D图形?
我正在使用mayavi的triangular_mesh
方法绘制3D网格.该数据描述了在3D空间中面朝下放置的人体轮廓(因此cmap
可以用来表示与相机的距离).
这是用于生成绘图的代码(面和顶点来自外部对象,这里有太多不能显示):
from mayavi import mlab
import math
import numpy as np
import sys
import os
fig = mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1), size=(1920, 980))
a = np.array(this_mesh.vertices - refC.conj().transpose()) # this_mesh is an object created from external data files
this_mesh.faces = this_mesh.faces.astype(int) -1 # mesh data is generated by matlab, which is 1-indexed
m = mlab.triangular_mesh(x, y, z, this_mesh.faces, opacity=0.75)
mlab.axes(extent=[-1100, 1100, -1100, 1100, -1100, 1100])
Run Code Online (Sandbox Code Playgroud)
在不移动相机的情况下,轮廓面朝下.为了正面观看模型,我正在改变相机的方位角和高度,以便从上到下查看图形.这显示了预期的轮廓.
mlab.view(azimuth=0, elevation=180)
mlab.show()
Run Code Online (Sandbox Code Playgroud)
我的下一个任务是创建一系列图像,其中摄像机围绕绘图平移,从面向右侧的轮廓开始,并朝向左侧完成.
复杂的是,为了获得深度信息的色彩图,我已经移动了视图的方位角和高度(如上面的代码所示).Mayavi有更多选择移动相机而不是matplotlib,但它似乎没有办法围绕Y轴旋转,所以我猜我需要对方位角和高程执行一些复杂的计算来实现同样的结果 - 但我不知道从哪里开始(我刚开始在3D空间工作,而我的脑子还没想到那样). …
我想使用Mayavi以与本页第三个图形完全相同的方式绘制三维等高线图(氢电子云模型):
http://www.sethanil.com/python-for-reseach/5
我有一组数据点,我使用自己的模型创建,我想使用它.数据点存储在一个多维的numpy数组中,如下所示:
XYZV = [[1, 2, 3, 4],
[6, 7, 8, 9],
...
[4, 5, 6, 7]]
Run Code Online (Sandbox Code Playgroud)
数据点不是在XYZ空间中均匀分布,也不是以任何特定顺序存储.我认为这个例子使用了一个meshgrid来生成数据点 - 我已经看了这个但完全不理解它.任何帮助将非常感激?
H http://www.sethanil.com/_/rsrc/1267943775903/python-for-reseach/5/Article5-fig3.png
我无法在Spyder IDE中运行/使用Mayavi库.我已经描述了下面的问题.任何帮助都将非常有用.(非常感谢你提前.)
重现问题的步骤:
from numpy import sin, cos, mgrid
import mayavi.mlab as mmlab
def f(x,y):
return sin(x + y) + sin(2*x - y) + cos(3*x + 4*y)
x,y = mgrid[-7.:7.05:0.01, -5.:5.05:0.05]
z = f(x,y)
s = mmlab.contour_surf(x,y,z)
mmlab.show()
Run Code Online (Sandbox Code Playgroud)
预期输出和错误:
预期输出:带有数字的Mayavi数字窗口.我所看到的是:在控制台窗口中出现以下值错误(我包括完整的消息序列以便显式):
--------------------------错误信息的开头------------------
Traceback (most recent call last):
File "C:\PROGRAMSANDEXPERIMENTS\PYTHON\MayaviScripts\Learning\testMayavi.py", line 2, in <module>
import mayavi.mlab as mmlab
File "C:\Python27\lib\site-packages\mayavi\mlab.py", line 27, in <module>
from mayavi.tools.camera import view, roll, yaw, pitch, move
File "C:\Python27\lib\site-packages\mayavi\tools\camera.py", line 25, …
Run Code Online (Sandbox Code Playgroud) 操作系统: Linux Kubuntu 14.4.5
Python: Python 3.5.2 :: Continuum Analytics,Inc.
我试图将Mayavi安装到我的anaconda环境中:
conda install -c menpo mayavi=4.5.0
conda install -c anaconda wxpython=3.0.0.0
conda install pyqt
conda install qt
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从http://docs.enthought.com/mayavi/mayavi/auto/example_surface_from_irregular_data.html运行示例时,我收到错误消息
ImportError: Could not import backend for traits
Run Code Online (Sandbox Code Playgroud)
与解释:
确保安装了TraitsBackendWx或TraitsBackendQt项目.如果您使用easy_install安装了Mayavi,请尝试easy_install.easy_install Mayavi [app]也可以使用.
如果您执行了源检出,请确保在Traits,TraitsGUI和您选择的Traits后端运行'python setup.py install'.
还要确保安装了wxPython或PyQT.wxPython:http: //www.wxpython.org/ PyQT:http: //www.riverbankcomputing.co.uk/software/pyqt/intro
我在网上搜索并试图找到任何设置,但找不到任何东西.
从http://docs.enthought.com/mayavi/mayavi/installation.html?highlight=installation我得到了我可以通过pip安装它pip install mayavi
,但这只导致"要求已经满足"的消息,其中包括
要求已经满足:/anaconda2/envs/myenv/lib/python3.5/site-packages(来自mayavi)的特征
该怎么办?