2017-05-16 155 views
0

本网站过去曾提出类似问题 - 如Representing 4D data in mplot 3D using colormapsHow to make a 4d plot using Python with matplotlib - 但据我所知,它们都没有解决我的具体问题。Python中4D向量的可视化

我有以下数据在我的处置:

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和的元素的每种组合,我在y中有相应的值。

我想知道是否有任何优雅的方式在Python中可视化这些数据;我曾想过将3D图与颜色映射结合起来,就像在我发布的链接中那样,但是在这些帖子中给出的例子中,第三个变量 - - 是其他2的函数,而在我的情况下,它是y即函数为x1,x2和。

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

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

Multiple color maps

这怎么可能实现?

+0

一种选择是在3D绘制彩色立方体,如提出[在这个问题上(HTTP://计算器的.com /问题/ 40853556/3D-离散热图合matplotlib)。虽然我不确定,但如果这是一个有用的阴谋,请求的人对此非常高兴。你也可以考虑绘制不同颜色的小球等等。一个问题是,这种问题真的很难回答,迫使人们真正猜出什么是合适的。所以我认为你需要想出一个你想要的情节,然后问如何在matplotlib中获得它。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest当你在你的回答中陈述时,确实很难看到那里的任何东西。 –

+0

你明白了我的观点吧?这完全取决于你想要什么,我们不能猜测。 – ImportanceOfBeingErnest

回答

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() 

enter image description here

+0

谢谢@ImportanceOfBeingErnest,这个工程。最后两件事:如何在输出中添加_single_颜色条?你会如何在所有地图的底部('x'轴)和地图左侧('y'轴)添加一个标签? –

+1

我更新了答案。你还需要对数标签的帮助吗? – ImportanceOfBeingErnest

+0

那么这将是伟大的@ImportanceOfBevenErnest!但也许不是整个标签,而是来自'x1'和'x2'的第一,中间和最后一个值。 –