Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib: Polar plot axis tick label location

How would you move the labels along each axis so they're all readable? For example, how would you move the '$156, $158, $160' out of the way of the axis?

This post shows how you can move these labels if you only have one axis, but what would you do if you had multiple as in my situation? Move radial tick labels on a polar plot in matplotlib

Current Polar Plot

import numpy as np
import pylab as pl
import matplotlib.pyplot as py

class Radar(object):

def __init__(self, fig, titles, labels, rect=None):
    if rect is None:
        rect = [0.05, 0.05, 0.95, 0.95]

    self.n = len(titles)
    self.angles = [a if a <=360. else a - 360. for a in np.arange(90, 90+360, 360.0/self.n)]
    self.axes = [fig.add_axes(rect, projection="polar", label="axes%d" % i) 
                     for i in range(self.n)]

    self.ax = self.axes[0]
    self.ax.set_thetagrids(self.angles, labels=titles, fontsize=12, weight="bold", color="black")

    for ax in self.axes[1:]:
        ax.patch.set_visible(False)
        ax.grid("off")
        ax.xaxis.set_visible(False)
        self.ax.yaxis.grid(False)

    for ax, angle, label in zip(self.axes, self.angles, labels):
        ax.set_rgrids(range(1, 7), labels=label, angle=angle, fontsize=12)
        ax.spines["polar"].set_visible(False)
        ax.set_ylim(0, 6)  
        ax.xaxis.grid(True,color='black',linestyle='-')

def plot(self, values, *args, **kw):
    angle = np.deg2rad(np.r_[self.angles, self.angles[0]])
    values = np.r_[values, values[0]]
    self.ax.plot(angle, values, *args, **kw)

fig = pl.figure(figsize=(20, 20))

titles = [
"Canada", "Australia", "New Zealand", "Japan", "China", "USA", "Mexico", "Finland", "Doha" 
]

labels = [
list("abcde"), list("12345"), list("uvwxy"), 
[" ", " ", "$156", "$158", "$160"],
list("jklmn"), list("asdfg"), list("qwert"), [" ", "4.3", "4.4", "4.5", "4.6"], list("abcde")
]

radar = Radar(fig, titles, labels)
radar.plot([1, 3, 2, 5, 4, 5, 3, 3, 2],  "--", lw=1, color="b", alpha=.5, label="USA 2014")
radar.plot([2.3, 2, 3, 3, 2, 3, 2, 4, 2],"-", lw=1, color="r", alpha=.5, label="2014")
radar.plot([3, 4, 3, 4, 2, 2, 1, 3, 2], "-", lw=1, color="g", alpha=.5, label="2013")
radar.plot([4.5, 5, 4, 5, 3, 3, 4, 4, 2], "-", lw=1, color="y", alpha=.5, label="2012")

radar.ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.10),
      fancybox=True, shadow=True, ncol=4)

fig = py.gcf()
fig.set_size_inches(6, 10, forward=True)
fig.savefig('test2png.png', dpi=100, bbox_inches="tight", pad_inches=1)
like image 246
JA2 Avatar asked Mar 14 '26 07:03

JA2


1 Answers

One option would be to add a constant offset to your label positions. You can do this by for each axis getting the current position (ax.get_rlabel_position()) and then adding a constant to it (ax.set_rlabel_position())

For example, to add 7 degrees to all labels, add this after your ax.xaxis.grid line

pos=ax.get_rlabel_position()
ax.set_rlabel_position(pos+7)

However, I don't find this to be a particularly good looking solution. It works ok for your $160, etc. labels but others don't look great.

enter image description here

Maybe someone else has a more elegant solution.

like image 55
tmdavison Avatar answered Mar 16 '26 21:03

tmdavison



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!