我试图在3D中绘制由一组不等式定义的多面体.基本上,我尝试在matplotlib中重现这个matlab plotregion库的功能.
我的方法是获取交叉点顶点,构造它们的凸包,然后获取并绘制结果面(单纯形).
问题在于许多单纯形是共面的,并且它们无缘无故地使得情节非常繁忙(参见下图中的所有这些对角线边缘).
是否有任何简单的方法来打印多面体的"外部"边缘,而不必一个接一个地整合所有共面的单纯形?
谢谢
from scipy.spatial import HalfspaceIntersection
from scipy.spatial import ConvexHull
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as a3
import matplotlib.colors as colors
w = np.array([1., 1., 1.])
# ?? h? w? q? - ?? g? w? <= 0
# q? - ub? <= 0
# -q? + lb? <= 0
halfspaces = np.array([
[1.*w[0], 1.*w[1], 1.*w[2], -10 ],
[ 1., 0., 0., -4],
[ 0., 1., 0., …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的任务应该有一个简单的解决方案,但我已经尝试了几天.我试着具体一点.
我尝试使用matplotlib的mplot3d和plot_surface绘制曲面.当我绘制数据集"z"的表面并尝试将色彩映射缩放到某个最大值时,我将"vmax"属性更改为此值.这很好用.
当我尝试绘制一个数据集(z)的表面并使用第二个数据集(fc)的面部颜色时,这也可以正常工作.
当我想缩放facecolors的colormap时,facecolors值会否决vmax属性.因此Vmax没有效果(尝试1).线条也消失了,但这是另一个问题.
还试图更改facecolor数据集(fc)的值没有达到预期的效果(attempt2).
我尝试使用缩放的颜色图获得一个图形(如下图'缩放'),但缩放到面部颜色,而不是z值.
下面的代码就是我现在的代码,结果如下所示:
有谁知道我在这里缺少什么?任何想法都表示赞赏!
import pylab as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.ion()
# creating dataset
profile = np.arange(20)**2
z = profile.repeat(20).reshape(20,20)
fc= np.rot90(z.copy())
x = np.arange(z.shape[0])
y = np.arange(z.shape[1])
X, Y = np.meshgrid(x,y)
# plotting
vmax = 100
fig = plt.figure()
ax = fig.add_subplot(1,4,1, projection='3d', azim=210)
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1)
ax.set_title('normal')
ax = fig.add_subplot(1,4,2, projection='3d', azim=210)
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1, vmax=vmax)
ax.set_title('scaled')
ax = fig.add_subplot(1,4,3, projection='3d', azim=210)
ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(fc), cstride=1, rstride=1, …
Run Code Online (Sandbox Code Playgroud) 我在matlab中生成了以下表面图:
我需要在.NET中创建它.我希望使用IronPython来做到这一点.但首先我只想尝试用Python创建绘图(PyLab).这是我到目前为止:
请看看我的代码并告诉我如何让python显示黑色边缘线.当我添加facecolors=UWR(heatmap)
属性时,它们似乎消失了surf(...)
.这是mplot3d中的错误还是设计?无论哪种方式,我如何让线路回来?
这是我的代码(大数据矩阵的道歉):
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import matplotlib
from pylab import *
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
#Sample colour data
heatmap = np.array([(0.304, 0.288, 0.284, 0.26, 0.248, 0.224, 0.204, 0.184, 0.18, 0.18, 0.156, 0.148, 0.144, 0.136, 0.136, 0.128, 0.124, 0.124, 0.128, 0.124, 0.124),
(0.356, 0.348, 0.332, 0.328, 0.308, 0.292, 0.288, 0.272, 0.252, 0.232, 0.216, 0.204, 0.16, …
Run Code Online (Sandbox Code Playgroud) 我正在使用Tkinter和ttk构建一个GUI,并使用matplotlib来创建交互式图 - 再次像其他人一样.即使我到目前为止遇到的大多数问题都有详细记录,但这个问题似乎很少见:
在3d中绘图并set_lim()
随后使用命令调整轴刻度时,绘制的线超出了看起来不好的坐标系.而且,我对这个似乎有点小的框架感到不满意.这是一个例子:
# Missmatch.py
"""Graphical User Interface for plotting the results
calculated in the script in Octave"""
# importing libraries
import matplotlib, ttk, threading
matplotlib.use('TkAgg')
import numpy as nm
import scipy as sc
import pylab as pl
import decimal as dc
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import Axes3D
from oct2py import octave as oc
import Tkinter as tki
class CS:
"""CS - Controlset. This part creates the GUI with all …
Run Code Online (Sandbox Code Playgroud) 我在三维空间中有一堆点,并估计了这些点上的一些分布(也在3D空间中;使用核密度估计,尽管这与此问题无关).我想将该分布的投影绘制为所有三个轴(x,y和z)上的等高线图.对z轴执行此操作非常简单(即投影到具有相同z坐标的平面上):
import numpy as np
import scipy as sp
import scipy.stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
# generate some points of a 3D Gaussian
points = np.random.normal(size=(3, 50))
# do kernel density estimation to get smooth estimate of distribution
# make grid of points
x, y, z = np.mgrid[-4:4:100j, -4:4:100j, -4:4:100j]
kernel = sp.stats.gaussian_kde(points)
positions = np.vstack((x.ravel(), y.ravel(), z.ravel()))
density = np.reshape(kernel(positions).T, x.shape)
# now density is 100x100x100 ndarray
# plot points
ax = plt.subplot(projection='3d') …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Matplotlib 设计一个三维插图。一切都很好,除了(红色)参数曲线得到错误的 zorder 而(绿色)参数曲面完全正确绘制。
由以下代码生成的输出:
我知道 Matplotlib 在准确计算对象的 zorder 方面的能力有限,但由于它可以为参数曲面执行此操作,因此它似乎是 Matplotlib 中的一个错误。
也就是说,有没有办法强制正确的 z-ordering 只是为了让事情快速工作?似乎我只能说正确的透明蓝色平面位于其他一切之上。但是,将 zorder 参数放入 PolyCollection 似乎没有任何效果,并且将显式 zorder 参数放入绘制读取线的绘图函数中会弄乱其相对于绿色表面的顺序。
有没有办法将正确的蓝色透明表面强加于一切之上?这是我到目前为止的代码:
#!/bin/env python3
from pylab import *
from mpl_toolkits.mplot3d import *
from matplotlib.collections import PolyCollection
from matplotlib.colors import colorConverter
from matplotlib.patches import FancyArrowPatch
rc('text', usetex=True)
rc('font', size=20)
fig = figure(figsize=(11,6))
ax = fig.gca(projection='3d')
ax.set_axis_off()
def f(x,t):
return t/2 * 0.55*(sin(2*x)+0.4*x**2-0.65)
c_plane = colorConverter.to_rgba('b', alpha=0.15)
N = 50
y = linspace(-1,1,N)
t = linspace(0,2,N)
yy, tt = meshgrid(y, t) …
Run Code Online (Sandbox Code Playgroud) 混合 2D 和 3D 子图时,我无法去除过多的空白。对于纯 3D 子图,我可以调整正在绘制的区域fig.subplots_adjust()
以去除空白,请参见此处。
但是,如果此 3D 图像位于 2D 子图中,则相同的技巧将不起作用。我创建了如下所示的混合子图:
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import axes3d
fig,axes = plt.subplots(2,2)
ax = axes.flat
for a in range(3):
ax[a].plot(range(10),range(10))
ax[3].remove()
ax[3] = fig.add_subplot(224,projection='3d')
X, Y, Z = axes3d.get_test_data(0.03)
ax[3].plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.8,cmap=cm.coolwarm)
ax[3].set_xticklabels('')
ax[3].set_yticklabels('')
ax[3].set_zticklabels('')
fig.subplots_adjust(hspace=0,wspace=0)
Run Code Online (Sandbox Code Playgroud)
现在的伎俩,例如。fig.subplots_adjust(left=-0.01)
将作用于 2D 子图的左边缘,并且不会修改 3D 子图。有没有办法完全去除 3D 子图周围的空白?我也试过更小ax.dist
,如果 3D 绘图在 z 方向上更长,那就不好了。
我想从 Python 创建 3D 坐标变换图。例如,我想创建以下图像(由 TikZ 静态生成):
经过一番搜索,我找到了以下程序:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d
class Arrow3D(FancyArrowPatch):
def __init__(self, xs, ys, zs, *args, **kwargs):
FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
self._verts3d = xs, ys, zs
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
FancyArrowPatch.draw(self, renderer)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d') …
Run Code Online (Sandbox Code Playgroud) (这可能是一个天真的问题.请原谅我.)
我使用的是Python 3.7.1和MatplotLib 3.0.1.
在下面的简单代码中,我使用不同的方法为轴分配标签.从OO的角度来看,它们似乎是等同的.但只有x axis
标签显示.为什么?
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.linspace(-2,2,60)
y = np.linspace(-2,2,60)
xx, yy = np.meshgrid(x,y)
z = xx**2 + yy**3
surf = ax.plot_surface(xx, yy, z, cmap="viridis")
ax.set_xlabel('x axis') # <====== This works
ax.yaxis.set_label('y axis') # <====== This doesn't work
ax.zaxis.set_label('z axis') # <====== This doesn't work
Run Code Online (Sandbox Code Playgroud)
在下图中,您只能看到x axis
显示的标签.
根据这里,似乎该matplotlib.axis.XAxis.set_label()
方法应该工作. …
我有时会因为 matplotlib 的 mplot3d 中缺少某些渲染功能而感到沮丧。在大多数情况下,我确实发现我可以在 mayavi 中得到我想要的东西,但是 matplotlib 3d 轴仍然更可取,如果只是为了美观,比如 LaTeX 化的标签和与我的其他图形的视觉一致性。
我的问题是关于明显的 hack:是否可以在没有轴的情况下在 Mayavi 中绘制一些 3d 对象(表面或 3d 散点图或其他),导出该图像,然后将其放置在具有正确大小、方向、坐标的 matplotlib Axes3D 中投影等?任何人都可以想出实现这一目标需要什么的大纲,或者甚至提供一个框架解决方案?
前段时间我摆弄了这个,发现我在导出透明背景 mayavi 图形并将其放置在空的 matplotlib Axes3D(带有刻度、标签等)方面没有问题,但我并没有得到什么mayavi 和 matplotlib 的相机配置相匹配。简单地将方位角、仰角和距离这三个常用参数在两种环境中设置为相等并不能解决问题;大概需要的是对渲染整个场景的透视(或其他)变换进行一些考虑,而我在该领域相当无能为力。
看起来这可能有用:http : //docs.enthought.com/mayavi/mayavi/auto/example_mlab_3D_to_2D.html
matplotlib ×10
mplot3d ×10
python ×9
3d ×1
mayavi ×1
numpy ×1
plot ×1
python-2.7 ×1
python-3.x ×1
scipy ×1