2013-12-19 78 views
7

我有一個日誌形狀軸什麼是用計算值替換matplotlib刻度標籤的正確方法?

enter image description here

,我想重新標記軸與價值觀的日誌蜱,而不是值本身

enter image description here

方式我已經做到了這一點與

plt.axes().set_xticklabels([math.log10(x) for x in plt.axes().get_xticks()]) 

但我不知道沒有一個不太複雜的方式來做到這一點。

matplotlib圖表上系統地重新標記刻度的正確用法是什麼?用原始刻度值計算得出的值是多少?

+0

如果你不想使用'Formatter',你可以只使用'plt.xticks(x_ticks, x_ticklabels)'把預先定義的'x_ticklabels'放在預定義的'x_ticks'的每個相應節點上。 – mikey

回答

6

看看Formatter類。除非你在你的蜱中放置文字,否則你幾乎不應該直接使用set_xticklabelsset_yticklabels。這完全取消了你的刻度標籤和你的數據。如果您調整視圖限制,則刻度標籤將保持不變。

在你的情況,格式化已經存在這樣的:

fig, ax = plt.subplots() 
ax.loglog(np.logspace(0, 5), np.logspace(0, 5)**2) 
ax.xaxis.set_major_formatter(matplotlib.ticker.LogFormatterExponent()) 

matplotlib.ticker.LogFormatterExponent doc

一般來說,你可以使用FuncFormatter。有關如何使用FuncFomatter的示例,請參閱matplotlib: change yaxis tick labels其中許多示例都圍繞着SO。

你想,從JoeKington提升正是在評論什麼簡明例如,:

ax.xaxis.set_major_formatter(
    FuncFormatter(lambda x, pos: '{:0.1f}'.format(log10(x)))) 
+0

在附註上,'LogFormatterExponent'有一些怪癖(例如切換到科學記數法以獲得負值)。在這種情況下使用'FuncFormatter'會更好一些。對於OP的引用,'FuncFormatter'需要一個帶有兩個參數的函數:值和它的位置。例如:'FuncFormatter(lambda x,pos:'{:0.1f}'.format(log10(x)))''。 –

+0

用科學記數法而不是整數格式化負指數。另外(更重要的是)我很好奇* matplotlib圖上的ticks重新標記的值,它是根據原始tick值計算得出的值,而不僅僅是存在'Formatter'的情況。 – orome

+0

@JoeKington,很有意思。在回答這個問題時我發現了'LogFormatterExponent'。你知道這種消極行爲的原因嗎? – tacaswell

相關問題