這不是this或this的重複,因爲答案並不令人滿意,我不想處理這個每個標籤。這也不是this的重複,因爲它不涉及我的具體問題。如何將* all * matplotlib極軸角標籤的格式設置爲pi和弧度?
我想設置極座標圖的角度軸標籤,而不是一個接一個,而是通過一次性初始化方法。這一定是可能的,因爲似乎有其他類型的軸類似的方法。
這不是this或this的重複,因爲答案並不令人滿意,我不想處理這個每個標籤。這也不是this的重複,因爲它不涉及我的具體問題。如何將* all * matplotlib極軸角標籤的格式設置爲pi和弧度?
我想設置極座標圖的角度軸標籤,而不是一個接一個,而是通過一次性初始化方法。這一定是可能的,因爲似乎有其他類型的軸類似的方法。
我知道如何做到這一點,但沒有看到完全相同的問題在這裏,也沒有找到好的解決方案。雖然我不確定這是否是最好的方法,但它肯定比設置每個標籤的格式更好!
所以我找到的解決方案是使用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()
其輸出
你可以進一步提高格式化檢查一個(讓1π
簡單示爲π
)或以類似的方式檢查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)))