英文:
how to scale a polar plotted sphere up to a different radius? python
问题
下面是翻译后的代码部分:
# 原始代码
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
r = 0.05
u, v = np.mgrid[0:2 * np.pi:30j, 0:np.pi:20j]
x = np.cos(u) * np.sin(v)
y = np.sin(u) * np.sin(v)
z = np.cos(v)
ax.plot_surface(x, y, z, cmap=plt.cm.YlGnBu_r)
plt.show()
# 无论我将r更改为什么值,绘图总是0.5乘0.5的单位。我希望它的半径为50。
# 第一个球体图片:[first sphere](https://i.stack.imgur.com/fSvZI.png)
# 然后我尝试了这个,它返回了我想要的大小的球体,但我不确定z坐标是否以相同的比例缩放,因为它看起来不太球形。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [10.00, 40.50]
plt.rcParams["figure.autolayout"] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.axes.set_xlim3d(left=-100, right=100)
ax.axes.set_ylim3d(bottom=-100, top=100)
ax.axes.set_zlim3d(bottom=-100, top=100)
r = 50
u, v = np.mgrid[0:2 * np.pi:300j, 0:np.pi:300j]
x = 100 * (np.cos(u) * np.sin(v))
y = 100 * (np.sin(u) * np.sin(v))
z = 100 * (np.cos(v))
ax.plot_surface(x, y, z, rstride=5, cstride=5, cmap=plt.cm.YlGnBu_r)
plt.show()
# 第二个球体图片:[second sphere](https://i.stack.imgur.com/qOGaX.png)
# 我尝试添加更多绘制点并将它们缩放100倍。不确定是不是球体或其他形状。
希望这对你有所帮助。如果需要进一步的翻译或解释,请随时提问。
英文:
So i need to scale up the size of a sphere i plotted with polar coordinates, but I am unsure if Im doing it correctly in a way that scales properly.
#og code
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
r = 0.05
u, v = np.mgrid[0:2 * np.pi:30j, 0:np.pi:20j]
x = np.cos(u) * np.sin(v)
y = np.sin(u) * np.sin(v)
z = np.cos(v)
ax.plot_surface(x, y, z, cmap=plt.cm.YlGnBu_r)
plt.show()
#no matter what I change r to its always .5 by .5 units on a plot. I want it to be a radius of 50.
first sphere
I then tried this and it returns a sphere the size I want, but I am unsure if the z coordinate is scaling the same rate as the rest because it doesn't look as spherical.
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [10.00, 40.50]
plt.rcParams["figure.autolayout"] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.axes.set_xlim3d(left=-100, right=100)
ax.axes.set_ylim3d(bottom=-100, top=100)
ax.axes.set_zlim3d(bottom=-100, top=100)
r = 50
u, v = np.mgrid[0:2 * np.pi:300j, 0:np.pi:300j]
x = 100*(np.cos(u) * np.sin(v))
y = 100*(np.sin(u) * np.sin(v))
z = 100*(np.cos(v))
ax.plot_surface(x, y, z, rstride= 5, cstride = 5, cmap=plt.cm.YlGnBu_r)
plt.show()```
[second sphere](https://i.stack.imgur.com/qOGaX.png)
I tried to just add more points to plot and scaling them by multiplying by 100. not sure if spherical or tripping.
</details>
# 答案1
**得分**: 2
使用 `ax.set_box_aspect()` 来确保所有的坐标轴按相同的比例缩放(沿着X、Y和Z轴的纵横比)。[查看相关文档](https://matplotlib.org/stable/api/_as-gen/matplotlib.axes.Axes.set_box_aspect.html)
您可以通过传递硬编码的值或通过使用 `np.ptp()` 函数动态获取 `x`、`y` 和 `z` 值的总范围来实现这一点。
```python
# 硬编码的值可以是 (200, 200, 200)
ax.set_box_aspect((np.ptp(x), np.ptp(y), np.ptp(z))
ax.plot_surface(x, y, z, rstride= 5, cstride = 5, cmap=plt.cm.YlGnBu_r)
plt.show()
这应该为您提供以下图形
关于半径,您没有使用您定义的 r
变量。使用 r
缩放 x
、y
和 z
应该有效:
# 保持与前面图形相同的盒子纵横比,以演示缩放效果
ax.set_box_aspect((200, 200, 200))
x = r*(np.cos(u) * np.sin(v))
y = r*(np.sin(u) * np.sin(v))
z = r*(np.cos(v))
在这里,r=50
将生成以下图形:
英文:
Use the ax.set_box_aspect()
to make sure all the axes are scaling at the same rate (aspect ratio along X, Y, and Z axis). See the corresponding doc
You can either pass hard-coded values or do it dynamically by retrieving the total range of x
, y
, and z
values with the np.ptp()
function.
[...]
# Hard coded values would be (200, 200, 200)
ax.set_box_aspect((np.ptp(x), np.ptp(y), np.ptp(z))
ax.plot_surface(x, y, z, rstride= 5, cstride = 5, cmap=plt.cm.YlGnBu_r)
plt.show()
This should give you the following figure
Regarding the radius, you're not using the r
variable you define. Scalling x
, y
and z
with r
should work:
# Keep same box aspect as previous figure to demonstrate the scaling effect
ax.set_box_aspect((200, 200, 200))
x = r*(np.cos(u) * np.sin(v))
y = r*(np.sin(u) * np.sin(v))
z = r*(np.cos(v))
Here, r=50
will generate the following figure:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论