matplotlib: asigna color a un radio

Tengo un gráfico 3D de un disco. Ahora me gustaría trazar la superficie en color en función de los valores que se almacenan en una matriz. Por ejemplo, el radio del disco es de 300 mm. La matriz podría gustar:

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]]) 

Significa que para el radio = 114.28 tengo el valor 14. Me gustaría trazar un círculo en el radio 114.28 en un color (por ejemplo, azul). El segundo radio es 128.57. Para el radio 128.57 se asigna el valor 16. Eso significa que me gustaría trazar un círculo en otro color, por ejemplo, naranja en la superficie de la plot y así sucesivamente.

Intenté resolver este problema con la gráfica de contorno (gracias a bazingaa). Se ve exactamente como lo quiero. Desafortunadamente, me acabo de dar cuenta de que esta no es realmente la solución a mi problema. Tal vez debería explicar lo que estoy tratando de lograr. Quiero mostrar cómo ciertos parámetros, como la velocidad, se distribuyen a lo largo del disco. En este caso, la gráfica de contorno también se corregiría, ya que la velocidad aumenta hacia el exterior. Pero también puede suceder que los parámetros deban visualizarse, los cuales no siempre aumentan continuamente hacia el exterior. Intenté este escenario y simplemente hice un valor en medio de la matriz más pequeño que el valor anterior (cambié el valor 27 a 14 de arr) y no sucede nada en la gráfica de contorno, excepto que la leyenda cambia. Tal vez la gráfica de contorno no es el enfoque correcto después de todo? Tal vez tenga que dibujar círculos individuales y asignarles colores e interpolar entre los círculos para llenar los huecos.

dibujo de contorno

 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() 

Espero que alguien pueda ayudar, es muy importante para mí. Atentamente !

Aquí hay una solución. Acabo de agregar las siguientes líneas después de su primer código cuya última línea es ax.plot_surface(X, Y, Z, alpha=0.5, color='lightgrey', rstride=1, cstride=1) . No plt.show() todavía. PD: phi = np.linspace(0, 2*np.pi, 2000) la densidad de phi usando phi = np.linspace(0, 2*np.pi, 2000) ya que inicialmente tenías solo 20 puntos de datos. Esto es para trazar círculos relativamente más suaves.

 plt.contourf(X, Y, np.sqrt(X ** 2 + Y ** 2), zdir='z', offset=20, cmap=plt.cm.bwr) plt.colorbar() plt.show() 

He elegido z=20 como la altura para el gráfico de contorno. Puede modificarlo según su elección.

A continuación se muestra la ttwig resultante. Espero que te ayude. Viel spass.

introduzca la descripción de la imagen aquí