2012-10-16 21 views
4

下面是一些显示3D直方图的代码。但是,右下角的跟踪器不能正确显示鼠标的位置。3D直方图上的错误跟踪器值

跟踪器说x = e而鼠标明显超过c。跟踪器说z = 01-02。那是怎么回事? (z跟踪器值似乎由y轴格式器控制。)

代码如何修复?

import matplotlib.pyplot as plt 
import numpy as np 
import mpl_toolkits.mplot3d.axes3d as axes3d 
import matplotlib.dates as mdates 
import matplotlib.ticker as ticker 
import datetime as dt 
import random 

np.random.seed(0) 
fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection = '3d') 

cmap = plt.get_cmap('RdBu') 
event_labels = 'abcdefghij' 
events = range(len(event_labels)) 
label_map = dict(zip(events,event_labels)) 

dates = mdates.drange(dt.datetime(2012, 10, 1), 
         dt.datetime(2012, 10, 10), 
         dt.timedelta(days = 1)) 
events_list = [(random.choice(dates), random.choice(events)) 
       for i in range(50)] 

event_array, date_array = zip(*events_list) 

# Much of the code below comes from 
# http://matplotlib.org/examples/mplot3d/hist3d_demo.html 
hist, xedges, yedges = np.histogram2d(date_array, event_array) 

elements = (len(xedges)-1) * (len(yedges)-1) 
xpos, ypos = np.meshgrid(xedges[:-1]+0.25, yedges[:-1]+0.25) 

xpos = xpos.flatten() 
ypos = ypos.flatten() 
zpos = np.zeros(elements) 
dx = 0.5 * np.ones_like(zpos) 
dy = dx.copy() 
dz = hist.flatten() 

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

xfmt = ticker.FuncFormatter(lambda x, pos: label_map[int(x)]) 
yfmt = mdates.DateFormatter('%m-%d') 
zfmt = ticker.FuncFormatter(lambda z, pos: str(z)) 
ax.w_xaxis.set_major_formatter(xfmt) 
ax.w_yaxis.set_major_formatter(yfmt) 
ax.w_zaxis.set_major_formatter(zfmt) 

ax.fmt_xdata = xfmt 
ax.fmt_ydata = yfmt 
ax.fmt_zdata = zfmt 
plt.show() 

enter image description here

回答

1

首先,你可能会改变你的x轴格式,目前它扔了很多例外出来解释当鼠标到图表的边缘:

你可能更改此设置:

xfmt = ticker.FuncFormatter(lambda x, pos: label_map[int(x)]) 

为了这样的事情:

def xformatter(x,pos): 
    try: 
     val = label_map[int(x)] 
    except: 
     val = "None" 
    return val 
... 
xfmt = ticker.FuncFormatter(xformatter) 

接下来,我发现如果你把在\Lib\site-packages\mpl_toolkits\mplot3d\axis3d.py

看看线320你会发现这个错字有实际mpl_toolkits.mplot3d

错误:

class YAxis(Axis): 
    def get_data_interval(self): 
     'return the Interval instance for this axis data limits' 
     return self.axes.xy_dataLim.intervaly 

class ZAxis(Axis): 
    def get_data_interval(self): 
     'return the Interval instance for this axis data limits' 
     return self.axes.zz_dataLim.intervalx 

请注意0​​应该是:self.axes.zz_dataLim.intervalz

可能需要报告这些专业版给开发人员带来麻烦。

+0

感谢您的建议!是的,在'xfmt'中捕获KeyErrors肯定是一个改进。我试着编辑'ZAxis.get_data_interval'来使用'intervalz'而不是'intervalx',但奇怪的'z'-跟踪器行为仍然存在。 – unutbu

+1

不客气。看起来在图形代码中还有另一个问题,看起来像是在构建坐标轴时调用'zAxis'格式化程序,但从不在'MouseMove'上。虽然'xAxis'格式化程序被调用来构建轴和'MouseMove'。非常奇特。 –