@dabillox was already mentioned with frac kwarg before ax.set_thetagrids .
However, as you noticed, what you really want to change is the alignment of the labels, not the general offset of the labels to the labels.
On the other hand, the reason the labelpad not affected is because it controls the filling between the axis label (for example, plt.xlabel , plt.ylabel ) and the axis, rather than the label labels.
First, you can write your sample code a little more cleanly. Here more or less, how would I get closer to what you are doing (note that this will still have the same problem with positioning the label tag):
import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as tkr def main(): data = [ 10.49531611, 22.49511583, 10.90891806, 18.99525417, 21.57165972, 6.687755 , 6.52137028, 15.86534639, 18.53823556, 6.32563583, 12.99365833, 11.06817056, 17.29261306, 15.31288556, 19.16236667, 10.38483333, 14.51442222, 17.01413611, 6.96102278, 15.98508611, 16.5287 , 15.26533889, 20.83520278, 17.21952056, 7.3225775 , 16.42534361, 14.38649722, 21.63573111, 16.19249444] data = np.array(data)*60*60 plot_clock(data) plt.show() def plot_clock(data): def hour_formatAM(x, p): hour = x * 6 / np.pi return '{:0.0f}:00'.format(hour) if x > 0 else '12:00' def hour_formatPM(x, p): hour = x * 6 / np.pi return '{:0.0f}:00'.format(hour + 12) if x > 0 else '24:00' def plot(ax, theta, counts, formatter): colors = plt.cm.jet(theta / 12.0) ax.bar(theta, counts, width=np.pi/6, color=colors, alpha=0.5) ax.xaxis.set_major_formatter(tkr.FuncFormatter(formatter)) plt.rcParams['font.size'] = 8 bins = np.r_[0, 0.5:12, 12, 12.5:24, 23.99999] data = np.array(data) / (60*60) counts = np.histogram(data,bins)[0] counts[13] += counts[0] counts[-1] += counts[13] fig, axes = plt.subplots(ncols=2, figsize=(5.5, 3), dpi=200, subplot_kw=dict(projection='polar')) fig.subplots_adjust(wspace=0.4) for ax in axes: ax.set(theta_offset=np.pi/2, theta_direction=-1, xticks=np.arange(0, np.pi*2, np.pi/6), yticks=np.arange(1, counts.max())) plot(axes[0], bins[1:13] * np.pi / 6, counts[1:13], hour_formatAM) plot(axes[1], bins[14:26] * np.pi / 6, counts[14:26], hour_formatPM) main()

If we want to avoid erroneous label labels, we can set the horizontal alignment depending on their position:
import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as tkr def main(): data = [ 10.49531611, 22.49511583, 10.90891806, 18.99525417, 21.57165972, 6.687755 , 6.52137028, 15.86534639, 18.53823556, 6.32563583, 12.99365833, 11.06817056, 17.29261306, 15.31288556, 19.16236667, 10.38483333, 14.51442222, 17.01413611, 6.96102278, 15.98508611, 16.5287 , 15.26533889, 20.83520278, 17.21952056, 7.3225775 , 16.42534361, 14.38649722, 21.63573111, 16.19249444] data = np.array(data)*60*60 axes = plot_clock(data) for ax in axes: realign_polar_xticks(ax) plt.show() def realign_polar_xticks(ax): for x, label in zip(ax.get_xticks(), ax.get_xticklabels()): if np.sin(x) > 0.1: label.set_horizontalalignment('left') if np.sin(x) < -0.1: label.set_horizontalalignment('right') def plot_clock(data): def hour_formatAM(x, p): hour = x * 6 / np.pi return '{:0.0f}:00'.format(hour) if x > 0 else '12:00' def hour_formatPM(x, p): hour = x * 6 / np.pi return '{:0.0f}:00'.format(hour + 12) if x > 0 else '24:00' def plot(ax, theta, counts, formatter): colors = plt.cm.jet(theta / 12.0) ax.bar(theta, counts, width=np.pi/6, color=colors, alpha=0.5) ax.xaxis.set_major_formatter(tkr.FuncFormatter(formatter)) plt.rcParams['font.size'] = 8 bins = np.r_[0, 0.5:12, 12, 12.5:24, 23.99999] data = np.array(data) / (60*60) counts = np.histogram(data,bins)[0] counts[13] += counts[0] counts[-1] += counts[13] fig, axes = plt.subplots(ncols=2, figsize=(5.5, 3), dpi=200, subplot_kw=dict(projection='polar')) fig.subplots_adjust(wspace=0.5) for ax in axes: ax.set(theta_offset=np.pi/2, theta_direction=-1, xticks=np.arange(0, np.pi*2, np.pi/6), yticks=np.arange(1, counts.max())) plot(axes[0], bins[1:13] * np.pi / 6, counts[1:13], hour_formatAM) plot(axes[1], bins[14:26] * np.pi / 6, counts[14:26], hour_formatPM) return axes main()

And finally, if you want to do this βcorrectlyβ, regardless of the direction and offset of the theta, do something like:
def realign_polar_xticks(ax): for theta, label in zip(ax.get_xticks(), ax.get_xticklabels()): theta = theta * ax.get_theta_direction() + ax.get_theta_offset() theta = np.pi/2 - theta y, x = np.cos(theta), np.sin(theta) if x >= 0.1: label.set_horizontalalignment('left') if x <= -0.1: label.set_horizontalalignment('right') if y >= 0.5: label.set_verticalalignment('bottom') if y <= -0.5: label.set_verticalalignment('top')
