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=[['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']]
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.dates as dates
def format_date(x, pos=None):
return dates.num2date(x).strftime('%m/%d/%Y')
fig=plt.figure()
ax1=fig.add_subplot(111,projection='3d')
xpos=[10/11/2013,10/12/2013,10/13/2013,10/14/2013,10/15/2013]
ypos=['A1','C1','G1','M1','M2','M3','P1']
zpos=result
dx=[5]
dy=[7]
dz=[7]
ax1.w_xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
ax1.bar3d(xpos,ypos,zpos,dx,dy,dz,color='#00ceaa')
plt.show()
I am getting below error:
TypeError Traceback (most recent call last)
<ipython-input-45-02cd8e7ee228> in <module>()
18 dz=[17]
19 ax1.w_xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
---> 20 ax1.bar3d(xpos,ypos,zpos,dx,dy,dz,color='#00ceaa')
21 plt.show()
C:\Users\Andalib\Anaconda\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py in bar3d(self, x, y, z, dx, dy, dz, color, zsort, *args, **kwargs)
2316 maxx = max(xi + dxi, maxx)
2317 miny = min(yi, miny)
-> 2318 maxy = max(yi + dyi, maxy)
2319 minz = min(zi, minz)
2320 maxz = max(zi + dzi, maxz)
TypeError: cannot concatenate 'str' and 'int' objects
There are the following issues in your code:
xpos
andypos
are usually a flatenned meshgrid with the positions of the base of the 3D barszpos
gives the position of the base along thez
axis, which is usually zero unless you want the bars looking like they are flyingxpos
,ypos
andzpos
must have the same flattened shape and must all be1-D
arraysSince you know the positions for each value you can use a
np.arange()
to create the positionsxpos
andypos
, and afterwards set the tick labels.The example code is:
which gives:
you can also use the
values
array proportional todz
:As the error suggests, your
result
list has to contain integers, and not strings. You can convert it to integers with list comprehension:Or, better yet, you can use
np.array
:Update:
As
bar3d
documentation (and example) suggest,ipos
arrays should hold the positions of bars;di
arrays should hold the distances between bars. Yourxpos
andypos
lists hold what is called the tick labels. So, you need to change these and then set tick labels of relevant axes to givenxpos
andypos
. According tho the example provided, you can do it in the following way: