【问题标题】:Visualization of 4D vectors in PythonPython 中 4D 向量的可视化
【发布时间】:2017-10-15 20:07:22
【问题描述】:

过去曾在此站点上提出过类似的问题 - 例如 Representing 4D data in mplot 3D using colormapsHow to make a 4d plot using Python with matplotlib - 但据我发现,它们都没有回答我的具体问题。

我有以下数据可供使用:

x1 = numpy.logspace(-100, 20, num=13, base=2) 
x2 = numpy.logspace(-100, 20, num=13, base=2)
x3 = numpy.logspace(-5, 5, num=11, base=10)

y = [...]

这样就形成了 2 个具有 13 个元素的向量和一个具有 11 个元素的向量。那么y 是一个13*13*11 的变量:对于x1x2x3 中的每个元素组合,我在y 中有一个对应的值。

我想知道 Python 中是否有任何优雅的方式来可视化这些数据;我曾想过将 3D 绘图与我发布的链接中的颜色映射相结合,但是在这些帖子中给出的示例中,第三个变量 - x3 - 是另外两个的函数,而在我的情况下是 @ 987654333@ 是 x1x2x3 的函数。

是否有任何方法/技巧可以在单个图表或尽可能少的图表中实现这一目标?

编辑:一个想法可能是绘制例如 11 个颜色图,其中每个颜色图对应于 x3 的值。一个虚拟的例子:

如何做到这一点?

【问题讨论】:

  • 一种选择是在 3D 中绘制彩色立方体,如 in this question 所示。虽然我不确定,如果这是一个有用的情节,询问的人对此很高兴。您还可以考虑绘制不同颜色左右的小球。一个问题是,这类问题真的很难回答,并迫使人们实际猜测什么可能是合适的。所以我觉得你需要想出一种你想要的情节,然后问如何在matplotlib中获取。
  • @ImportanceOfBeingErnest 正如您在回答中所说,确实很难在其中看到任何东西。
  • 你明白我的意思吧?这完全取决于您想要什么,我们无法猜测。
  • 我认为我最初的想法是行不通的,因为它基本上与您对所链接问题的回答相对应。我已经更新了我的问题以提供更准确的信息。

标签: python matplotlib visualization 4d


【解决方案1】:

粗略地说,你可以这样做:

import matplotlib.pyplot as plt
import numpy as np

x1 = np.logspace(-100, 20, num=13, base=2) 
x2 = np.logspace(-100, 20, num=13, base=2)
x3 = np.logspace(-5, 5, num=11, base=10)
y = np.random.rand(len(x3), len(x2), len(x1))

fig, axes = plt.subplots(ncols=4, nrows=3)
fig.subplots_adjust(right=0.8, wspace=0.25, hspace=0.05)
for i, ax in enumerate(axes.flatten()):
    if i < len(x3):
        ax.set_xticks([0,6,12] )
        ax.set_yticks([0,6,12] )
        ax.set_yticklabels([]); ax.set_xticklabels([])
        im = ax.imshow(y[i, :,:], vmin=0, vmax=1, aspect="equal")
        if i % 4 == 0:
            ax.set_yticklabels([r"$2^{-100}$",r"$2^{-40}$",r"$2^{20}$"])
        if i >=8:
            ax.set_xticklabels([r"$2^{-100}$",r"$2^{-40}$",r"$2^{20}$"])       
    else:
        ax.axis("off")

nax = fig.add_subplot(111, frame_on=False)
nax.set_xticks([])
nax.set_yticks([])
nax.set_xlabel('xlabel', labelpad=20)
nax.set_ylabel('ylabel', labelpad=40)

cbar_ax = fig.add_axes([0.85, 0.15, 0.02, 0.7])
fig.colorbar(im, cax=cbar_ax)

plt.show()

【讨论】:

  • 谢谢@ImportanceOfBeingErnest,这行得通。最后两件事:如何在输出中添加 single 颜色条?如何在所有地图的底部(x 轴)和地图的左侧(y 轴)添加标签?
  • 我更新了答案。您还需要对数标注方面的帮助吗?
  • 那太好了@ImportanceOfBeingErnest!但也许不是整个标签,而是来自x1x2 的第一个、中间和最后一个值。
  • 我认为这里最好是手动添加它们,否则 imshow 绘图的线性和对数缩放可能会出现一些问题。查看更新的答案。
  • ax.set_xticklabels(labels, rotation=45)
猜你喜欢
  • 2019-01-21
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多