2

我很努力,但我在这里坚持使用 matplotlib。请忽略,mpl 文档对我来说有点混乱。我的问题涉及以下内容:

  1. D我用函数绘制了一个对称的 n*n 矩阵matshow。这样可行。

  2. 我想做同样的事情,只是(n)项的顺序不同D

    D = [:,neworder]
    D = [neworder,:]
    

现在,我如何让滴答声重现这个新订单,最好另外使用MaxNLocator

据我所理解...

set_xticklabels按顺序为刻度分配标签,与刻度的设置位置无关?! set_xticks(mpl docs: 'Set the x ticks with list of ticks') 在这里我真的不确定它是做什么的。有人可以准确解释吗?我不知道,这些功能对我的情况是否有帮助。使用常见的 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)为刻度修饰符。例如,neworder = [9 8 4 7 2 6 3 0 1 5]我得到的是这个
正确的顺序,但不正确的刻度 标签的顺序是正确的,但刻度不正确。标签应该独立地显示正确的元素,与刻度线的设置位置无关。那么错误在哪里呢?

4

2 回答 2

1

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

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

编辑: 请注意,这些命令必须 matshow. 这似乎是matshowplot例如,不显示这种行为)的一个怪癖。也许它与 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

Edit2: 您问题的下一部分与设置最大刻度数有关。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()
于 2013-10-29T15:22:52.233 回答
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)
于 2013-10-29T11:51:55.263 回答