我正在尝试在matplotlib上制作一个3D图,其上有三个圆,每个圆都以原点为中心,半径为1,指向不同的方向 - 例如,用于说明半径为1的球体.
在2D中,我会制作一个圆形补丁集合并将其添加到轴上.在3D中,我很难让补丁显示出来,更不用说将它们定向在不同的方向.
import matplotlib
import matplotlib.pyplot as P
import mpl_toolkits.mplot3d as M3
fig = P.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
circles = matplotlib.collections.PatchCollection(
[matplotlib.patches.Circle((0, 0), 1) for count in range(3)],
offsets=(0, 0))
M3.art3d.patch_collection_2d_to_3d(circles, zs=[0], zdir='z')
ax.add_collection(circles)
P.show()
Run Code Online (Sandbox Code Playgroud)
无论我如何旋转绘图,运行此程序都会用蓝色填充整个绘图窗口,即补丁的面部颜色.如果我facecolor='none'在PatchCollection()通话中设置,则显示空白Axes3D.
我试过的事情:
CircleCollection而不是a PatchCollection,则根本不显示任何补丁.调用中的zs参数patch_collection_2d_to_3d()是奇数; 我希望放置zs=0(所有三个补丁的一个z坐标)或zs=[0,0,0](每个补丁的一个单独的z坐标),但这两个都抛出一个错误:
ValueError:使用序列设置数组元素.
以定向补丁不同,我会希望能够通过类似zdir=['x', 'y', 'z']但结果并没有什么不同我是否传递或'z'或['z'].
ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', …如何逆转3D图的z轴上的顺序(即负向上,正向向下)?下面的代码生成一个底部朝下的圆锥体; 是否有ax.reverse_zlim3d(True)可用于更改刻度顺序的命令(类似于什么?)?
下面的代码绘制了一个底部指向下方的圆锥体.我想颠倒z轴的顺序,以便它的底部朝上,如冰淇淋圆锥,在图形的顶部而不是底部为-1.
from matplotlib import pyplot as p
from mpl_toolkits.mplot3d import Axes3D # @UnusedImport
import numpy as np
from math import pi, cos, sin
z = np.arange(0, 1, 0.02)
theta = np.arange(0, 2 * pi + pi / 50, pi / 50)
fig = p.figure()
axes1 = fig.add_subplot(111, projection='3d')
for zval in z:
x = zval * np.array([cos(q) for q in theta])
y = zval * np.array([sin(q) for q in theta])
axes1.plot(x, y, -zval, 'b-')
axes1.set_xlabel("x label") …Run Code Online (Sandbox Code Playgroud) 我想使用matplotlib生成一些透明背景的GIF.我尝试了不同的选项,但我无法获得透明背景的文件.使用当前设置,我得到第一帧,但不是其余的.以下是我的代码
from __future__ import division
from numpy import pi, sin, cos, mgrid
from scipy.special import jn, jn_zeros
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import rcParams
# In Windows the next line should provide the full path to convert.exe
# since convert is a Windows command
rcParams['animation.convert_path'] = "C:\Program Files\ImageMagick-6.9.3\convert.exe"
rcParams['savefig.transparent'] = True
rcParams['savefig.dpi'] = 130
rcParams['savefig.pad_inches'] = 0
plot_args = {'rstride': 1, 'cstride': 1, 'cmap':"RdYlBu",
'linewidth': 0.5, 'antialiased': True, 'color': '#1e1e1e',
'shade': …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)
我有一大堆数据,我试图在3D中表示希望发现一个模式.我花了很长时间阅读,研究和编码,但后来我意识到我的主要问题不是编程,而是实际上选择了一种可视化数据的方法.
Matplotlib的mplot3d提供了很多选项(线框,轮廓,填充轮廓等),MayaVi也是如此.但是有很多选择(每个都有自己的学习曲线),我几乎迷失了,不知道从哪里开始!所以我的问题基本上是你必须处理这些数据时使用哪种绘图方法?
我的数据是基于日期的.对于每个时间点,我绘制一个值(列表'Actual').
但是对于每个时间点,我也有一个上限,一个下限和一个中间点.这些限制和中点基于种子,在不同的平面上.
我希望在我的"实际"读数中发生重大变化时或之前发现该点或识别模式.是在所有飞机的上限都满足时?或者彼此接近?当实际值接触上/中/下限时?是否在一个平面上的Uppers触及另一架飞机的降落时?
在我粘贴的代码中,我将数据集简化为几个元素.我只是使用简单的散点图和线图,但由于数据集的大小(可能是mplot3d的限制?),我无法用它来发现我正在寻找的趋势.
dates = [20110101,20110104,20110105,20110106,20110107,20110108,20110111,20110112]
zAxis0= [ 0, 0, 0, 0, 0, 0, 0, 0]
Actual= [ 1132, 1184, 1177, 950, 1066, 1098, 1116, 1211]
zAxis1= [ 1, 1, 1, 1, 1, 1, 1, 1]
Tops1 = [ 1156, 1250, 1156, 1187, 1187, 1187, 1156, 1156]
Mids1 = [ 1125, 1187, 1125, 1156, 1156, 1156, 1140, 1140]
Lows1 = [ 1093, 1125, 1093, 1125, 1125, 1125, 1125, 1125]
zAxis2= [ 2, 2, 2, 2, …Run Code Online (Sandbox Code Playgroud) 我希望在我的3d箭袋图中有与颜色图相对应的颜色.2d版本的绘图有一个可选的数组,用于将颜色映射到箭头.如何在3d版本中创建相同的效果?
下面的代码生成我测量强度的点的3D图.我希望将强度值附加到每个点,然后在点之间插值,以产生显示高强度和低强度点的颜色图/表面图.
我相信这样做是必要的scipy.interpolate.RectBivariateSpline,但我不确定它是如何工作的 - 因为我所看到的所有例子都没有包括3D图.
编辑:我想将球体显示为表面图,但我不确定我是否可以使用Axes3D因为我的点不均匀分布(即赤道周围的点更靠近)
任何帮助将不胜感激.
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
# Radius of the sphere
r = 0.1648
# Our theta vals
theta = np.array([0.503352956, 1.006705913, 1.510058869,
1.631533785, 2.134886741, 2.638239697])
# Our phi values
phi = np.array([ np.pi/4, np.pi/2, 3*np.pi/4, np.pi,
5*np.pi/4, 3*np.pi/2, 7*np.pi/4, 2*np.pi])
# Loops over each angle to generate the points on the surface of sphere
def gen_coord():
x = np.zeros((len(theta), len(phi)), dtype=np.float32)
y …Run Code Online (Sandbox Code Playgroud) 我目前正在使用 python 处理应变数据,并使用 matplotlib (v. 1.5.1) 为有限应变椭球体创建各种图形输出。
处理 1000 个椭球体参数非常快(我正在重用此处提供的一些可爱的 python 代码https://github.com/minillinim/ellipsoid/blob/master/ellipsoid.py),但我的工作流程中的瓶颈与在 3D 绘图中绘制大量 3D 对象所需的时间。
下面我附上了一小段 Python 代码,用于计算和绘制一堆随机椭球体。虽然“ellipNumber”很小,但它的作用就像一个魅力。但是,当它达到 100 时,需要更长的时间.. 到了 1000 秒,我敢打赌你将没有耐心等待。
在 2D 中,我知道使用集合是提高性能的方法:如何快速绘制数千个圆圈?
假设集合确实是可行的方法,我四处寻找一个示例,并尝试使用椭圆体坐标填充 Poly3DCollection,就像他们在 3D 中对多边形所做的那样: Plotting 3D Polygons in python-matplotlib,但我没有成功设置基于 2d x、y 和 z 数组的顶点。
任何有关如何提高椭球体绘图性能的建议/评论将不胜感激!
干杯
import numpy as np
from numpy import linalg
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.colors as colors
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='3d')
# number …Run Code Online (Sandbox Code Playgroud) 我在 matplotlib 中为 3d 图设置限制时遇到问题;我发现无论我如何设置 x、y 和 z 轴的限制,3dplots 的绘图例程都会添加额外的缓冲区。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.axes.set_xlim3d(left=0, right=10)
ax.axes.set_ylim3d(bottom=0, top=10)
ax.axes.set_zlim3d(bottom=0, top=10)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这会产生以下图:
正如您所看到的,限制应该位于 x, y, z = {0, 10},但是 3D 绘图总是向每个边缘添加一点缓冲区。有谁知道如何关闭此效果?
我还使用过 plt.xlims(); 和 ax.axes.set_xlims() 但它们产生相同的效果。
我试图在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 ×10
mplot3d ×10
python ×10
numpy ×2
scipy ×2
animated-gif ×1
axis ×1
mayavi ×1
python-2.7 ×1
r ×1