Python 中的 4D 向量可视化
Visualization of 4D vectors in Python
过去曾在此站点上提出过类似问题 - 例如 Representing 4D data in mplot 3D using colormaps or How to make a 4d plot using Python with matplotlib - 但据我所知,none 回答了我的具体问题。
我有以下数据可供使用:
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 的变量: 即 对于 x1
、x2
和 x3
中元素的每个组合 I在y
中有对应的值。
我想知道 Python 中是否有任何优雅的方式来可视化这些数据;我曾想过将 3D 图与颜色映射结合起来,就像我发布的链接中那样,但是在这些帖子中给出的示例中,第 3 个变量 - x3
- 是其他 2 个的函数,而在我的例子中它y
是 x1
、x2
和 x3
的函数。
是否有任何 way/trick 可以在单个图表或尽可能少的图表中实现此目标?
Edit:一个想法可能是绘制例如 11 个颜色图,其中每个颜色图对应一个值 x3
.一个虚拟的例子:
如何实现?
粗略地说,您可以这样做:
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"^{-100}$",r"^{-40}$",r"^{20}$"])
if i >=8:
ax.set_xticklabels([r"^{-100}$",r"^{-40}$",r"^{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()
过去曾在此站点上提出过类似问题 - 例如 Representing 4D data in mplot 3D using colormaps or How to make a 4d plot using Python with matplotlib - 但据我所知,none 回答了我的具体问题。
我有以下数据可供使用:
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 的变量: 即 对于 x1
、x2
和 x3
中元素的每个组合 I在y
中有对应的值。
我想知道 Python 中是否有任何优雅的方式来可视化这些数据;我曾想过将 3D 图与颜色映射结合起来,就像我发布的链接中那样,但是在这些帖子中给出的示例中,第 3 个变量 - x3
- 是其他 2 个的函数,而在我的例子中它y
是 x1
、x2
和 x3
的函数。
是否有任何 way/trick 可以在单个图表或尽可能少的图表中实现此目标?
Edit:一个想法可能是绘制例如 11 个颜色图,其中每个颜色图对应一个值 x3
.一个虚拟的例子:
如何实现?
粗略地说,您可以这样做:
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"^{-100}$",r"^{-40}$",r"^{20}$"])
if i >=8:
ax.set_xticklabels([r"^{-100}$",r"^{-40}$",r"^{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()