【问题标题】:Plot 3D scatter plot from 3D array从 3D 数组绘制 3D 散点图
【发布时间】:2021-04-07 16:49:03
【问题描述】:

我目前正在尝试使用 3D 数组绘制 3D 散点图。 我在网上找到的关于绘制 3D 散点图的内容看起来像 ax.scatter3D(x, y, z) 其中xyz 都是一维数组。 但是,就我而言,我正在使用 numpy 的 histogramdd 生成一个 shape(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 散点图?

【问题讨论】:

  • 您是否尝试过研究 reshape()?而不是一维数组,为什么不把它做成一个 nx3 维数组,像这样:h.reshape((n,3))。
  • 为什么要从直方图中绘制 3D 散点图是因为我想查看直方图的分布。如果我重塑分布,分布会保留吗?
  • 我想我在这里遗漏了主要思想,告诉我我错在哪里:您有一个 [x,y,z] 形式的点列表,在示例中您有[1,2,4], [4,2,8]... 等等。然后你建立一个 3D 直方图并想要绘制它。我认为问题在于您需要 4 个维度来绘制它(或 3 个维度 + 颜色)。我错了吗?
  • 我实际上总共有 4 个 3d 数组 [1,2,4], [4,2,8]...
  • 我还是不明白,你在 3D 空间中有点,你将这个空间分割成 3x3x3 区域(你基本上把 3D 空间分成 27 个小立方体)。当您构建直方图时,您正在计算每个小立方体内的点数。正如您在结果中看到的那样,大多数立方体内部包含零点,而有些则包含 1 或 3 点。在 3D 散点图中,您可以将立方体的位置绘制为 3D 空间中的一个点,但随后您需要更改其他内容来编码有关立方体中包含的数据点数量的信息。我说的对吗?

标签: python matplotlib plot scatter-plot scatter3d


【解决方案1】:

我会说您需要 4 个维度来绘制您创建的直方图。一种想法可能是使用 3D 散点图来更改标记的大小,以编码有关每个 3D 箱中包含的数据点数量的信息。

这就是我要做的。

  1. 生成 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)
  1. 创建垃圾箱位置的 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))
  1. 使用 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)

这是剧情结果:

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 2016-04-28
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多