到目前为止我有这个:
x,y,z = data.nonzero()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, zdir='z', c= 'red')
plt.savefig("plot.png")
这就产生了:
我想做的是把它拉长,使Z轴高9倍,保持X和Y不变。我想保持相同的坐标。
我试过这个人:
fig = plt.figure(figsize=(4.,35.))
但这只是扩展了plot.png图像。
7条答案
按热度按时间fivyi3re1#
下面的代码示例提供了一种相对于其他轴缩放每个轴的方法。但是,要做到这一点,您需要修改Axes3D.get_proj函数。下面是基于matplot lib提供的示例的示例:http://matplotlib.org/1.4.0/mpl_toolkits/mplot3d/tutorial.html#line-plots
(在这个答案的最后还有一个简短的版本)
标准输出:
按(1,2,3)缩放:
按(1,1,3)缩放:
我特别喜欢这个方法的原因是,Swap z和x,按(3,1,1)缩放:
下面是代码的简短版本。
7qhs6swi2#
**请注意,下面的答案简化了补丁程序,但使用了与@ChristianSarofeen相同的基本原理。
解决方案
正如在其他答案中已经指出的,它不是matplotlib中当前实现的特性。然而,由于您所请求的只是一个3D变换,可以应用到matplotlib使用的现有投影矩阵,并且感谢Python的奇妙特性,这个问题可以通过一个简单的oneliner解决:
其中,
scale_x
、scale_y
和scale_z
是0到1的值,这些值将相应地沿着每个轴重新缩放绘图。ax
简单地是可以通过ax = fig.gca(projection='3d')
获得的3D轴说明
为了解释,
Axes3D
的函数get_proj
从当前观看位置生成投影矩阵。将其乘以缩放矩阵:包括缩放到渲染器使用的投影中。因此,我们在这里要做的是用一个表达式来替换原始的
get_proj
函数,该表达式得到原始的get_proj
的结果,并将其乘以缩放矩阵。示例
为了用标准参数函数示例说明结果:
对于值
0.5, 0.5, 1
,我们得到:而对于值
0.2, 1.0, 0.2
,我们得到:gywdnpxw3#
在我的例子中,我想拉伸z轴2倍以获得更好的点可见性
p1tboqfb4#
我看起来默认情况下,mplot3d会在一个非常高的地块的顶部和底部留下相当大的空间。但是,您可以使用
fig.subplots_adjust
欺骗它填充该空间,并将顶部和底部延伸到正常绘图区域之外(即top > 1
和bottom < 0
)。这里可能需要一些试验和错误来满足您的特定情节。我为x、y和z创建了一些随机数组,其限制与您的图相似,并且发现下面的参数(
bottom=-0.15
,top = 1.2
)似乎工作正常。您可能还想更改
ax.view_init
以设置一个好的视角。8yparm6h5#
听起来你在调整情节的规模。我不认为有一种方法可以扩展一个 * 线性 * 刻度到用户的规格,但是你可以使用
set_yscale()
,set_xscale()
,set_zscale()
来改变刻度之间的关系。直观地说,
set_yscale(log)
、set_xscale(log)
、set_zscale(linear)
可能会解决您的问题。一个可能更好的选择:指定一个拉伸,将它们全部设置为具有相同对数基数的symlog,然后根据您的规格指定具有
linscalex/linscaley
kwargs的Z轴symlog比例。更多信息:
http://matplotlib.org/mpl_toolkits/mplot3d/api.html
ru9i0ody6#
我在寻找类似的问题时发现了这一点。经过一些实验,也许我可以在这里分享一些我的初步发现。matplotlib库是巨大的!(我是新来的)。请注意,非常类似于这个问题,所有我想要的是“视觉上”拉伸图表而不扭曲它。
背景故事(* 只显示关键代码片段,以避免对那些知道库的人不必要的混乱,如果你想要一个可运行的代码,请删除评论 *):我有三个1-d ndarray分别表示X、Y和Z数据点。显然我不能使用plot_surface(因为它需要为每个dim使用2d ndarray),所以我选择了非常有用的plot_trisurf:
你可以把这个图想象成一艘在波浪中变形的浮动驳船...正如你所看到的,轴的拉伸使它在视觉上相当欺骗(注意x应该是y的x6倍,并且>>>>>>> z)。虽然情节点是正确的,但我想要的东西更视觉上‘拉伸‘至少。我在寻找一个快速解决,如果我可以。长话短说,我发现有点成功与...‘Figure.Figsize‘一般设置(见下面的片段)。
[15,5]我得到了一些像...
很漂亮!!
所以我开始推它……[20,6]在决定在那里定居之前。
如果你想尝试在视觉上拉伸垂直轴,尝试与比例,如...[7,10],在这种情况下,这给了我。。
不太寒酸!
应该是为了视觉效果。
cbjzeqam7#
把你所有的z值乘以9
然后给予z轴自定义打印标签和间距。