8

我正在尝试使用 Matplotlib 中的 bar3d() 在 Python 中创建 3D 条形直方图。

在传递一些数据后,我已经到了可以在屏幕上显示直方图的地步,但我坚持以下几点:

  1. 正确显示轴标签(当前错过了最终(或初始?)刻度标签)
  2. 使每个轴上的刻度(例如,'Mon')要么指向它对应的蓝色条,要么将刻度标签放置在主要刻度标记之间。
  3. 使条形图半透明。

此处上传的情节图片

我已经尝试将几个不同的参数传递给“ax”实例,但没有任何工作可以工作,并且怀疑我误解了要为它提供什么。对于这方面的任何帮助,我将不胜感激。

这是我正在处理的代码示例:

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

#from IPython.Shell import IPShellEmbed
#sh = IPShellEmbed()

data = np.array([
[0,1,0,2,0],
[0,3,0,2,0],
[6,1,1,7,0],
[0,5,0,2,9],
[0,1,0,4,0],
[9,1,3,4,2],
[0,0,2,1,3],
])

column_names = ['a','b','c','d','e']
row_names = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']

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

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

#sh()
ax.w_xaxis.set_ticklabels(column_names)
ax.w_yaxis.set_ticklabels(row_names)
ax.set_xlabel('Letter')
ax.set_ylabel('Day')
ax.set_zlabel('Occurrence')

plt.show()
4

1 回答 1

11

要使条形图半透明,您只需使用 alpha 参数。alpha=0 表示 100% 透明,而 alpha=1(默认)表示 0% 透明。

试试这个,它可以使条形半透明:

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b', alpha=0.5)

关于刻度位置,您可以使用类似这样的方法进行操作(plt.xticks 或 plt.yticks 上的第一个列表包含您想要定位刻度的“值”,第二个列表包含您实际想要调用的内容蜱):

#ax.w_xaxis.set_ticklabels(column_names)
#ax.w_yaxis.set_ticklabels(row_names)

ticksx = np.arange(0.5, 5, 1)
plt.xticks(ticksx, column_names)

ticksy = np.arange(0.6, 7, 1)
plt.yticks(ticksy, row_names)

最后,我得到了这个数字: 在此处输入图像描述

于 2012-02-27T11:39:23.930 回答