2017-06-20 59 views

回答

0

我知道如何做到這一點,但沒有看到完全相同的問題在這裏,也沒有找到好的解決方案。雖然我不確定這是否是最好的方法,但它肯定比設置每個標籤的格式更好!

所以我找到的解決方案是使用FunctionFormatter。這個定義很簡短,所以我只是把它粘貼在這裏。

class FuncFormatter(Formatter): 
    """ 
    Use a user-defined function for formatting. 

    The function should take in two inputs (a tick value ``x`` and a 
    position ``pos``), and return a string containing the corresponding 
    tick label. 
    """ 
    def __init__(self, func): 
     self.func = func 

    def __call__(self, x, pos=None): 
     """ 
     Return the value of the user defined function. 

     `x` and `pos` are passed through as-is. 
     """ 
     return self.func(x, pos) 

此格式類將使我們能夠創建一個函數,它作爲參數傳遞,而函數的輸出將是我們的劇情角度標籤的格式。

然後,您可以使用PolarAxis.xaxis.set_major_formatter(formatter)來使用您新創建的格式化程序,並且只更改角軸標籤。相同的事情可以使用yaxis屬性來完成,而且會導致內部徑向標籤也發生變化。

這裏是我們的職責樣子,我們將通過:

def radian_function(x, pos =None): 
    # the function formatter sends 
    rad_x = x/math.pi 
    return "{}π".format(str(rad_x if rad_x % 1 else int(rad_x))) 

它採用標準的Python格式化字符串作爲輸出,擺脫不必要的小數和追加PI符號的字符串的結束保持它在pi。

完整的程序是這樣的:

import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
import math 

def radian_function(x, pos =None): 
    # the function formatter sends 
    rad_x = x/math.pi 
    return "{}π".format(str(rad_x if rad_x % 1 else int(rad_x))) 

ax = plt.subplot(111, projection='polar') 
ax.set_rmax(4) 
ax.set_rticks([1, 2, 3, 4]) 
ax.grid(True) 
ax.set_title("Polar axis label example", va='bottom') 

# sets the formatter for the entire set of angular axis labels 
ax.xaxis.set_major_formatter(ticker.FuncFormatter(radian_function)) 
# sets the formatter for the radius inner labels. 
#ax.yaxis.set_major_formatter(ticker.FuncFormatter(radian_function)) 
plt.show() 

其輸出

enter image description here

你可以進一步提高格式化檢查一個(讓簡單示爲π)或以類似的方式檢查0。你甚至可以使用位置變量(我沒有必要忽略它)來進一步改進視覺格式。

這樣的功能可能是這樣的:

def radian_function(x, pos =None): 
    # the function formatter sends 
    rad_x = x/math.pi 
    if rad_x == 0: 
     return "0" 
    elif rad_x == 1: 
     return "π" 
    return "{}π".format(str(rad_x if rad_x % 1 else int(rad_x))) 
相關問題