Python 是否可以在matplotlib中叠加三维条形图?
基本上是这个的3d版本: 虽然我不知道怎么做,因为我使用的是Axis 3dPython 是否可以在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
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
可能会影响这一点……我不知道。所有的条都是白色的,带有黑色的轮廓,每行都用不同的颜色填充。