2012-11-16 66 views
7

我試圖改變在x軸上的刻度值的imshow陰謀使用下面的代碼:當使用imshow時自定義刻度自動調整?

import matplotlib.pyplot as plt 
import numpy as np 

def scale_xaxis(number): 
    return(number+1001) 

data = np.array([range(10),range(10,20)]) 
fig = plt.figure(figsize=(3,5)) 
ax = fig.add_subplot(111) 
ax.imshow(data,aspect='auto') 
ax.autoscale(False) 
xticks = ax.get_xticks() 
ax.xaxis.set_ticklabels(scale_xaxis(xticks)) 
plt.savefig("test.png") 

Resulting image http://ubuntuone.com/2Y5ujtlEkEnrlTcVUxvWLU

然而,X-蜱重疊,並具有「非圓」值。有沒有辦法讓matplotlib自動執行此操作?通過使用set_ticklabels或其他方式?

回答

6

還應考慮使用extent(doc)matplotlib做的所有關於如何把刻度標記標籤,並添加任意的變速思路:

data = np.array([range(10),range(10,20)]) 
fig = plt.figure(figsize=(3,5)) 
ax = fig.add_subplot(111) 
ax.imshow(data,aspect='auto',extent=[10000,10010,0,1]) 

如果你一定要做到這我的手,你可能會更好的設置axisformatterlocator以得到你想要的(doc)

import matplotlib.pyplot as plt 
import numpy as np 

def scale_xaxis(number): 
    return(number+1001) 

def my_form(x,pos): 
    return '%d'%scale_xaxis(x) 

data = np.array([range(10),range(10,20)]) 
fig = plt.figure(figsize=(3,5)) 
ax = fig.add_subplot(111) 
ax.imshow(data,aspect='auto') 
ax.autoscale(False) 
ax.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(int(2))) 
ax.xaxis.set_major_formatter(matplotlib.ticker.FuncFormatter(my_form)) 

的定位需要設置,以確保蜱根本不接受非整數位置,其由格式化然後強行投以整數(這將讓他們在錯誤的地方)

相關問題:

matplotlib: format axis offset-values to whole numbers or specific number

removing leading 0 from matplotlib tick label formatting

+0

這適用於特定的問題,並解答日我問了一個問題(回想起來,我發現我說的很差)。但它並沒有真正解決我的主要問題:我需要一些方法來使matplotlib選擇合適的刻度數。 例如,如果返回(數字+ 1001)返回(數字+ 10001)。那我怎麼能讓matplotlib自動選擇正確數量的刻度以避免重疊? 我應該接受答案並提出一個新問題,還是應該編輯此問題? – Magnus

+0

@Magnus查看編輯 – tacaswell

+0

使用'extent'解決了它,謝謝! – Magnus

2

有幾種方法可以做到這一點。

您可以:

  1. 通行證在int數組,而不是float數組
  2. 通在格式化字符串
  3. 使用數組的定製蜱格式

的最後一個選項對於這樣簡單的事情來說是過分的。

作爲第一選擇的一個例子,你會改變你的scale_xaxis功能是這樣的:

def scale_xaxis(numbers): 
    return numbers.astype(int) + 1001 

注意你一起離開ax.get_xticks是numpy的陣列,而不是單一的值。因此,我們需要做number.astype(int)而不是int(number)

或者,我們可以返回一系列格式化的字符串。 set_xticklabels實際上將字符串的序列:

def scale_xaxis(numbers): 
    return ['{:0.0f}'.format(item + 1001) for item in numbers] 

使用自定義格式蜱是矯枉過正這裏,所以我會離開它的那一刻。不過,在正確的情況下它非常方便。