Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在matplotlib中叠加三维条形图?_Python_Numpy_Matplotlib_Mplot3d - Fatal编程技术网

Python 是否可以在matplotlib中叠加三维条形图?

Python 是否可以在matplotlib中叠加三维条形图?,python,numpy,matplotlib,mplot3d,Python,Numpy,Matplotlib,Mplot3d,基本上是这个的3d版本: 虽然我不知道怎么做,因为我使用的是Axis 3d from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np kets = ["|00>","|01>","|10>","|11>"] #my axis labels fig = plt.figure() ax1 = fig.add_subplot(111,projecti

基本上是这个的3d版本:

虽然我不知道怎么做,因为我使用的是Axis 3d

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

kets = ["|00>","|01>","|10>","|11>"] #my axis labels

fig = plt.figure()
ax1  = fig.add_subplot(111,projection = '3d')

xpos = [0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3]
xpos = [i+0.25 for i in xpos]
ypos = [0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
ypos = [i+0.25 for i in ypos]
zpos = [0]*16

dx    = 0.5*np.ones(16)
dy    = 0.5*np.ones(16)
dz    = [1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0]
dz2   = [0.2*i for i in dz] # to superimpose dz

ticksx = np.arange(0.5,4,1)
ticksy = np.arange(0.6,4,1)

ax1.bar3d(xpos, ypos, zpos, dx , dy ,dz,  color = '#ff0080', alpha = 0.5)

ax1.w_xaxis.set_ticklabels(kets)
ax1.w_yaxis.set_ticklabels(kets)
ax1.set_zlabel('Coefficient')

plt.xticks(ticksx,kets)
plt.yticks(ticksy,kets)

plt.show()

您已经解决了一半的问题,因为第一个棘手的问题是使用
alpha=0.5将条形图设置为半透明。不过还有一个更微妙的问题需要注意

第一个简单的尝试是将对
bar3d
的调用复制到另一个数据集。这应该是可行的,而且在某种程度上是可行的。您的条形图彼此完全重叠(在
dz2
中,非零都包含在
dz
中的高位条形图中),因此我建议减小较小条形图的透明度,使较高条形图更透明,如下所示:

# less transparent
ax1.bar3d(xpos, ypos, zpos, dx , dy ,dz,  color = '#ff0080', alpha = 0.3)
# use dz2, fully opaque, and bluish
ax1.bar3d(xpos, ypos, zpos, dx , dy ,dz2,  color = '#008080', alpha = 1)
但是,这会产生一个丑陋且不希望出现的结果,即
z==0
处的某些面似乎呈现在
z>0
处的面之前。它可能特定于正在使用的后端:我正在使用Qt4Agg后端从
ipython
运行它。这也允许我围绕绘图旋转,在这种情况下,显然这种方法存在致命的渲染问题。这是一幅静止图像:

你可以在左边的第二个横条上看到,横条后面的一个零级补丁似乎位于横条顶部补丁的前面。显然不是你(或任何人)所需要的

经过一点实验(以及来自的一个有用提示),我意识到当同时绘制多个条形图时,
bar3d
简直是个错误。解决方法很简单:使用循环逐个创建每个条形图,问题(几乎完全)就会消失:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

kets = ["|00>","|01>","|10>","|11>"] #my axis labels

fig = plt.figure()
ax1  = fig.add_subplot(111,projection = '3d')

xpos = [0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3]
xpos = [i+0.25 for i in xpos]
ypos = [0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
ypos = [i+0.25 for i in ypos]
zpos = [0]*16

dx    = 0.5*np.ones(16)
dy    = 0.5*np.ones(16)
dz    = [1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0]
dz2   = [0.2*i for i in dz] # to superimpose dz

ticksx = np.arange(0.5,4,1)
ticksy = np.arange(0.6,4,1)

# only change here:
# new loop, changed alphas and a color
for k in range(len(xpos)):
    ax1.bar3d(xpos[k], ypos[k], zpos[k], dx[k] , dy[k] ,dz[k],  color = '#ff0080', alpha = 0.3)
    ax1.bar3d(xpos[k], ypos[k], zpos[k], dx[k] , dy[k] ,dz2[k],  color = '#008080', alpha = 1)


ax1.w_xaxis.set_ticklabels(kets)
ax1.w_yaxis.set_ticklabels(kets)
ax1.set_zlabel('Coefficient')

plt.xticks(ticksx,kets)
plt.yticks(ticksy,kets)

plt.show()
当使用交互式后端旋转此绘图时,很明显它的行为几乎完美(尽管在某些查看方向上仍然存在小故障)。下面是固定解决方案中的一个静止状态:


最后,请注意,即使没有渲染故障,也很难理解这种重叠条形图。您在问题中链接到的2d案例可以不受影响,因为两个凸起明显分开。如果它们有巨大的重叠,那么情节就更难理解了。我建议考虑其他的可视化方法,例如将每个条切割成两个(每个都有一个垂直平面),并在每个位置并排绘制两组<代码> z <代码>数据。

谢谢。有没有关于如何切割的建议?@M.Vasalakis作为第一次尝试,我会将两个数据集的
xpos
ypos
移动+-0.25,同时更改
dx
dy
(取决于你选择的
xpos/ypos
到0.25。我试过了,但它看起来更糟。肯定有某种缺陷,因为深度感知变得很奇怪。@M.Vasalakis我恐怕只能确认。我试过玩弄绘图顺序和其他东西,没法让它变得更好。也许玩弄zorder
可能会影响这一点……我不知道。所有的条都是白色的,带有黑色的轮廓,每行都用不同的颜色填充。