- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
目前使用 python 和 matplotlib 生成二维流图非常容易,因为 streamplot最近由 Tom Flannaghan 和 Tony Yu 合并到 matplotlib。
虽然可以使用 matplotlib 生成某些类型的 3D 图,但目前不支持 3D 流图。然而,python 绘图程序 mayavi(它为基于 vtk 的绘图提供了 python 接口(interface))能够使用其 flow() 进行 3D 流图绘制。功能。
我创建了一个简单的 python 模块来绘制 2D 和 3D 数据流图,在 3D 数据集中没有 Z 斜率(所有 dZ = 0),以演示我在使用 mayavi 与 matplotlib 时面临的绘图挑战在 xy 平面上有效地匹配数据。注释代码和结果图如下所示:
import numpy, matplotlib, mayavi, matplotlib.pyplot, mayavi.mlab
#for now, let's produce artificial streamline data sets for 2D & 3D cases where x and y change by +1 at each point, while Z changes by 0 at each point:
#2D data first:
x = numpy.ones((10,10))
y = numpy.ones((10,10))
#and a corresponding meshgrid:
Y,X = numpy.mgrid[-10:10:10j,-10:10:10j]
#now 3D data with Z = 0 (i.e., I want to be able to produce a matching streamplot plane in mayavi, which is normally used for 3D):
xx = numpy.ones((10,10,10))
yy = numpy.ones((10,10,10))
zz = numpy.zeros((10,10,10))
#and a corresponding meshgrid:
ZZ,YY,XX = numpy.mgrid[-10:10:10j,-10:10:10j,-10:10:10j]
#plot the 2D streamplot data with matplotlib:
fig = matplotlib.pyplot.figure()
ax = fig.add_subplot(111,aspect='equal')
speed = numpy.sqrt(x*x + y*y)
ax.streamplot(X, Y, x, y, color=x, linewidth=2, cmap=matplotlib.pyplot.cm.autumn,arrowsize=3)
fig.savefig('test_streamplot_2D.png',dpi=300)
#there's no streamplot 3D available in matplotlib, so try to see how mayavi behaves with a similar 3D data set:
fig = mayavi.mlab.figure(bgcolor=(1.0,1.0,1.0),size=(800,800),fgcolor=(0, 0, 0))
st = mayavi.mlab.flow(XX,YY,ZZ,xx,yy,zz,line_width=4,seedtype='sphere',integration_direction='forward') #sphere is the default seed type
mayavi.mlab.axes(extent = [-10.0,10.0,-10.0,10.0,-1.0,1.0]) #set plot bounds
fig.scene.z_plus_view() #adjust the view for a perspective along z (xy plane flat)
mayavi.mlab.savefig('test_streamplot_3D_attempt_1.png')
#now start to modify the mayavi code to see if I can 'seed in' more streamlines (default only produces a single short streamline, albeit of the correct slope)
#attempt 2 uses a line seed / widget over the specified bounds (points 1 and 2):
fig = mayavi.mlab.figure(bgcolor=(1.0,1.0,1.0),size=(800,800),fgcolor=(0, 0, 0))
st = mayavi.mlab.flow(XX,YY,ZZ,xx,yy,zz,line_width=4,seedtype='line',integration_direction='forward') #line instead of sphere
st.seed.widget.point1 = [0,-10,0]
st.seed.widget.point2 = [0,10,0] #so seed line should go up along y axis
st.seed.widget.resolution = 25 #seems to be the number of seeds points along the seed line
mayavi.mlab.axes(extent = [-10.0,10.0,-10.0,10.0,-1.0,1.0]) #set plot bounds
fig.scene.z_plus_view() #adjust the view for a perspective along z (xy plane flat)
mayavi.mlab.savefig('test_streamplot_3D_attempt_2.png')
#attempt 3 will try to seed a diagonal line across the plot to produce streamlines that cover the full plot:
#would need to use 'both' for integration_direction if I could get the diagonal seed line to work
fig = mayavi.mlab.figure(bgcolor=(1.0,1.0,1.0),size=(800,800),fgcolor=(0, 0, 0))
st = mayavi.mlab.flow(XX,YY,ZZ,xx,yy,zz,line_width=4,seedtype='line',integration_direction='forward')
st.seed.widget.point1 = [-10,10,0] #start seed line at top left corner of plot
st.seed.widget.point2 = [10,-10,0] #end seed line at bottom right corner of plot
#this fails to produce a diagonal seed line though
st.seed.widget.resolution = 25 #seems to be the number of seeds points along the seed line
mayavi.mlab.axes(extent = [-10.0,10.0,-10.0,10.0,-1.0,1.0]) #set plot bounds
fig.scene.z_plus_view() #adjust the view for a perspective along z (xy plane flat)
mayavi.mlab.savefig('test_streamplot_3D_attempt_3.png')
2D matplotlib 结果(请注意斜率 1 的流线与 dx 和 dy 数组完全匹配,它们都填充了单位值): 3D mayavi 结果(尝试 1;请注意,此处显示的单个流线的斜率是正确的,但流线的长度和数量与 2D matplotlib 示例明显不同): 3D mayavi 结果(尝试 2;请注意,我使用具有足够高分辨率的线种子已经产生了更多适当斜率的流线,但也请注意在代码与剧情不符) 最后,尽管指定了不同的种子/小部件点,但尝试 #3(令人困惑)产生与 #2 完全相同的图。 因此,问题是:我怎样才能更好地控制种子线的位置,使其成为对角线?更广泛地说,我希望能够为更一般的流图 3D(非平面)问题提供任意数组的种子点,但是用线解决前一个特定情况应该让我开始。
我在解决这个问题时发现的其他一些有用的资源,但并没有完全解决我的问题:
最佳答案
问题似乎是流线型种子小部件的 clamp_to_bounds 属性的默认值设置为 True。您必须将其设置为 False 才能实际移动小部件。
st.seed.widget.clamp_to_bounds = False
将此添加到代码中后,最终结果如下所示:
您可能以前就熟悉这种探索 Mayavi 的方法,但可能会解释得太多,我还是提一下:
我找到这个选项的方法,以及我通常如何在 Mayavi 中找到这些晦涩的属性,是通过启动启用 pylab 的 IPython 脚本。在 Ubuntu 上,终端命令如下所示:
ipython --pylab=qt
启动 IPython 后,我使用 %run 魔术命令运行脚本:
%run streamlines.py
绘图完成后,我现在可以访问 Mayavi 窗口,并且可以通过单击 Mayavi 图标查看 Mayavi 管道的内部结构:
在管道中,您会找到 Streamline 对象,如果单击它然后选择 Seed,您会找到“Clamp to bounds”复选框。 (抱歉屏幕截图中的颜色混合不当 - Mayavi 出于某种原因最近开始使用深色主题......)
要查看这实际上做了什么,您可以点击记录按钮 打开一个窗口,显示与更改设置等效的代码:
您会看到 clamp_to_bounds 属性,并且能够将它添加到您的脚本中。
祝流线顺利!
关于python - 使用 python 和 mayavi 创建 3D 流图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19720164/
我想在同一个图中绘制多个曲面,并使轴延伸到所有曲面上。 import numpy as np # Create data with x and y random in the [-2, 2] segm
在 Mayavi 中,我想在下图中看到轴的网格 # Source: >. import numpy as np from mayavi import mlab # Test data: Matlab
有没有办法自定义mayavi场景的默认工具栏?我想删除一些按钮,因为我不需要它们(例如保存按钮)。在这里您可以看到我正在谈论哪个工具栏: 该代码只是示例代码: import os os.environ
我一直在 python 3.5 和 Windows 10 计算机上使用 Mayavi。今天,我正在使用 mayavi 编写一些脚本,并且无缘无故(据我所知)mayavi 可视化窗口停止显示。事实上,任
MATLAB 有一个hold 函数(如果我没记错的话,已经有一段时间了)可以在同一个“图形”/窗口上绘制多个内容。反正有没有在 Mayavi 做这个?我想可视化计算的几个实现,并将它们全部放在同一个图
我想根据采用离散值的另一个值(ID)更改表面的颜色(因此我需要一个离散的颜色条)。在下面的简化示例中,我绘制了一个具有 3 个不同 ID 的球体: 0/左边红色 2/蓝色在中间 1/左边绿色 但是使用
我在 python 脚本中使用 Mayavi。一切正常,除了我无法更改颜色条的大小和位置。 我生成的颜色条是这样的: colorbar = mlab.colorbar(title='Frequ
假设我有一个像这样的 4d numpy 数组:my_array[x,y,z,t]。 有没有一种简单的方法可以将整个数组加载到 Mayavi 中,然后只需选择我要调查的 t? 我知道可以为数据设置动画,
我正在寻找一种方法来保持颜色条(和场景中的颜色)不变,而不管我显示的数据如何(例如,假设我想要颜色从 0 到 10,使用当前设置 mayavi 会根据数据调整颜色,所以第一个图将从 0 到 1,第二个
如何用 Mayavi 绘制隐式方程 F(x,y,z)=0?我试过 import scipy as np x, y, z = np.mgrid[-3:3:100j, -3:3:100j, -3:3:10
我刚刚在我的计算机上重新安装了 Fedora 28,并决定在 Python 3 中试用 Mayavi,它以前只能在 Python 2 中运行。我从 pip 安装了 Mayavi。与 pip3 inst
我正在使用 mayavi.mlab 生成网格图并希望背景不透明度为 0(或透明)。这可能吗? 最佳答案 如果您的目标是将 mayavi 图形集成到 matplotlib 图形中,这是可能的。您可以使用
我正在使用 mayavi 的 triangular_mesh 方法绘制 3D 网格。数据描述了 3D 空间中面朝下的人体轮廓(因此 cmap 可用于表示与相机的距离)。 这是用于生成绘图的代码(面和顶
我想渲染大约 500 张图像并将它们保存到不同的 png 文件中,因此我编写了一个包含我的数据集和渲染函数的小类 from mayavi import mlab mlab.options.offscr
我正在尝试使用 mayavi 脚本导出图像 from mayavi import mlab # data to be exported in image mlab.savefig('output.pn
据我所知 Mayavi 没有提供任何感知上统一的色彩图。我天真地试图通过它one of Matplotlib's colormaps但失败了: from mayavi import mlab impo
据我所知 Mayavi 没有提供任何感知上统一的色彩图。我天真地试图通过它one of Matplotlib's colormaps但失败了: from mayavi import mlab impo
我正在使用 mayavi 并使用 scalar 绘制我的三角形网格mlab.triangular_mesh 中的属性 model_plot = mlab.triangular_mesh(self.mo
我似乎无法让图例出现在 Mayavi 图中。我创建了一个简单的 3D 图,但我需要为该图提供图例。 Matplotlib 支持添加方式: import matplotlib.pyplot as plt
我一直在尝试运行以下Python代码(来自Enthought的网站)来测试Enthought的Mayavi模块的动画功能。 from mayavi import mlab import numpy n
我是一名优秀的程序员,十分优秀!