Matplotlib缩放3D表面图尺寸并使其与真实的图像尺寸不同[重复]

9ceoxa92  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(154)

此问题已在此处有答案

set matplotlib 3d plot aspect ratio(12个回答)
上个月关门了。
我有一个尺寸为440x219的.jpg图像。
Original .jpg image
我使用Matplotlib来绘制这个图像的表面图,它似乎工作得很好,结果是:
Matplotlib rendered image
然而,你可以看到正方形变形成了矩形。我的问题是:如何让Matplotlib将这些图像渲染为正方形(就像原始的.jpg图像一样)。
我目前正在使用的代码呈现:

fig = plt.figure(figsize=(5, 4))
 ax = plt.axes(projection='3d')
 ax.plot_surface(X, Y, img_binary, rstride=1, cstride=1, linewidth=0, cmap='gray')

 ax.view_init(40, -20)
 plt.show()

我想一定有其他的选择。任何建议都将不胜感激。

brtdzjyr

brtdzjyr1#

https://stackoverflow.com/a/64453375/21260084回答了如何设置Axis 3d的长宽比这个更一般的问题,他们提出的解决方案效果很好。

import matplotlib.pyplot as plt
import numpy as np

img = plt.imread('/tmp/ex.jpg')
fig = plt.figure(figsize=(5, 4))
ax = plt.axes(projection='3d')

xx, yy = np.mgrid[:img.shape[0], :img.shape[1]]
ax.plot_surface(xx, yy, img, rstride=1, cstride=1, linewidth=0, cmap='gray')
scale_height= 1.0
ax.set_box_aspect((img.shape[0], img.shape[1], np.ptp(img)*scale_height))

ax.view_init(40, -20)
plt.show()

3d surface plot rendering of image
请注意,您还希望/必须缩放第三个维度相对于其他维度。该示例将1像素设置为等于灰度图像范围内的1个变化,但您实际想要的显然取决于上下文。

相关问题