Python 基于通过散射点的类别为三维曲面着色
我有以下格式的数据: 十、 Y,Z,类别 我使用plotly生成散点图,然后使用以下代码通过散点拟合曲线Python 基于通过散射点的类别为三维曲面着色,python,matlab,matplotlib,3d,plotly,Python,Matlab,Matplotlib,3d,Plotly,我有以下格式的数据: 十、 Y,Z,类别 我使用plotly生成散点图,然后使用以下代码通过散点拟合曲线 from scipy.interpolate import griddata import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D x=np.asarray([3,5,9,3,3,7,6,9,1,9]); y=n
from scipy.interpolate import griddata
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
x=np.asarray([3,5,9,3,3,7,6,9,1,9]);
y=np.asarray([4,3,3,10,8,2,4,10,9,3]);
z=np.asarray([1,2,4,10,1,7,10,3,1,7]);
# x = np.random.random(100)
xi=np.linspace(min(x), max(x),50)
#print xi
yi=np.linspace(min(y),max(y),50)
X,Y= np.meshgrid(xi,yi)
Z = np.nan_to_num(griddata((x,y), z, (X, Y), method='cubic'))
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False,alpha=0.4)
plt.show()
我想做的是根据以下类别给绘图上色:
其中红色表示类别1,蓝色表示类别2。
为了得到这样的结果,我需要生成一个2D数组,然后使用colormap/colorscale对类别进行相应的着色
上面的输出是使用XLSTAT创建的,其中category作为第四列作为category
有人能告诉我如何生成Z数据,以帮助我对类别进行不同的着色吗
我尝试过将2D矩阵分成0和1的两半,得到的输出是这样的
考虑到以下样本数据:
x y z Category
3 4 1 Cat 1
5 3 2 cat2
9 3 4 cat2
3 10 10 cat3
3 8 1 cat3
7 2 7 cat2
6 4 10 Cat 1
9 10 3 Cat 4
1 9 1 Cat 1
9 3 7 cat2
我需要生成2D数据,该数据将表示曲面颜色,并使用自定义颜色为不同类别添加颜色正如可用于将1Dz
数组插值到2D网格一样,您可以使用griddata
将1D颜色
数组插值到同一2D网格:
color = [colormap[cat] for cat in category]
C = np.nan_to_num(griddata((x, y), color, (X, Y), method='cubic'))
然后,您可以使用colormapcm.coolwarm
将C
中的值映射到RGBAFaceColor
:
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cmap,
linewidth=0, antialiased=False, alpha=0.4, facecolors=cmap(C))
我使用以下代码指定类别。我有七个类别,cmap=colors.ListedColormap(['#638b11','#ffc125','#00cdcd','#4776db','#8b4789','#d3d3d3','#000000'])我无法重现XLSTAT提供的结果,尽管XLSTAT的结果有一个红色的“手指”戳进了蓝色的湖中。右下角有一条蓝色的“河流”。我没有看到支持这些功能的数据点。你知道XLSTAT在做什么吗?(我不知道)不。我不明白他们用什么。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import scipy.interpolate as interpolate
x = np.asarray([3, 5, 9, 3, 3, 7, 6, 9, 1, 9])
y = np.asarray([4, 3, 3, 10, 8, 2, 4, 10, 9, 3])
z = np.asarray([1, 2, 4, 10, 1, 7, 10, 3, 1, 7])
category = np.array(['Cat 1', 'cat2', 'cat2', 'cat3', 'cat3',
'cat2', 'Cat 1', 'Cat 4', 'Cat 1', 'cat2'])
# coolwarm: 0 --> blue, 1 --> red
# want: 'Cat 1' --> blue, 'cat2' --> red, 'cat3' --> ?, 'Cat 4' --> ?
colormap = {'Cat 1': 0, 'cat2': 1, 'cat3': 0.333, 'Cat 4': 0.666}
color = np.array([colormap[cat] for cat in category])
xi = np.linspace(min(x), max(x), 50)
yi = np.linspace(min(y), max(y), 50)
X, Y = np.meshgrid(xi, yi)
Z = np.nan_to_num(interpolate.griddata((x, y), z, (X, Y), method='cubic'))
C = interpolate.griddata((x, y), color, (X, Y), method='cubic')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
cmap = cm.coolwarm
ax.scatter(x, y, z, c=color, cmap=cmap)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cmap,
linewidth=0, antialiased=False, alpha=0.4, facecolors=cmap(C))
plt.show()