如何为极坐标matplotlib创建次要刻度

时间:2017-06-20 15:17:29

标签: python matplotlib

我对下面两个由matplotlib绘制的极坐标图感兴趣

  1. 如何在r轴上创建极坐标图的小刻度?
  2. 如何将r标签远离r刻度移动,如图中所示,一些r刻度线与轴接触。
  3. enter image description here

2 个答案:

答案 0 :(得分:2)

极坐标图没有小的或主要的刻度。因此,我认为您需要通过绘制小线段来手动创建次要刻度。

例如:

import numpy as np
import matplotlib.pyplot as plt

r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r

ax = plt.subplot(111, projection='polar')
ax.plot(theta, r)
ax.set_rmax(2)
ax.margins(y=0)
ax.set_rticks([0.5, 1, 1.5, 2])  # less radial ticks
ax.set_rlabel_position(120)  # get radial labels away from plotted line

ax.grid(True)

tick = [ax.get_rmax(),ax.get_rmax()*0.97]
for t  in np.deg2rad(np.arange(0,360,5)):
    ax.plot([t,t], tick, lw=0.72, color="k")

ax.set_title("A line plot on a polar axis", va='bottom')
plt.show()

enter image description here

答案 1 :(得分:0)

对于您的第一个问题,您可以增加刻度数,如果您希望获得次要刻度,这似乎不是您想要的,或者您可以自己手动生成刻度。为此,您需要使用极轴自己的绘图工具来绘制这些刻度,即:

ax.plot([theta_start, theta_end], [radius_start, radius_end], kwargs**)

您需要弄清楚您想要这些滴答的间隔,然后使用如下所示的函数手动勾选它们。

def minor_tick_gen(polar_axes, tick_depth, tick_degree_interval, **kwargs):
    for theta in np.deg2rad(range(0, 360, tick_degree_interval)):
        polar_axes.plot([theta, theta], [polar_axes.get_rmax(), polar_axes.get_rmax()-tick_depth], **kwargs)

然后您可以这样调用:

minor_tick_gen(ax, 0.25, 20, color = "black")

很难找到它,但是极轴不是普通轴,而是Polar Axis class instances.在文档中你可以使用set_ylim(min, max),它可以让你将标签移出线,不过这个将重新缩放整个图表。超出图形边界将需要开发人员对框架的了解,因为matplotlib不会向您公开此功能。例如,使用set_rgrids(...),即使使用位置组件也不会影响相对标签定位。

将这些内容放在一起,您可以使用以下代码:

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


def minor_tick_gen(polar_axes, tick_depth, tick_degree_interval, **kwargs):
    for theta in np.deg2rad(range(0, 360, tick_degree_interval)):
        polar_axes.plot([theta, theta], [polar_axes.get_rmax(), polar_axes.get_rmax()-tick_depth], **kwargs)

def radian_function(x, y =None):
    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(2)
ax.set_rticks([3*math.pi, 6*math.pi, 9*math.pi, 12*math.pi])
ax.set_rlabel_position(112.5)
# go slightly beyond max value for ticks to solve second problem
ax.set_ylim(0, 13*math.pi)
ax.grid(True)
# generate ticks for first problem
minor_tick_gen(ax, math.pi, 20, color = "black", lw = 0.5)
ax.set_title("Polar axis label minor tick example", va='bottom')
ax.yaxis.set_major_formatter(ticker.FuncFormatter(radian_function))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(radian_function))
plt.show()

获取以下图片enter image description here