天道酬勤,学无止境

Julia PyPlot:绘制 3D 表面,将表面颜色作为表面梯度的范数(Julia PyPlot: plot 3D surface with as face colors the norm of surface gradient)

问题

有谁知道如何使用 Julia 的 Pyplot 绘制 3D 表面,例如将表面梯度的范数作为面部颜色?

类似于 Python 的这个主题:Color matplotlib plot_surface command with surface gradient

回答1

我看到了这个,我只需要让它工作。 使用 PyPlot 后端,它几乎被 Plots.jl 支持开箱即用。 我只需要换一个自定义 matplotlib 着色器来应用不同的 z 矩阵。

您会注意到我正在访问 numpy 的梯度函数(通过PyCall导入),并且我正在包装梯度矩阵G以便它不会被分成列。 总而言之......比python示例简单得多!

    using Plots; pyplot();
    x = y = LinRange(-5.0, 5.0, 30)
    z = sin(sqrt(Float64[xi^2+yi^2 for xi = x, yi = y]))
    surface(x, y, z, alpha = 0.7)

    using PyCall
    Gx, Gy = Plots.pynb.pymember(:gradient)(z)
    surface(x, y, z, alpha = 0.8, zcolor = wrap(G))

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在matplotlib中显示最大表面?(Display the maximum surface in matplotlib?)
    问题 我正在使用matplotlib在同一图形上绘制多个曲面,并且我只想看到最顶部的曲面,如matlab所示。 Matlab 3D视图: Matlab顶视图: Matplotlib 3D视图: Matplotlib顶视图: 我如何让Matplotlib显示类似于Matlab的结果,在该结果中,最顶层的类显示在顶部,而不是一个类优先于另一个类? 回答1 我很想考虑一些肮脏的骇客,例如在答案中提到了mgab,但后来决定走一条简单得多的路线: 您完全可以通过使用透明度来获得类似的效果,只需确保透明度足够低,否则仍然会发生明显的重叠情况: from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np from scipy.special import erf fig = plt.figure() ax = fig.gca(projection='3d') X = np.arange(0, 6, 0.25) Y = np.arange(0, 6, 0.25) X, Y = np.meshgrid
  • 如何使用Python在3D图形表面上绘制图像文件? -不绘制为平面(How to plot an image file on a 3D graph surface using Python? - not plotting as a flat plane)
    问题 有没有一种方法可以使用Python在3D图形表面上绘制图像文件? 我已经看到了几种将其绘制为平面的方法,但是我希望图像覆盖在图的表面上。 这可能吗? 回答1 您需要将表面的颜色更改为图像的颜色,如本示例中@sarwar建议的那样。 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.cbook import get_sample_data from matplotlib._png import read_png import numpy as np fn = get_sample_data("lena.png", asfileobj=False) img = read_png(fn) x, y = np.mgrid[0:img.shape[0], 0:img.shape[1]] ax = plt.gca(projection='3d') ax.plot_surface(x, y, np.sin(0.02*x)*np.sin(0.02*y), rstride=2, cstride=2, facecolors=img) plt.show() 结果就是 回答2 看一下这个问题的答案。 他们使用固定的z,但是您可以将其替换为地形数据以获得所需的效果。
  • cloudcompare软件使用总结
    cloudcompare软件使用总结 File Open:打开Save:保存Global Shift settings:全局移位设置,默认即可Primitive factory:用于创建对象:plane平面;Box框;Sphere球体;Cylinder圆柱体;Cone圆锥体;Torus圆环;Dish盘3D mouse > Enable:启用/禁用3D鼠标Gamepad > Enable:游戏手柄控制摄像机Close all:关闭 Edit Clone:克隆所选实体,包括所有数据Merge :合并;合并点云/网格/实体Subsample: random-根据点云点数随机采样;spatial-根据空间最小距离采样;octree-根据细分级别进行下采样 Apply transformation:用户可以选择多个选项来设置要应用的转换 Transformation matrix–转换矩阵 Rotation axis and angle +translation --旋转轴,旋转角度和平移矢量的组合Euler angles + translation–欧拉角和平移矢量的组合 Multiply/Scale:缩放,通过设定比例因子实现缩放;Translate/Rotate :旋转/平移,单击左键旋转,单击右键平移;Segment:分割。可采用矩形/多边形分割实体。Crop:裁剪
  • 计算 3D 网格表面上两点之间最短路径的算法(Algorithm to calculate the shortest path between two points on the surface of a 3D mesh)
    问题 我正在寻找一种算法来计算以下内容: 我有: 一个 3D 三角形网格。 三角形不一定位于一个平面内。 两个相邻三角形的范数向量之间的角度小于 90 度。 两点。 这两个点位于三角形网格的边缘或网格的三角形内。 我需要计算表示网格上两点之间最短路径的折线。 做到这一点最简单和/或最有效的策略是什么? 回答1 就目前而言,您的问题没有明确定义; 根据用于将线段“投影”到网格上的方向,可以有许多解决方案。 选择投影方向后,将网格展平到垂直于投影方向的平面上。 此时,您的网格是二维边(线段)的集合; 只需确定每条边与目标线段的交点(如果有)。 编辑: 更新后的问题现已明确定义。 由于我对原始问题(以上)的回答已被标记为已接受,大概这意味着下面评论中给出的信息实际上是更新问题真正“接受”的信息。 我总结一下: 谷歌搜索“3d 网格上的最短距离”会找到一些相关信息,例如三角形网格上的最短路径近似另请参阅:https://stackoverflow.com/a/10389377/294949 -- danh
  • Python 创建三维图表
    Matplotlib 最开始被设计为仅支持二维的图表。到 1.0 版本发布左右,一些三维图表的工具在二维展示的基础上被创建了出来,结果就是 Matplotlib 提供了一个方便的(同时也是有限的)的可用于三维数据可视化的一套工具。三维图表可以使用载入mplot3d工具包来激活,这个包会随着 Matplotlib 自动安装: from mpl_toolkits import mplot3d 一旦模块被导入,三维 axes 就可以像其他普通 axes 一样通过关键字参数projection='3d’来创建: %matplotlib inline import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax = plt.axes(projection='3d') 三维 axes 激活后,我们可以在上面绘制不同的三维图表类型。三维图表在 notebook 中使用交互式图表展示会优于使用静态展示;回忆我们前面介绍过,你可以使用%matplotlib notebook而不是%matplotlib inline来激活交互式展示模式。 三维的点和线 三维图表中最基础的是使用(x, y, z)坐标定义的一根线或散点的集合。前面介绍过普通的二维图表,作为类比,使用ax.plot3D和ax
  • Python:有没有办法用 Matplotlib 绘制“部分”曲面图?(Python: Is there a way to plot a “partial” surface plot with Matplotlib?)
    问题 我想用 Matplotlib 绘制一个“部分”曲面图,如下所示 请注意,它不是 XY 平面上的完整网格,而是从顶视图中缺少一个角。 以下是我试过但没有用的代码。 import numpy as np from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D X = np.array([[0,1], [0,1,2], [0,1,2,3], ]) Y = np.array([[0,0], [1,1,1], [2,2,2,2], ]) Z = np.array([[0.5, 0.6], [0.7, 0.8, 0.9], [1.0, 1.1, 1.2, 1.3], ]) fig = pyplot.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X,Y,Z) 错误是: ValueError:使用序列设置数组元素。 任何指针将不胜感激! 谢谢! 回答1 您可以通过在不想绘制的区域中使用 Z 的np.nan值轻松完成此操作。 这是此示例的修改版本,但进行了剪切,如下所示: from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from
  • matplotlib-高度矩形阵列中的3d表面(matplotlib - 3d surface from a rectangular array of heights)
    问题 我正在尝试在matplotlib中绘制一些HDF数据。 使用h5py导入它们后,数据以数组形式存储,如下所示: array([[151, 176, 178], [121, 137, 130], [120, 125, 126]) 在这种情况下,x和y值只是数组字段的索引,而z值是特定字段的值。 在(x,y,z)形式中,它看起来像: (1,1,151) (2,1,176) (3,1,178) (1,2,121) ... 等等。 有没有一种简便的方法可以根据此类数据绘制表面图? 我知道我可以通过遍历整个数组将其更改为(x,y,z)元组,但是也许不需要它吗? 回答1 如果需要3-d表面图,则必须首先创建网meshgrid 。 你可以试试: from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np X = np.arange(1, 10) Y = np.arange(1, 10) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) fig = plt.figure() ax = fig.gca(projection='3d') surf = ax.plot_surface(X, Y, Z
  • Matplotlib-在同一轴上绘制两个3D曲面时重叠错误(Matplotlib - Wrong overlapping when plotting two 3D surfaces on the same axes)
    问题 我正在尝试使用plot_surface命令在matplotlib中的相同轴上绘制两个3D曲面。 fig = plt.figure() fig.figsize = fig_size ax = fig.gca(projection='3d') surf = ax.plot_surface(X, Y, Exp_Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.winter, linewidth=0.5, antialiased=True) surf = ax.plot_surface(X, Y, Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.autumn,linewidth=0.5, antialiased=True) 我的问题是,在查看绘图时,并非总是正确的表面位于“顶部”,例如在绘图中: 在后角(200N,在轴上为2.5Hz)中,实际上黄红色离观看者更近时,蓝绿色表面“在顶部”。 如果我旋转图: 那么现在看起来一切正常,蓝绿色的表面位于200N和2.5Hz的黄红色表面之下(现在在左侧)。 我曾尝试搜索stackoverflow和Google,但找不到任何类似的解决方案问题。 我在Linux上使用Python 2.7.3,Numpy 1.6.1和Matplotlib 1.1
  • 仅使用 matplotlib 绘制 3d 图形的一部分(Only plot part of a 3d figure using matplotlib)
    问题 我在使用 python 的 matplotlib 绘制 3d 图形时遇到了问题。 使用以下python函数,我得到了这个图: 这里X , Y是网格网格, Z和Z_是X和Y函数。 C代表表面颜色。 import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import matplotlib.pyplot as plt def plot(X, Y, Z, Z_, C): fig = plt.figure() ax = fig.gca(projection='3d') surf = ax.plot_surface( X, Y, Z, rstride=1, cstride=1, facecolors=cm.jet(C), linewidth=0, antialiased=False, shade=False) surf_ = ax.plot_surface( X, Y, Z_, rstride=1, cstride=1, facecolors=cm.jet(C), linewidth=0, antialiased=False, shade=False) ax.view_init(elev=7,azim=45) plt.show() 但现在我想水平切割这个数字,只剩下 z 在
  • 插值其角节点已知的3D曲面并使用色图对其进行着色(Interpolating a 3D surface known by its corner nodes and coloring it with a colormap)
    问题 我想构建实验数据的3D表示形式以跟踪膜的变形。 实验上,只有角节点是已知的。 但是,我想绘制整个结构的变形,这就是为什么我要对膜进行插值以使其具有良好的颜色图的原因。 通过搜索,我几乎用以下代码接近它: import numpy from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.mplot3d.art3d import Poly3DCollection import matplotlib.pyplot as plt from matplotlib import cm from scipy.interpolate import griddata x=numpy.array([0, 0, 1, 1]) y=numpy.array([0.5, 0.75, 1, 0.5]) z=numpy.array([0, 0.5, 1,0]) fig = plt.figure() ax = Axes3D(fig) verts = [zip(x, y, z)] PC = Poly3DCollection(verts) ax.add_collection3d(PC) xi = numpy.linspace(x.min(),x.max(),20) yi = numpy.linspace(y.min(),y.max(),20) zi =
  • 使用matplotlib中的一组标量值为球体表面着色(Colouring the surface of a sphere with a set of scalar values in matplotlib)
    问题 我对matplotlib相当陌生(这也是我在这里的第一个问题)。 我试图代表由EEG记录的头皮表面电位。 到目前为止,我有一个球形投影的二维图形,该图形是使用contourf生成的,几乎可以归结为一个普通的热图。 有什么方法可以在半球上完成吗,即生成具有由值列表给出的表面颜色的3D球? 像这样的东西,http://embal.gforge.inria.fr/img/inverse.jpg,但是我只用一个半球就足够了。 我已经看到了一些相关的问题(例如,Matplotlib 3d彩色图-可能吗?),但是它们要么没有真正解决我的问题,要么至今仍未得到解答。 我也花了整个上午的时间浏览无数的示例。 在我发现的大多数内容中,表面某个特定点的颜色指示其Z值,但我不希望...我想绘制表面,然后使用数据I指定颜色有。 回答1 您可以使用plot_trisurf并通过set_array方法将自定义字段分配给基础ScalarMappable。 import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import matplotlib.tri as mtri (n, m) = (250, 250) # Meshing a unit sphere according to
  • 使用 matplotlib 从“列表列表”绘制 3d 曲面(Plot a 3d surface from a 'list of lists' using matplotlib)
    问题 我已经搜索了一些,虽然我可以找到许多有用的网格网格示例,但没有一个清楚地显示如何将我的列表列表中的数据转换为我所看到的各种不同方式的可接受形式。 当谈到 numpy/matplotlib 以及我所看到的术语和步骤序列时,我有点迷茫。 我发现的最接近的是 Plotting a 3d surface from a list of tuples in matplotlib 我有一个高度数据列表。 data=[[h1,h2,h3,h...], [h,h,h,h], [h,h,h,h], [h,h,h,h16]] data[0][1]==h2 data[4][4]==h16 如何使用 matplotlib/numpy 等生成这些值的简单 3d 曲面图? 就像颜色值作为 z 值的颜色图一样。 我可以很好地使用 imshow() ,因为它直接获取列表列表。 我只是不确定我需要如何将我所拥有的东西分割成 plot_surface 可能同意的东西。 回答1 如果你想要一个 3d 表面,你必须生成 x 和 y 坐标。 如果您不在乎它们是什么而只想要表面,请生成给定长度的整数网格: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D data = np.array
  • 基于通过散点的类别的彩色 3D 表面(Color 3D Surface Based on Categories that passes through scatter points)
    问题 我有以下格式的数据: X,Y,Z,类别 我使用 plotly 生成散点图,然后使用以下代码通过散点拟合曲线。 from scipy.interpolate import griddata import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D x=np.asarray([3,5,9,3,3,7,6,9,1,9]); y=np.asarray([4,3,3,10,8,2,4,10,9,3]); z=np.asarray([1,2,4,10,1,7,10,3,1,7]); # x = np.random.random(100) xi=np.linspace(min(x), max(x),50) #print xi yi=np.linspace(min(y),max(y),50) X,Y= np.meshgrid(xi,yi) Z = np.nan_to_num(griddata((x,y), z, (X, Y), method='cubic')) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z
  • GNUPLOT:在球体表面上绘制(GNUPLOT: Plotting on the surface of a sphere)
    问题 我有一个依赖于phi和theta的函数,我想在球体的表面上进行绘制。 日期存储在.txt文件中,其列如下: 1: x = R*sin(theta)*cos(phi) 2: y = R*sin(theta)*sin(phi) 3: z = R*cos(theta) 4: density 我使用以下gnuplot代码进行绘制: set terminal wxt size 800,800 set mapping cartesian set view equal xyz set xlabel 'x' set ylabel 'y' set zlabel 'z' splot "densityprofile_100.000.txt" u 1:2:3:4 with pm3d pause -1 不幸的是,Gnuplot似乎无法正确表示球体上的颜色。 似乎有些阴影,我无法摆脱; 看到图片在这里: 当我用鼠标转动球体时,阴影变得越来越大,但是没有任何位置可以完全消失。 任何帮助表示赞赏。 回答1 通过添加以下行,我找到了解决问题的方法: set pm3d depthorder 回答2 推测一下,深度排序可能会引起一些麻烦。 您是否尝试过pm3d“ hidden3d”选项? 从pm3d上的gnuplot帮助中: 选项hidden3d接受必须由设置样式行....创建的线型作为参数。
  • matplotlib中的曲面图(surface plots in matplotlib)
    问题 我有一个3元组的列表,表示3D空间中的一组点。 我想绘制一个覆盖所有这些点的表面。 mplot3d软件包中的plot_surface函数要求将X,Y和Z作为2d数组作为参数。 plot_surface是绘制表面的正确函数吗,如何将数据转换为所需的格式? data = [(x1,y1,z1),(x2,y2,z2),.....,(xn,yn,zn)] 回答1 对于曲面,它与三元组列表略有不同,您应该为2d数组中的域传递网格。 如果您只拥有3d点的列表,而不是某些函数f(x, y) -> z ,那么您将遇到问题,因为有多种方法可以将3d点云三角化为曲面。 这是一个光滑的表面示例: import numpy as np from mpl_toolkits.mplot3d import Axes3D # Axes3D import has side effects, it enables using projection='3d' in add_subplot import matplotlib.pyplot as plt import random def fun(x, y): return x**2 + y fig = plt.figure() ax = fig.add_subplot(111, projection='3d') x = y = np.arange(-3.0, 3
  • 在 matplotlib 中以 3d 形式绘制 imshow() 图像(Plotting a imshow() image in 3d in matplotlib)
    问题 如何在 3d 轴中绘制imshow()图像? 我正在尝试这篇文章。 在imshow()文章中,表面图看起来与imshow()图相同,但实际上并非如此。 为了演示,这里我采用了不同的数据: import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np # create a 21 x 21 vertex mesh xx, yy = np.meshgrid(np.linspace(0,1,21), np.linspace(0,1,21)) # create vertices for a rotated mesh (3D rotation matrix) X = xx Y = yy Z = 10*np.ones(X.shape) # create some dummy data (20 x 20) for the image data = np.cos(xx) * np.cos(xx) + np.sin(yy) * np.sin(yy) # create the figure fig = plt.figure() # show the reference image ax1 = fig.add_subplot(121) ax1.imshow(data, cmap
  • 【北航计算机图形学笔记】完整版
    文章目录 0. 介绍1. 概论2. 计算机图形系统3. 基本图形学程序4. 几何对象与变换5. 观察与投影6. 光照与明暗绘制7.图元裁剪8. 光栅化9~10. 隐藏面消除,纹理映射与片元处理11. 可编程流水线和GPU12. 几何建模13. 曲线曲面14. 场景图与图形程序开发 0. 介绍 计算机图形学: 使用数学算法将三维或二维图像转化为计算机显示器的栅格形式. Data–>Image [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFyShkqt-1593676402391)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1585298041484.png)] 主要研究内容: 渲染(光照模型), 建模(细分曲面, 扫描点云), 动画(物理真实感), 人机交互 1. 概论 计算机图形系统: 图像硬件系统: 图像输入输出设备, 图形计算设备. 图像软件系统: 图形应用程序, 图形支撑软件. 图像输出设备: 显示设备: CRT显示器, 平板显示器(等离子显示器, 液晶显示器) 硬拷贝设备: 打印机, 绘图仪 3D显示设备 除了,3D显示设备, 都是光栅设备, 但硬拷贝设备不能刷新. 光栅的硬件表现: 帧缓存 连续储存空间 储存屏幕上像素的颜色值 可看作所有显示设备的硬件接口
  • 如何在 Python 的 matplotlib 中将这两条 3D 线与表面连接在一起(How to join these two 3D lines together with a surface in Python's matplotlib)
    问题 我有两个轨道发生在不同的高度。 我在 3D 中绘制它们,但我希望将它们与一个表面连接在一起。 到目前为止,我有这张照片: 我使用这个脚本: import numpy as np import matplotlib import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D font = {'size' : 18} matplotlib.rc('font', **font) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') #Read in data data = np.genfromtxt('mu8.txt') x, y = np.hsplit(data, 2) N = len(x) z = np.zeros(N) z[:,] = 8.0 #Plot the first orbit ax.plot(x, y, z, 'k-', linewidth=3.0) #Read in data for second orbit data = np.genfromtxt('mu9.txt') x2, y2 = np.hsplit(data, 2) N = len(x2) z2 = np.zeros(N) z2[:,] = 9.0
  • 尝试使用 MATLAB 绘制 z = x + y 时图形不正确(Incorrect graph when trying to plot z = x + y with MATLAB)
    问题 我试图在 MATLAB 中绘制 3D 表面,并且我使用了meshgrid ,类似于 MATLAB 教程在这里所说的:http://www.mathworks.com/help/matlab/ref/meshgrid.html 我写了一个非常简单的三行脚本,我相信它会产生表面 z = x + y,如下所示: [x , y] = meshgrid( linspace( 0 , 10 , 10 ) , linspace( 0 , 10 , 10 ) ); z = x + y; surf( [ x , y , z] ); 据我了解,第 1 行生成从 0 到 10 均匀间隔的 (x,y) 坐标的所有组合。然后第 2 行只是将公式z = x + y应用于该详尽的组合列表。 然后第 3 行只绘制所有(x, y, z)点。 但是我得到了以下“东西”作为输出: 我很确定上图中的图形不是z = x + y ,而且我不知道为什么没有两个轴达到最大值 10。 尽管如此,我还是觉得脚本太简单了,看不出有什么问题。 谁能指出我忽略了什么? 谢谢你。 回答1 您生成 3D 坐标的语法是正确的。 您对surf调用不正确。 您实际需要做的是将x 、 y和z分成三个单独的参数: surf(x,y,z); 当你这样做时,你会得到这个表面。 请注意,生成的图形使用的是 MATLAB R2013a
  • 创建可旋转的 3D 地球(Creating a rotatable 3D earth)
    问题 我知道我们可以使用matplotlib创建简单的 3 维球体,文档中包含了此类球体的示例。 现在,我们还有一个warp方法作为 matplotlib 模块的一部分,它的用法示例是这里 。 将圆柱图像扭曲为球体。 是否可以结合这些方法来创建一个 3D 可旋转地球? 除非我对这个问题的思考方式很遥远,否则似乎要能够做到这一点,您必须获取图像的像素数据,然后使用正弦和余弦表达式沿着 3D 球体的表面绘制每个像素在第一个示例中创建。 可以在此处找到这些圆柱形地图的一些示例 我知道替代方法是通过maya和blender ,但我试图留在matplotlib来做到这一点,因为我想创建这个图,然后能够使用数据数组将地理空间数据绘制到表面。 回答1 有趣的问题。 我试图基本上遵循@Skeletor 概述的想法,并映射图像,以便它可以用plot_surface : import PIL import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D # load bluemarble with PIL bm = PIL.Image.open('bluemarble.jpg') # it's big, so I'll rescale it, convert to array