Полярный график Matplotlib Положение метки / оси - PullRequest
3 голосов
/ 03 апреля 2019

Я искал способ надежно расположить метки тиков и осей на графике в полярных координатах.Пожалуйста, взгляните на следующий пример:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=[10, 5])
ax0 = fig.add_axes([0.05, 0.05, 0.4, 0.9], projection="polar")
ax1 = fig.add_axes([0.55, 0.05, 0.4, 0.9], projection="polar")

r0 = np.linspace(10, 12, 10)
theta0 = np.linspace(0, 0.1, 10)

ax0.quiver(theta0, r0, -0.1, 0.1)
ax1.quiver(theta0 + np.pi, r0, -0.1, 0.1)

ax0.set_thetamin(-2)
ax0.set_thetamax(10)

ax1.set_thetamin(178)
ax1.set_thetamax(190)

for ax in [ax0, ax1]:

    # Labels
    ax.set_xlabel("r")
    ax.set_ylabel(r"$\theta$", labelpad=10)

    # R range
    ax.set_rorigin(0)
    ax.set_rmin(9)
    ax.set_rmax(13)

plt.show()

, что приводит к следующему рисунку:

polar plot Вы можете ясно видеть, что

(a) позиция метки на радиальной оси переключается снизу вверх между графиками и метки для тета-переключателя справа налево.

(b) позиции меток на оси фиксированы.Я бы хотел, чтобы метки осей также перемещались вместе с метками тиков.то есть на левом графике «тета» должна быть справа, а на правом графике «r» должна быть сверху.

Как я могу управлять осями / метками таким образом, чтобы ониправильно расположены?Это даже ухудшается, например, при сдвиге на 90 градусов, потому что тогда ось тета фактически вертикальна, а метки тиков полностью отключены.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Я думаю, что наиболее важным моментом является выяснение того, как обычные понятия слева, справа, снизу и сверху переводятся в полярные оси в matplotlib.

enter image description here

Угловая ось - это ось "х". Радиальная ось - это ось «у». «Дно» - это внешнее кольцо. «Верх» - это внутреннее кольцо. «Слева» - радиальная ось в начале угловой оси, «справа» - ее конец.

Затем это позволяет установить позиции галочки как обычно, например,

ax.tick_params(labelleft=True, labelright=False,
               labeltop=False, labelbottom=True)

для случая, показанного выше.

Метки x и y (set_xlabel / set_ylabel) не переведены. Здесь слева, справа, сверху, снизу относятся к декартовому определению, как и с обычными линейными осями. Это означает, что для определенных позиций их нельзя использовать для маркировки оси, потому что они слишком далеко. Альтернативой является создание text в желаемой позиции.

Полный пример кода:

import numpy as np
import matplotlib.pyplot as plt

fig, (ax0, ax1) = plt.subplots(ncols=2, figsize=(10,5), 
                               subplot_kw=dict(projection="polar"))

ax0.set(thetamin=180, thetamax=230)
ax1.set(thetamin=  0, thetamax= 50)

plt.setp([ax0, ax1], rorigin=0, rmin=5, rmax=10)

ax0.tick_params(labelleft=False, labelright=True,
                labeltop=True, labelbottom=False)

trans, _ , _ = ax1.get_xaxis_text1_transform(-10)
ax1.text(np.deg2rad(22.5), -0.18, "Theta Label", transform=trans, 
         rotation=22.5-90, ha="center", va="center")


plt.show()

enter image description here

1 голос
/ 04 апреля 2019

Чтобы ответить на вопрос (б):

ax0.yaxis.set_label_position('right')
ax1.xaxis.set_label_position('top')

Кроме того, я изменил ax.set_ylabel(r"$\theta$", labelpad=15)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...