'重新梳理' /适应matshow矩阵图的刻度

时间:2013-10-29 10:42:30

标签: python matplotlib

我努力了,但我在这里遇到了matplotlib。请忽略,mpl文档对我来说有点混乱。我的问题涉及以下问题:

  1. 我绘制了具有D函数的对称n * n矩阵matshow。这很有效。

  2. 我想做同样的事情,只是D

    中的(n)个项目的顺序不同
    D = [:,neworder]
    D = [neworder,:]
    
  3. 现在,如何让刻度重现此新订单,最好再使用MaxNLocator

    据我了解......

    set_xticklabels按顺序为滴答分配标签,与滴答的设置位置无关?! set_xticks(mpl docs:'设置带刻度列表的x刻度')这里我真的不确定它是做什么的。有人可以解释一下吗?我不知道,这些功能是否对我的情况有帮助。也许甚至在使用常见的xy情节和matshow之间存在差异。

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax = fig.gca()
    
    D = np.arange(100).reshape(10,10)
    
    neworder = np.arange(10)
    np.random.shuffle(neworder)
    
    D = D[:,neworder]
    D = D[neworder, :]
    
    # modify ticks somehow...
    
    ax.matshow(D)
    plt.show()
    

    参考保罗的回答,我想我试过像这样的人。使用neworder定义位置并将其用于标签,我添加了plt.xticks(neworder, neworder)作为tick修饰符。例如neworder = [9 8 4 7 2 6 3 0 1 5]我得到的就是这个  correct order, but incorrect ticks 标签的顺序是正确的,但不是。标签应独立显示正确的元素,而其中设置了刻度。那么错误在哪里?

2 个答案:

答案 0 :(得分:1)

我认为您要做的是在新图上设置标签以显示值的重新排列顺序。是对的吗?如果是这样,您希望保持勾选位置,但更改标签

plt.xticks(np.arange(0,10), neworder)
plt.yticks(np.arange(0,10), neworder)

编辑:请注意,必须在 matshow之后发出这些命令。这似乎是matshow的一个怪癖(plot没有显示此行为,例如)。也许它与plt.matshow文档中的这一行有关:

  

由于:func:matshow试图将数字宽高比设置为     其中一个数组,如果你提供了一个已经的数字     现有的人物,可能会发生奇怪的事情。

最安全的方法是在不先创建数字的情况下发出plt.matshow(D),然后使用plt.xticksplt.yticks进行调整。

您的问题还会询问set_ticks和相关的axis方法。使用这些工具可以完成同样的事情,再次发布matshow之后:

ax = plt.gca()
ax.xaxis.set_ticks(np.arange(0,10))  # turn on all tick locations
ax.xaxis.set_ticklabels(neworder)    # use neworder for labels

编辑2:问题的下一部分与设置最大刻度数有关。 20需要一个新的例子。对于我们的例子,我将设置最大值。 2点的刻度:

ax = plt.gca()
ax.xaxis.set_major_locator(plt.MaxNLocator(nbins=3))  # one less tick than 'bin'
tl = ax.xaxis.get_ticklocs()                          # get current tick locations
tl[1:-1] = [neworder[idx] for idx in tl[1:-1]]        # find what the labels should be at those locs
ax.xaxis.set_ticklabels(tl)                           # set the labels
plt.draw()

答案 1 :(得分:0)

你走在正确的轨道上。 plt.xticks命令就是您所需要的。

您可以使用以下命令在每个位置指定xtick位置和标签。     labelPositions = arange(len(D))     newLabels = ['z','y','x','w','v','u','t','s','q','r']     plt.xticks(labelPositions,newLabels)

您还可以为labelPositions指定任意顺序,因为它们将根据向量中的值进行分配。

labelPositions = [0,9,1,8,2,7,3,6,4,5]
newLabels = ['z','y','x','w','v','u','t','s','q','r']
plt.xticks(labelPositions,newLabels)