Python matplotlib -> 三维柱状图 -> 调整刻度标签位置,透明柱体

8

我正在尝试使用Matplotlib的bar3d()函数在Python中创建一个三维条形直方图。

我已经能够通过传递一些数据将我的直方图显示在屏幕上,但我卡在了以下几点:

  1. 正确显示坐标轴标签(目前少了最后(或起始?)刻度标签)
  2. 使每个坐标轴上的刻度(例如'Mon'的刻度)指向其相应的蓝色条形,或者将刻度标签定位在主要刻度标记之间。
  3. 使条形图半透明。

这里上传了图表的图片image of plot uploaded here

我尝试了向“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()
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中的第一个列表包含你想要定位刻度的“值”,第二个列表包含实际显示在刻度上的内容):

```python plt.xticks([0, 1, 2, 3], ['zero', 'one', 'two', 'three']) ```
#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)

最终,我获得了这张图:enter image description here


嗨,感谢您的建议。我尝试使用alpha参数,但收到以下错误:File "matrix_to_3D_histogram.py", line 43, in ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b', alpha=0.5) TypeError: bar3d() got an unexpected keyword argument 'alpha' - Dman
@Dan 为了测试 matplotlib 的版本,请输入以下命令:import matplotlib; print matplotlib.__version__ - Hooked
嗨,看起来你已经成功地让那个数字看起来像我想要的样子了,太好了,谢谢!我查看了我的Matplotlib版本(因为我使用的是Ubuntu 10.04),默认情况下从synaptic安装的是0.99.1.1版本。我刚刚尝试从源代码安装Matplotlib 1.1.0版本,但Python仍然认为我安装的是0.99.1.1版本。我需要卸载旧版本或更改某个路径变量吗? - Dman
我不是很确定... 我会先删除旧版本,然后看看会发生什么!祝你好运... - carla
嗨,我有一个数据集,其中有三种类型的代码 - 比如c1、c2和c3。每个代码可以有4种类型的错误,比如b1、b2、b3和b4。我想绘制每种代码在过去5周内每个类别中此类错误的数量。例如,第一周c1类型的代码为(b1,b2,b3,b4) (12,34,13,67),第二周为(11,123,3,21),以此类推。我能用3D柱状图来绘制这些数据吗? - SexyBeast
显示剩余2条评论

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