python - matplotlib - полярные графики с угловыми метками в радианах
Проблема, с которой я столкнулся, выглядит довольно простой: всякий раз, когда я делаю полярный график, ThetaFormatter учитывает угловые метки, которые маркируют их в градусах.
Мне известен этот вопрос, где метки тиков заменяются именами роз ветров, и этот пример, где похоже, что matplotlib выполняет то, что я хочу в декартовой среде, но я не нашел, как сделать то же самое в полярной сюжет... где бы это было наиболее естественно!
Вот простой пример полярного графика:
from pylab import *
fig = figure()
axe = fig.gca(polar=True)
thetas = linspace(0,2*pi,200)
rhos = 3+cos(5*thetas)
axe.plot(thetas, rhos)
fig.show()
1 ответ
Это должно сделать это:
>>> fig=plt.figure()
>>> axe=fig.gca(polar=True)
>>> thetas=linspace(0,2*pi,200)
>>> rhos=3+cos(5*thetas)
>>> axe.plot(thetas, rhos)
[<matplotlib.lines.Line2D object at 0x109a2b550>]
>>> xT=plt.xticks()[0]
>>> xL=['0',r'$\frac{\pi}{4}$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',\
r'$\pi$',r'$\frac{5\pi}{4}$',r'$\frac{3\pi}{2}$',r'$\frac{7\pi}{4}$']
>>> plt.xticks(xT, xL)
([<matplotlib.axis.XTick object at 0x107bac490>, <matplotlib.axis.XTick object at 0x109a31310>, <matplotlib.axis.XTick object at 0x109a313d0>, <matplotlib.axis.XTick object at 0x109a31050>, <matplotlib.axis.XTick object at 0x1097a8690>, <matplotlib.axis.XTick object at 0x1097a8cd0>, <matplotlib.axis.XTick object at 0x1097a8150>, <matplotlib.axis.XTick object at 0x107bb8fd0>], <a list of 8 Text xticklabel objects>)
>>> plt.show()
С python 3.8.3 и matplotlib 3.2.2 этого можно легко достичь с помощью get_xticks
(который возвращает значения тиков в десятичных радианах) и set_xticklabels
функция.
Если вы предпочитаете другой стиль меток (например, десятичные радианы или другую точность), функция format_radians_label
может быть заменен любой функцией, которая принимает значение с плавающей запятой (в радианах) и возвращает соответствующую строку.
Nb избегать использования TeX
форматировщик Я напрямую использовал символ UTF8 π
скорее, чем \pi
import matplotlib.pyplot as plt
import numpy as np
def format_radians_label(float_in):
# Converts a float value in radians into a
# string representation of that float
string_out = str(float_in / (np.pi))+"π"
return string_out
def convert_polar_xticks_to_radians(ax):
# Converts x-tick labels from degrees to radians
# Get the x-tick positions (returns in radians)
label_positions = ax.get_xticks()
# Convert to a list since we want to change the type of the elements
labels = list(label_positions)
# Format each label (edit this function however you'd like)
labels = [format_radians_label(label) for label in labels]
ax.set_xticklabels(labels)
fig = plt.figure()
axe = fig.gca(polar=True)
thetas = np.linspace(0,2*np.pi,200)
rhos = 3+np.cos(5*thetas)
axe.plot(thetas, rhos)
convert_polar_xticks_to_radians(axe)
fig.show()