我正在使用matplotlib在同一个图上绘制多个曲面,我想只看到最顶层的曲面,就像matlab所示.
Matlab 3D视图:

Matlab顶视图:

Matplotlib 3D视图:

Matplotlib顶视图:

我怎样才能让Matplotlib显示类似于Matlab的结果,其中最顶层的类显示在顶部,而不是一个类优先于另一个?
如何将3D散点图与3D曲面图结合起来,同时保持曲面图透明,这样我仍然可以看到所有点?
我想通过球体表面上的色彩映射使用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) 我希望能够看到 3D 表面上的线(和点)位于表面顶部(第二张图像),而不是后面(第一张图像)。这是我的 3D 函数:
def f(x, y):
return np.sin(2*x) * np.cos(2*y)
Run Code Online (Sandbox Code Playgroud)
3D 表面的 X、Y、Z:
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
Run Code Online (Sandbox Code Playgroud)
我生成了 x 点 (xx) 和 y 点 (yy) 的向量,其中 zz = f(xx,yy)
fig = plt.figure(figsize=(8,6))
ax = plt.axes(projection='3d')
ax.scatter(xx, yy, zz, c='r', marker='o')
#ax.plot(xx,yy,zz, c= 'r')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='viridis', edgecolor='none')
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,点在图后面,图形覆盖了点。我想看看情节上的要点。我应该怎么办?
我希望能够看到像这样的点和线:
编辑:这是我生成点的方式:
for i in range(1,2000):
[a, b] = np.random.rand(2,1)*np.sign(np.random.randn(2,1))*2
xx = …Run Code Online (Sandbox Code Playgroud) 我知道 matplotlib 3D 对于以正确的顺序绘制多个 3D 对象(平面、线、点)是不可靠的:请参阅Matplotlib 3D plot zorder 问题和如何绘制相交平面?. 然而这些问题似乎很老,所以提出了解决方案。因此,我想知道是否有针对以下特定简单场景的一些新开发、工具、变通方法或硬编码解决方案:
import mpl_toolkits.mplot3d as a3
import matplotlib.pylab as plt
import numpy as np
fig = plt.figure()
ax = a3.Axes3D(fig)
# create an orizontal plane
corners = [[0,0,0],[0,5,0],[5,5,0],[5,0,0]]
tri = a3.art3d.Poly3DCollection([corners], alpha=1)
tri.set_color('w')
tri.set_edgecolor('k')
ax.add_collection3d(tri)
# plot a vector
ax.plot([2,2],[2,2],[0,4], c = 'r')
# plot some points
ax.scatter([1,3],[1,3],[1,3], c = 'r')
ax.set_xlim([0, 5.0])
ax.set_ylim([0, 5.0])
ax.set_zlim([0, 2.5]);
plt.show()
Run Code Online (Sandbox Code Playgroud)
在此图像中,您可以看到可视化问题:向量不是从平面开始,因为它的初始点是 (2,2,0)
我试图从一组指定z值的数据中绘制3D表面.虽然我设置了alpha = 1.0,但我得到了一些奇怪的透明效果,我可以在表面看到.
在绘图时和保存到文件时(包括png和pdf)都会出现人工制品:

我试过改变线宽,并将步幅数从1改为10(在后一种情况下,由于分辨率太粗糙,表面不可见).
问:我怎样才能摆脱这种透明度?
这是我的代码:
import sys
import numpy as np
import numpy.ma as ma
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
y_label = r'x'
x_label = r'y'
z_label = r'z'
x_scale = 2.0*np.pi
y_scale = 2.0*np.pi
y_numPoints = 250
x_numPoints = 250
def quasiCrystal(x, y):
z = 0
for i in range(0,5):
z += np.sin(x * np.cos(float(i)*np.pi/5.0) +
y * np.sin(float(i)*np.pi/5.0))
return z
x = np.linspace(-x_scale, x_scale, x_numPoints)
y = np.linspace(-y_scale, y_scale, …Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制具有 3 个平面的线性系统的解,解是点 (1,1,1) 我已经使用 point 命令绘制了该点,但我怀疑该点不在正确的位置:
\n\nax.plot([1.], [1.], [1.], markerfacecolor=\'k\', markeredgecolor=\'k\', marker=\'o\', markersize=5, alpha=0.6)\nRun Code Online (Sandbox Code Playgroud)\n\n谢谢\n好的,代码是:
\n\n#/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.mplot3d import Axes3D\nfrom sympy.solvers import *\nfrom sympy import *\nfrom matplotlib import rcParams\n\n\n# Activating LateX\nrcParams[\'text.latex.unicode\'] = True\nrcParams[\'text.usetex\'] = True\nrcParams[\'text.latex.preamble\'] = \'\\\\usepackage{amsthm}\', \'\\\\usepackage{amsmath}\', \'\\\\usepackage{amssymb}\',\n\'\\\\usepackage{amsfonts}\', \'\\\\usepackage[T1]{fontenc}\', \'\\\\usepackage[utf8]{inputenc}\'\n\n\n# Declaring the three planes as functions\nf1 = lambda x, y: x + y -1\nf2 = lambda x, y: 1 - x + y\nf3 = lambda …Run Code Online (Sandbox Code Playgroud) 我一直在寻找答案,但是我似乎看不出为什么在我的代码中我无法使投影轮廓显示在表面“背后”。
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.array([[200,800,1500,2000,3000],[200,700,1500,2000,3000],[200,800,1500,2000,3000],[200,800,1500,2000,3000]])
Y = np.array([[50,50,50,50,50],[350,350,350,350,350],[500,500,500,500,500],[1000,1000,1000,1000,1000]])
Z = np.array([[0,0,33,64,71],[44,62,69,74,76],[59,67,72,75,77],[63,68,73,76,77]])
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5)
cset = ax.contourf(X, Y, Z, zdir='z', offset=0, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='x', offset=200, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='y', offset=1000, cmap=cm.coolwarm)
ax.set_xlabel('X')
ax.set_xlim(200, 3000)
ax.set_ylabel('Y')
ax.set_ylim(0, 1000)
ax.set_zlabel('Z')
ax.set_zlim(0, 100)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我一直使用此页面中的“填充轮廓图”之一作为模板:http : //matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#scatter-plots …
我有一个带有三个方程的线性系统:
x 1 - 2x 2 + x 3 = 0
2x 2 - 8x 3 = 8
-4x 1 + 5x 2 + 9x 3 = -9
解集是(29,16,3),它是这些平面交叉处的点.
希望是否有人可以使用Matplotlib在3D空间中绘制这些平面,以清楚地显示问题.
我想绘制两个平面并找到它们的交叉线,但是我得到了这个结果,因为一个平面覆盖了另一个平面,所以无法分辨它们相交的位置.
3D投影应隐藏平面的不可见部分,如何使用matplotlib获得此结果?

你可以清楚地看到这些平原应该相交.

这是我用来获得这个结果的代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
values = range(-10, 11)
def plotPlane(plot, normal, d, values, colorName):
# x, y, z
x, y = np.meshgrid(values, values)
z = (-normal[0] * x - normal[1] * y - d) * 1. / normal[2]
# draw plot
plot.plot_surface(x, y, z, color=colorName)
image = plt.figure().gca(projection='3d')
plotPlane(image, [3, 2, -4], 1, values, "red")
plotPlane(image, [5, -1, 2], 4, values, "gray")
plt.show()
Run Code Online (Sandbox Code Playgroud)