本质上是这个的3d版本:Plot two histograms at the same time with matplotlib
虽然我不知道怎么做,因为我用的是三维轴
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
中的高位条中),因此我建议将较小的条形图降低透明度,并使较高的条形图更透明,如下所示:但是,这会产生一个丑陋且不必要的结果,即
z==0
处的某些面似乎在z>0
处的面前面渲染。它可能特定于正在使用的后端:我从ipython
与Qt4Agg后端一起运行这个。这也允许我在绘图中旋转,在这种情况下,很明显这种方法存在致命的渲染问题。下面是一幅静止图像:你可以在左边的第二个条上看到一个零级的补丁,在这个条后面,这个条好像在条的顶部。显然不是你(或任何人)需要的。在
经过一段时间的实验(以及来自this answer的有用提示),我意识到{}在同时绘制多个条形图时是有缺陷的。解决方法很简单:使用循环逐个创建每个条形图,问题(几乎完全)就消失了:
^{pr2}$当用一个交互式后端来旋转这个绘图时,很明显它的行为几乎完美(尽管从某些观察方向来看仍然有一些小问题)。这是一个来自固定解决方案的静物:
最后,请注意,即使没有渲染问题,也不容易理解这种重叠的条形图。你在问题中链接到的2d案例可以不受影响,因为这两个凸起是明显分开的。如果它们有巨大的重叠,那么情节就更难理解了。我建议考虑其他可视化方法,例如将每个条形图切割成两个(每个条形图都有一个垂直平面图),并在每个位置并排绘制两组
z
数据。在相关问题 更多 >
编程相关推荐