2013-10-29 18 views
2

我努力了,但是我在這裏遇到了matplotlib。請忽略,mpl文檔對我有點困惑。我的問題涉及:'重新排序'/適應ticks的matshow矩陣圖

  1. 我畫一個對稱的N * N矩陣Dmatshow功能。這樣可行。

  2. 我想要做同樣的事情,只是順序不同的(第n)項D

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

現在,我該如何使蜱重現此neworder,最好使用另外MaxNLocator

據我瞭解...

set_xticklabels通過訂單分配獨立的,其中蜱設置標籤的蜱,? set_xticks(mpl文檔:'設置與滴答清單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-modifier。例如與neworder = [9 8 4 7 2 6 3 0 1 5]我得到的是這個
correct order, but incorrect ticks 標籤的順序是正確的,但滴答不是。標籤應獨立顯示正確的元素,獨立於,其中設置了滴答。那麼錯誤在哪裏?

回答

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 

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() 
+0

問題是,它給了我5個刻度線(像圖片上的x軸)。在處理[0,1,2,3,4,5,6,7,8,9]時,記號設置爲[0,2,4,6,8],顯示新訂單[1:5]作爲標籤。我需要它顯示10個刻度,或者如果是5,然後將它標記爲neworder [0,2,4,6,8] ... – embert

+0

@talkturkey:從頭開始學習示例時,我會看到相同的行爲。在ipython中,直到我發出'plt.draw()'('plt.show()'不會剪切它),我纔看到實際的地圖。然後需要用上述兩個命令重新勾選這些軸。編輯我的答案來反映這一點。你能證實你的作品嗎? – spinup

+0

第一個問題已解決。事實上,我只是把剔修改爲_before_'matshow'。現在可以將它與定位器結合起來, G。最多20個滴答聲顯示_correct_標籤? – embert

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)