在matplotlib中创建高度为0的透明色条

4

我有一个显示两个地区网络带宽的三维条形图。我想在matplotlib中将高度为0的条形设置为透明。但在我的输出中,它们会形成高度为0的正方形颜色块。

我该如何实现呢?

代码:

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

data = np.array([
[1000,200],
[100,1000],
])

column_names = ['','Oregon','', 'Ohio','']
row_names = ['','Oregon','', 'Ohio']

fig = plt.figure()
ax = Axes3D(fig)

lx= len(data[0])            # Work out matrix dimensions
ly= len(data[:,0])

xpos = np.arange(0,lx,1)    # Set up a mesh of positions
ypos = np.arange(0,ly,1)
xpos, ypos = np.meshgrid(xpos+0.25, ypos+0.25)

xpos = xpos.flatten()   # Convert positions to 1D array
ypos = ypos.flatten()
zpos = np.zeros(lx*ly)

dx = 0.5 * np.ones_like(zpos)
dy = dx.copy()
dz = data.flatten()

cs = ['r', 'g'] * ly

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color=cs)

ax.w_xaxis.set_ticklabels(column_names)
ax.w_yaxis.set_ticklabels(row_names)
ax.set_zlabel('Mb/s')

plt.show()
1个回答

3

bar3d的文档中,有一个可以设置透明度的alpha参数,但它略微隐藏在**kwargs中,可从mpl_toolkits.mplot3d.art3d.Poly3DCollection获得。

然而,目前还没有为每个单独的条形图提供一组alpha值的可能性,例如对于color键。因此,您需要使用掩码将透明和不透明的部分分开绘制。

# needs to be an array for indexing
cs = np.array(['r', 'g', 'b'] * ly)

# Create mask: Find values of dz with value 0
mask = dz == 0

# Plot bars with dz == 0 with alpha
ax.bar3d(xpos[mask], ypos[mask], zpos[mask], dx[mask], dy[mask], dz[mask],
         color=cs[mask], alpha=0.2)
# Plot other bars without alpha
ax.bar3d(xpos[~mask], ypos[~mask], zpos[~mask], dx[~mask], dy[~mask], dz[~mask],
         color=cs[~mask])

这将给出:

输入图片描述


非常感谢您的回答。请问您是如何调整图形的大小的?我的意思是当我使用plt.savefig()保存绘图时,我的z轴标签会被裁切掉。 - Leolime
1
我手动保存了这个图形。如果你想用程序保存,可以在 plt.savefig() 之前尝试使用 plt.tight_layout() - gehbiszumeis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接