Matplotlib 3D条形图:轴问题 [英] Matplotlib 3D Bar chart: axis issue
本文介绍了Matplotlib 3D条形图:轴问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在获取x,y,z轴上的数据时遇到问题.下面是我的代码.我为不同轴定义range(dx,dy.dz)的方式是否有问题.
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()
我遇到以下错误:
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
和ypos
通常是带有3D条形图的底部位置的扁平网格. -
zpos
给出基座沿z
轴的位置,通常为零,除非您希望条看起来像是在飞翔 -
xpos
,ypos
和zpos
必须具有相同的展平形状,并且必须全部为1-D
数组
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
arrays
由于您知道每个值的位置,因此可以使用np.arange()
创建位置xpos
和ypos
,然后设置刻度线标签.
Since 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.
示例代码为:
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()
给出:
您还可以使用与dz
成比例的values
数组:
you can also use the values
array proportional to dz
:
values = (dz-dz.min())/np.float_(dz.max()-dz.min())
这篇关于Matplotlib 3D条形图:轴问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文