我努力了,但我在这里遇到了matplotlib。请忽略,mpl文档对我来说有点混乱。我的问题涉及以下问题:
我绘制了具有D
函数的对称n * n矩阵matshow
。这很有效。
我想做同样的事情,只是D
D = [:,neworder]
D = [neworder,:]
现在,如何让刻度重现此新订单,最好再使用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]
我得到的就是这个
标签的顺序是正确的,但不是。标签应独立显示正确的元素,而其中设置了刻度。那么错误在哪里?
答案 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.xticks
和plt.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)