多个文件的3D散点图,每个文件具有唯一的颜色

我看过this thread,但我的数据有些不同。我想创建一个包含x,y,z坐标和颜色代码的多个文件的3D图,每个文件都具有唯一的颜色,而不是每个点坐标

到目前为止的

代码:

import meshio
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import glob
import matplotlib.cm as cm

files = sorted(glob.glob('mesh_files/*.vtk'))

mesh = []

fig = plt.figure(figsize = (16,10))
ax = plt.axes(projection = '3d')

colors = cm.rainbow(np.linspace(0,1,16))

for file in files:
    mesh.append(meshio.read(file))

    x = [m.points[:,0] for m in mesh]
    y = [m.points[:,1] for m in mesh]
    z = [m.points[:,2] for m in mesh]

    for a,b,c,d in zip(x,y,z,colors):
        plt.scatter(a,color=d)

背景

xyz都是lists,包含numpy arrays

len(x)
16

len(x[0])
99937

x[0].shape
(99937,)

type(x)
<class 'list'>

type(x[0])
<class 'numpy.ndarray'>

我认为问题出在colors上,尺寸可能不匹配

len(colors)
16

len(colors[0])
4

错误

RuntimeWarning: invalid value encountered in sqrt

编辑:我可以单独调用scatter并手动输入不同的颜色来创建下面的图,但是这将永远占用10个以上的文件,因此我希望将其放在某种循环或某种函数中。

多个文件的3D散点图,每个文件具有唯一的颜色

EDIT2:我能够获得此图,这很不错,因为每个文件的数据的颜色是不同的,但是与第一个图相比,z比例太小,看起来像数据缺少,它应该像第一张图的z深度值一样,但是像第二张图一样具有16种独特的颜色。第一幅图只是手动绘制3个文件

多个文件的3D散点图,每个文件具有唯一的颜色

cheungdmin19791004 回答:多个文件的3D散点图,每个文件具有唯一的颜色

我认为您的错误来自于您在每一步进行更新的网格列表。您可以在每个步骤中绘制整个网格列表,以使您的第一个文件以16种不同颜色绘制16次。

最简单的代码可能是:

const CustomStackNavigator = createStackNavigator(
  {
    Home: { screen: Main }
  },{ headerLayoutPreset: 'left' }
);

如果要将所有点存储在名为import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np import glob import matplotlib.cm as cm files = sorted(glob.glob('mesh_files/*.vtk')) fig = plt.figure(figsize = (16,10)) ax = plt.axes(projection = '3d') colors = cm.rainbow(np.linspace(0,1,len(files))) for file in files: data = meshio.read(file).points x = data[:,0] y = data[:,1] z = data[:,2] plt.scatter(x,y,z,color = colors[files.index(file)]) 的列表中,则可以将其修改为:

mesh

这样,您只需在每个步骤中绘制对应于刚读取的文件的点即可。

,

如果以后不需要网格,则可以避免分配一堆内存

...
colors = iter(cm.rainbow(np.linspace(0,16)))
for file in files:
    plt.scatter(*meshio.read(file).points.T,c=[next(colors)],label=file)
plt.legend()
plt.show()

或者,如果以后需要网格,我们可以使用容器

...
meshes = []
colors = iter(cm.rainbow(np.linspace(0,16)))
for file in files:
    meshes.append(meshio.read(file))
    plt.scatter(*meshes[-1].points.T,label=file)
plt.legend()
plt.show()

NB scatter在3D中需要xyz,它们的形状均为(N,),而meshobj.points的形状为{{1 }},因此我们首先对其进行转置(形状现在为(N,3)),最后解包(使用星号“ (3,N)”运算符)将2D数组解包,以获取所请求的三个*数组。 / p>

,

如前所述,您遇到的问题是颜色选择发生在哪个循环中。

{x:Static SystemColors.ControlBrush}
,

下面的这段代码目前大部分对我有用。

我将plt.scatter...更改为ax.scatter...,并解决了我在上面的 EDIT 2 中提到的z轴缩放问题。

我还更改为ax = Axes3D(fig)

感谢大家的帮助!我现在将使用它。 enter image description here

import meshio
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import glob
import matplotlib.cm as cm

files = sorted(glob.glob('path/to/vtk/files/*_mesh.vtk'))

meshes = []

fig = plt.figure(figsize = (16,10))
ax = Axes3D(fig)

colors = iter(cm.rainbow(np.linspace(0,len(files))))

for fyle in files:
    ax.scatter(*meshio.read(fyle).points.T,c=[next(colors)])

plt.legend() #legend isn't plotting,will have to fix this
plt.show()
本文链接:https://www.f2er.com/3137499.html

大家都在问