2017-07-24 234 views
0

我將如何去保持沿輪廓外部的輪廓標籤文字?注意 - 我不希望它與輪廓內嵌。下面是MCVE。Python clabel文字外輪廓

from matplotlib import pyplot as plt 
import numpy as np 

Data=np.zeros((100,100)) 
Data[10:30,10:30] = 1 
Data[60:80,60:80] = 1 

f,ax1 = plt.subplots(1,1) 

CS = ax1.contour(np.arange(0,100),np.arange(0,100),Data,[0,1]) 
ax1.clabel(CS, inline=False, fmt='%1.1f', fontsize=10) 

plt.show() 

檢查API後,我看不到任何東西(除了內聯,手動點擊或指定位置)。所以在下面的圖片中,我希望標籤外面的標籤略低一些。 enter image description here

回答

0

您可以在之後設置標籤的垂直對齊方式,以創建它們以將其頂部對齊到初始位置。

clabels = ax.clabel(...) 
for label in clabels: 
    label.set_va("top") 

該解決方案是半自動的。由於您無法事先知道標籤將放置在哪一面,因此您不知道在此處是使用"top"還是"bottom"。此外,對於曲線,這不會在所有的幫助,你將需要手動指定位置(ax1.clabel(CS, ..., manual=list_of_locations)

完整的示例:

from matplotlib import pyplot as plt 
import numpy as np 

Data=np.zeros((100,100)) 
Data[10:30,10:30] = 1 
Data[60:80,60:80] = 1 

f,ax1 = plt.subplots(1,1) 

CS = ax1.contour(np.arange(0,100),np.arange(0,100),Data,[0,1]) 
cl = ax1.clabel(CS, inline=False, fmt='%1.1f', fontsize=10) 
for l in cl: 
    l.set_va("top") 
plt.show() 

enter image description here


一個黑客一點,這也可能與旋轉標籤一起工作(儘管我還沒有測試過)可能會在標籤前面引入換行符。這也將有效地將標籤轉移到底部。

from matplotlib import pyplot as plt 
import matplotlib.ticker 
import numpy as np 

Data=np.zeros((100,100)) 
Data[10:30,10:30] = 1 
Data[60:80,60:80] = 1 

f,ax1 = plt.subplots(1,1) 

CS = ax1.contour(np.arange(0,100),np.arange(0,100),Data,[0,1]) 
fmt = matplotlib.ticker.StrMethodFormatter("\n{x:1.1f}") 
cl = ax1.clabel(CS, inline=False, fmt=fmt, fontsize=10) 

plt.show() 

enter image description here

+0

有趣的,感謝您的答覆。我的實際數據有曲線輪廓 - 我很驚訝Matplotlib中沒有更多的支持clabel文本。 –

+1

我在答案中添加了另一個hacky解決方案,在某些情況下可能會給出更好的結果。 – ImportanceOfBeingErnest