Matplotlib极坐标图刻度/轴标签位置

5

我一直在寻找一个可靠的方法,在极坐标图中正确地定位刻度和坐标轴标签。请看以下示例:

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()

这导致了如下图所示:

极坐标图 您可以清楚地看到:

(a) 半径轴上的刻度标签位置在图中从底部切换到顶部,角度轴的刻度标签也从右到左切换。

(b) 坐标轴标签的位置是固定的。我希望坐标轴标签也随着刻度标签移动。即在左边的图中,"theta" 应该在右侧,在右边的图中 "r" 应该在顶部。

如何以正确的方式控制轴/刻度标签的位置?例如,如果旋转 90 度,则情况会变得更糟,因为此时角度轴实际上是垂直的,刻度标签完全偏离。


这里有一些一致性需要注意:Theta刻度标签始终显示在极区楔形的外部,无论取向如何。rticklabels显示在theta轴(最低角度)的起始处。这两个都对我来说很有意义。但我不理解的是选择轴标签位置与刻度标签不一致的原因。也就是说,在这种情况下,“正确”意味着仍然不明显。 - ImportanceOfBeingErnest
2个回答

5

我认为最重要的部分是要明确通常的左、右、下、上的概念如何转化为matplotlib中的极坐标轴。

enter image description here

角度轴是“x”轴。径向轴是“y”轴。“底部”是外环,“顶部”是内环。“左侧”是角度轴开始的径向轴,“右侧”是其结束位置。
这样就可以像平常一样设置刻度位置,例如:
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


谢谢你的帮助!我最终决定实现轴标签作为共旋转文本,就像你的示例一样! - HansSnah

1
回答问题(b)的内容如下:

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

此外,我修改了 ax.set_ylabel(r"$\theta$", labelpad=15)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接