从 3D 数组绘制 3D 散点图
Plot 3D scatter plot from 3D array
我目前正在尝试使用 3D 数组绘制 3D 散点图。
我在网上找到的关于绘制 3D 散点图的内容看起来像
ax.scatter3D(x, y, z)
其中 x
、y
、z
都是一维数组。
但是,就我而言,我正在使用 numpy 的 histogramdd
.
生成一个形状数组 (3, 3, 3)
In [61]: h, edges = histogramdd(array([[1,2,4],[4,2,8],[3,2,1],[2,1,2],[2,1,3],[2,1,1],[2,1,4]]),bins=3)
In [64]: h
Out[64]:
array([[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 1., 0.]],
[[ 3., 1., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 1., 0., 1.]]])
我的问题是,如何将这个 (3, 3, 3)
解压成与轴对应的一维数组,以便绘制 3d 散点图?
我会说你需要 4 个维度来绘制你创建的直方图。一个想法可能是使用 3D 散点图改变标记的大小来编码有关每个 3D bin 中包含的数据点数量的信息。
这是我会做的。
- 生成 3D 直方图
import numpy as np
a = np.array([[1,2,4],[4,2,8],[3,2,1],[2,1,2],[2,1,3],[2,1,1],[2,1,4]])
h, edges = np.histogramdd(a, bins=3)
- 创建 bin 位置的 3D 坐标
ex, ey, ez = edges
x, y, z = np.meshgrid(np.linspace(ex[0], ex[-1], 3),
np.linspace(ey[0], ey[-1], 3),
np.linspace(ez[0], ez[-1], 3))
- 使用 3D 散点图绘制 bin 并更改标记的大小以对每个绘制的 bin 中包含的点数进行编码:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x.flatten(), y.flatten(), z.flatten(), s=h.flatten()*50)
这是绘图结果:
我目前正在尝试使用 3D 数组绘制 3D 散点图。
我在网上找到的关于绘制 3D 散点图的内容看起来像
ax.scatter3D(x, y, z)
其中 x
、y
、z
都是一维数组。
但是,就我而言,我正在使用 numpy 的 histogramdd
.
(3, 3, 3)
In [61]: h, edges = histogramdd(array([[1,2,4],[4,2,8],[3,2,1],[2,1,2],[2,1,3],[2,1,1],[2,1,4]]),bins=3)
In [64]: h
Out[64]:
array([[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 1., 0.]],
[[ 3., 1., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 1., 0., 1.]]])
我的问题是,如何将这个 (3, 3, 3)
解压成与轴对应的一维数组,以便绘制 3d 散点图?
我会说你需要 4 个维度来绘制你创建的直方图。一个想法可能是使用 3D 散点图改变标记的大小来编码有关每个 3D bin 中包含的数据点数量的信息。
这是我会做的。
- 生成 3D 直方图
import numpy as np
a = np.array([[1,2,4],[4,2,8],[3,2,1],[2,1,2],[2,1,3],[2,1,1],[2,1,4]])
h, edges = np.histogramdd(a, bins=3)
- 创建 bin 位置的 3D 坐标
ex, ey, ez = edges
x, y, z = np.meshgrid(np.linspace(ex[0], ex[-1], 3),
np.linspace(ey[0], ey[-1], 3),
np.linspace(ez[0], ez[-1], 3))
- 使用 3D 散点图绘制 bin 并更改标记的大小以对每个绘制的 bin 中包含的点数进行编码:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x.flatten(), y.flatten(), z.flatten(), s=h.flatten()*50)
这是绘图结果: