2

私は一生懸命努力しましたが、ここでmatplotlibにこだわっています。mpl docs は私にとって少し混乱するので、見落としてください。私の質問は次のことに関するものです。

  1. 関数を使用して対称 n*n 行列を描画Dmatshowます。それはうまくいきます。

  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)tick-modifier として追加しました。たとえば、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に発行する必要があることに注意してください。matshowこれは(plotたとえば、この動作を示しません)の癖のようです。おそらく、 plt.matshow ドキュメントの次の行に関連しています。

:func:matshowは図形の縦横比を配列の 1 つに設定しようとするため、既存の図形の番号を指定すると、奇妙なことが起こる可能性があります。

plt.matshow(D)おそらく最も安全な方法は、最初に Figure を作成せずに を発行し、次に と を使用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)

vector の値に基づいて割り当てられるため、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 に答える