I am having issue with getting data on x,y,z axis..below is my code. Is there any issue with the way i have defined range(dx,dy.dz) for different axis.
result=[
As the error suggests, your result
list has to contain integers, and not strings. You can convert it to integers with list comprehension:
result = [[int(i) for i in sublist] for sublist in result]
Or, better yet, you can use np.array
:
import numpy as np
result = np.array(result, dtype=np.int)
Update:
As bar3d
documentation (and example) suggest, ipos
arrays should hold the positions of bars; di
arrays should hold the distances between bars. Your xpos
and ypos
lists hold what is called the tick labels. So, you need to change these and then set tick labels of relevant axes to given xpos
and ypos
. According tho the example provided, you can do it in the following way:
xpos, ypos = np.meshgrid(np.arange(5)+0.5, np.arange(7)+0.5)
xpos = xpos.flatten()
ypos = ypos.flatten()
zpos = np.zeros(5*7)
dx = np.ones_like(zpos)
dy = dx.copy()
dz = result.flatten()
xticks=['','10/11/2013','10/12/2013','10/13/2013','10/14/2013','10/15/2013']
yticks=['','A1','C1','G1','M1','M2','M3','P1']
ax1.set_xticklabels(xticks)
ax1.set_yticklabels(yticks)
There are the following issues in your code:
xpos
and ypos
are usually a flatenned meshgrid with the positions of the base of the 3D barszpos
gives the position of the base along the z
axis, which is usually zero unless you want the bars looking like they are flyingxpos
, ypos
and zpos
must have the same flattened shape and must all be 1-D
arraysSince you know the positions for each value you can use a np.arange()
to create the positions xpos
and ypos
, and afterwards set the tick labels.
The example code is:
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
result=[['122', '109', '2343', '220', '19'],
['15', '407', '37', '10', '102'],
['100', '100', '100', '100', '100'],
['113', '25', '19', '31', '112'],
['43', '219', '35', '33', '14'],
['132', '108', '256', '119', '14'],
['22', '48', '352', '51', '438']]
result = np.array(result, dtype=np.int)
fig=plt.figure(figsize=(5, 5), dpi=150)
ax1=fig.add_subplot(111, projection='3d')
xlabels = np.array(['10/11/2013', '10/12/2013', '10/13/2013',
'10/14/2013', '10/15/2013'])
xpos = np.arange(xlabels.shape[0])
ylabels = np.array(['A1','C1','G1','M1','M2','M3','P1'])
ypos = np.arange(ylabels.shape[0])
xposM, yposM = np.meshgrid(xpos, ypos, copy=False)
zpos=result
zpos = zpos.ravel()
dx=0.5
dy=0.5
dz=zpos
ax1.w_xaxis.set_ticks(xpos + dx/2.)
ax1.w_xaxis.set_ticklabels(xlabels)
ax1.w_yaxis.set_ticks(ypos + dy/2.)
ax1.w_yaxis.set_ticklabels(ylabels)
values = np.linspace(0.2, 1., xposM.ravel().shape[0])
colors = cm.rainbow(values)
ax1.bar3d(xposM.ravel(), yposM.ravel(), dz*0, dx, dy, dz, color=colors)
plt.show()
which gives:
you can also use the values
array proportional to dz
:
values = (dz-dz.min())/np.float_(dz.max()-dz.min())