我有一张磁盘的3D图。现在我想根据存储在数组中的值绘制颜色表面。例如。磁盘半径为300mm。该阵列可能像:
arr = np.array([[ 114.28, 14],
[ 128.57, 16],
[ 142.85,19],
[ 157.13,20],
[ 171.41,21],
[ 185.69,22],
[ 199.97,24],
[ 214.25,27],
[ 228.53,29],
[ 242.81,30],
[ 257.09,31],
[ 271.37,34],
[ 288.65,35],
[ 299.93,36],
[ 300,38]])
这意味着对于半径= 114.28我有值14.我想在一个颜色(例如蓝色)中绘制半径为114.28的圆。第二个半径是128.57。对于半径128.57,分配值16。这意味着我想绘制另一种颜色的圆圈,例如情节表面上的橙色等。
我尝试用contourplot解决这个问题(感谢bazingaa)。它看起来完全符合我的要求。不幸的是,我刚才意识到这不是我问题的真正解决方案。也许我应该解释一下我想要实现的目标。我想说明某些参数(如速度)是如何沿光盘分布的。在这种情况下,当速度朝向外部增加时,轮廓图也将校正。但也可能发生必须可视化的参数,这些参数并不总是连续向外增加。我尝试了这个场景,只是在数组中间的值小于它之前的值(我从arr将值27更改为14)并且除了图例更改之外没有任何事情发生在contourplot中。也许contourplot毕竟不是正确的方法?也许我必须绘制单个圆圈并为它们指定颜色并在圆圈之间进行插值以填补空白。
import numpy as np
import matplotlib as mlp
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
ri = 100
ra = 300
h=20
# input xy coordinates
xy = np.array([[ri,0],[ra,0],[ra,h],[ri,h],[ri,0]])
# radial component is x values of input
r = xy[:,0]
# angular component is one revolution of 30 steps
phi = np.linspace(0, 2*np.pi, 2000)
# create grid
R,Phi = np.meshgrid(r,phi)
# transform to cartesian coordinates
X = R*np.cos(Phi)
Y = R*np.sin(Phi)
# Z values are y values, repeated 30 times
Z = np.tile(xy[:,1],len(Y)).reshape(Y.shape)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.set_zlim(0,200)
ax.plot_surface(X, Y, Z, alpha=0.5, color='lightgrey', rstride=1, cstride=1)
plt.contourf(X, Y, np.sqrt(X ** 2 + Y ** 2), zdir='z', offset=20,
cmap=plt.cm.rainbow)
cbar = plt.colorbar()
arr = np.array([[ 114.28, 14],
[ 128.57, 16],
[ 142.85,19],
[ 157.13,20],
[ 171.41,21],
[ 185.69,22],
[ 199.97,24],
[ 214.25,27],
[ 228.53,29],
[ 242.81,30],
[ 257.09,31],
[ 271.37,34],
[ 288.65,35],
[ 299.93,36],
[ 300,38]])
cbar.ax.set_yticklabels(arr[:,1])
plt.show()
我希望有人可以提供帮助,这对我来说非常重要。最好的祝福 !
这是一个解决方案。我刚刚在你的第一行代码ax.plot_surface(X, Y, Z, alpha=0.5, color='lightgrey', rstride=1, cstride=1)
之后添加了以下几行。我还没有使用plt.show()
。 P.S。:我通过使用phi
增加了phi = np.linspace(0, 2*np.pi, 2000)
的密度,因为最初你只有20
数据点。这是为了绘制相对更平滑的圆圈。
plt.contourf(X, Y, np.sqrt(X ** 2 + Y ** 2), zdir='z', offset=20,
cmap=plt.cm.bwr)
plt.colorbar()
plt.show()
我选择了z=20
作为等高线图的高度。您可以根据自己的选择进行修改。
以下是结果图。希望它能帮到你。 Viel spass。