2011-04-02 24 views
20

我在matplotlib中的軸標籤重疊刻度標籤時遇到了問題。我嘗試通過應用轉換或通過調用set_y()來「手動」重新定位標籤,但無濟於事。在matplotlib的Axes3D中調整標籤的位置

下面是重現該問題的一個片段:

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure() 
figure.subplots_adjust(bottom=0.25, top=0.75) 
axes = figure.gca(projection='3d') 
xLabel = axes.set_xlabel('XXX xxxxxx xxxx x xx x') 
yLabel = axes.set_ylabel('YY (y) yyyyyy') 
zLabel = axes.set_zlabel('Z zzzz zzz (z)') 
plot = axes.plot([1,2,3],[1,2,3]) 

pyplot.show() 

注意x和y標籤衝突如何與蜱。我可以優雅地解決這個問題嗎?

回答

32

我分享你的無奈做到這一點。我在這裏工作了半個小時,沒有任何進展。該文檔說set_xlabel採用參數labelpad但我得到一個錯誤(AttributeError:未知屬性標籤板)!在xaxis或w_xaxis之後,在事實之後設置它什麼也不做。

這裏的粗解決方法:

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure(figsize=(8,4), facecolor='w') 
ax = figure.gca(projection='3d') 

xLabel = ax.set_xlabel('\nXXX xxxxxx xxxx x xx x', linespacing=3.2) 
yLabel = ax.set_ylabel('\nYY (y) yyyyyy', linespacing=3.1) 
zLabel = ax.set_zlabel('\nZ zzzz zzz (z)', linespacing=3.4) 
plot = ax.plot([1,2,3],[1,2,3]) 
ax.dist = 10 

pyplot.show() 

enter image description here

+6

我發誓你,我嘗試了幾十個解決方法,但是沒有發生我簡單地在標籤的開頭添加換行符!聰明!謝謝 ! – AbsentmindedProfessor 2011-04-05 00:49:38

+0

巧妙(添加換行符)!!! – 2017-01-17 19:29:11

+0

它讓我發瘋,直到我遇到你簡單但非常聰明的方法。謝謝... – Memin 2017-10-13 21:32:19

3

作爲一種設計實踐,轉換後的文字不是很清晰。 我建議你爲你的軸使用標籤,也許顏色編碼。 這是你如何在matplotlib

import matplotlib 
matplotlib.use("TKAGG") 
import matplotlib.pyplot as pyplot 
import mpl_toolkits.mplot3d 

figure = pyplot.figure() 
figure.subplots_adjust(bottom=0.25, top=0.75) 
axes = figure.gca(projection='3d') 
xLabel = axes.set_xlabel('X', fontsize=14, fontweight='bold', color='b') 
yLabel = axes.set_ylabel('Y',fontsize=14, fontweight='bold', color='r') 
zLabel = axes.set_zlabel('Z',fontsize=14, fontweight='bold', color='g') 


x = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='b') 
y = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='r') 
z = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='g') 

handles, labels = axes.get_legend_handles_labels() 
axes.legend((x,y,z),("XXXXXX","YYYYY","ZZZZZZ"),'best') 


plot = axes.plot([1,2,3],[1,2,3]) 


pyplot.show() 

Image result

+1

顏色編碼並不是一個壞主意,但這是一個學術文章,它必須在B&W印刷品中清晰可見。感謝分享 ! – AbsentmindedProfessor 2011-04-05 00:47:54

13

我真的需要遵循的StackOverflow更頻繁。我是mplot3d的當前維護者。爲什麼通常在常規2D圖中工作的各種技巧不適用於3D圖,這是因爲mplot3d最初是用硬編碼的默認值編寫的。 mplot3d如何計算渲染標籤的角度也存在一些錯誤。

v1.1.0包含幾個修復程序來改善事物的狀態。我修正了軸標籤角度的錯誤計算,並對間距進行了一些調整。對於下一個版本,我想讓3D軸佔用超過默認軸間距,因爲默認設計考慮到了刻度標籤和軸標籤會在軸之外,而mplot3d則不是這種情況。由於間距是由mplot3d中的相對比例決定的,因此在標籤內部有較小的空間可以使標籤更緊密地連接在一起。

至於其他可能的解決方法,請參閱註釋here。 公正的警告,這個私人詞典不是一個永久的解決方案,而是一個必要的罪惡,直到mplot3d的重構完成。

此外,v1.1.0包含許多mplot3d api的更新。請查看修訂後的文檔here

+0

有沒有關於如何訪問和更改self._info的示例?特別是填充? – mab 2013-08-07 14:58:42

+0

^^^^^^^ 查看我的回答 – 2014-11-06 00:12:42

19

在matplotlib的新版本,這是如何做到這一點:

ax.xaxis._axinfo['label']['space_factor'] = 2.8 

看這裏的解釋:

https://github.com/matplotlib/matplotlib/issues/3610

在測試了V1.4,應在版本工作> 1.1我相信。

+2

非常感謝,只有解決方案有效 – fsociety 2014-10-20 19:12:48

+1

我有1.5.1在Jupyter中運行,這個表達式沒有明顯的效果。 – user5920660 2017-11-30 22:32:28

3

添加這對於每個軸,適應數:

axes.yaxis.labelpad=30 

它是由亞當休斯不工作的鏈接被提及,但它爲我工作。