无法覆盖Matplotlib format_coord

时间:2018-07-12 14:32:56

标签: python-2.7 numpy matplotlib scipy

我正在创建一个等高线图,其中V值的列表作为x轴,T值的列表作为y轴(V和T值是小数点后两位的浮点数,但所有当然排序)。我创建了一个数据矩阵,并在其中填充了与V-T坐标相关的数据。

如果有帮助,那么轮廓图将如下所示:

enter image description here

我正在尝试覆盖format_coord方法,以便在光标移动时也显示数据以及x-y(V-T)坐标

我无法在此处发布所有代码,但以下是相关部分:

fig= Figure()
a = fig.add_subplot(111)

contour_plot = a.contourf(self.pre_formating[0],self.pre_formating[1],datapoint) #Plot the contour on the axes

def fmt(x, y):
    '''Overrides the original matplotlib method to also display z value when moving the cursor
    '''
    V_lst = self.pre_formating[0] #List of V points
    T_lst = self.pre_formating[1] #List of T points
    Zflat = datapoint.flatten()   #Flatten out the data matrix
    print 'first print line'
    # get closest point with known v,t values
    dist = distance.cdist([x,y],np.stack([V_lst, T_lst],axis=-1))
    print 'second print line'
    closest_idx = np.argmin(dist) 
    z = Zflat[closest_idx]
    return 'x={x:.5f}  y={y:.5f}  z={z:.5f}'.format(x=x, y=y, z=z)
a.format_coord = fmt

上面的代码不起作用(当我移动光标时,什至没有显示x,y值。“第一条打印线”被打印,但是“第二条打印线”没有被打印,所以我认为问题出在是“ dist”行)。

但是当我将'dist'行更改为

dist = np.linalg.norm(np.vstack([V_lst - x, T_lst - y]), axis=0)

对于37x37矩阵,一切正常(显示x,y,数据),但对于37x46矩阵(37T,46V)却无效,我也不知道为什么。 我应该怎么做才能使代码正常工作? 谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

大家好,我发现了如何解决这个问题,以防有人需要。有两个问题: 1 /在生成V,T坐标列表时我错了 2 / distance.cdist需要2d数组形式的所有内容。 所以这是最终的解决方案:

def fmt(x, y):
    '''Overrides the original matplotlib method to also display z value when moving the cursor
    '''
    V_lst = self.pre_formating[0] #List of V points
    T_lst = self.pre_formating[1] #List of T points
    coordinates = [[v,t] for t in T_lst for v in V_lst] # List of coordinates (V,T)
    Zflat = datapoint.flatten()   #Flatten out the data matrix
    # get closest point with known v,t values
    dist = distance.cdist([[x,y]],coordinates)
    closest_idx = np.argmin(dist)
    z = Zflat[closest_idx]
    return 'x={x:.5f}  y={y:.5f}  z={z:.5f}'.format(x=x, y=y, z=z)