matplotlib:为半径分配颜色

时间:2018-08-04 10:09:49

标签: python python-3.x matplotlib contour contourf

我有一张磁盘的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()

我希望有人可以提供帮助,这对我来说非常重要。 最好的问候!

1 个答案:

答案 0 :(得分:1)

这是一种解决方案。我只是在您的第一个代码之后添加了以下几行,最后一行是n1。我还没有使用n5。附注:我通过使用ax.plot_surface(X, Y, Z, alpha=0.5, color='lightgrey', rstride=1, cstride=1)来提高plt.show()的密度,因为最初您只有phi数据点。这是为了绘制相对平滑的圆。

phi = np.linspace(0, 2*np.pi, 2000)

我选择20作为轮廓图的高度。您可以根据自己的选择进行修改。

以下是所得图。希望对您有帮助。卑鄙的pass子。

enter image description here