15

I want to plot a radar chart with multiple scales on multiple axes using matplotlib. The official API example gives only one scale on one axis. (Scales are 0.2,0.4,0.6,0.8 in this example)

I want different scales on all axes. (There are 9 axes in the given example.)

I found an example of what I am looking for here. There are 5 axes on this example and 5 scales on all axes just like I want.

Sait
  • 19,045
  • 18
  • 72
  • 99

1 Answers1

19

I think you can plot this with multiple axes, the lines are in the first axe, and other axes only shows ticklabels.

import numpy as np
import pylab as pl

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 = 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=14)

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

        for ax, angle, label in zip(self.axes, self.angles, labels):
            ax.set_rgrids(range(1, 6), angle=angle, labels=label)
            ax.spines["polar"].set_visible(False)
            ax.set_ylim(0, 5)

    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=(6, 6))

titles = list("ABCDE")

labels = [
    list("abcde"), list("12345"), list("uvwxy"), 
    ["one", "two", "three", "four", "five"],
    list("jklmn")
]

radar = Radar(fig, titles, labels)
radar.plot([1, 3, 2, 5, 4],  "-", lw=2, color="b", alpha=0.4, label="first")
radar.plot([2.3, 2, 3, 3, 2],"-", lw=2, color="r", alpha=0.4, label="second")
radar.plot([3, 4, 3, 4, 2], "-", lw=2, color="g", alpha=0.4, label="third")
radar.ax.legend()

enter image description here

learn2day
  • 1,566
  • 1
  • 14
  • 17
HYRY
  • 94,853
  • 25
  • 187
  • 187
  • I am getting this error - "global name 'angles' is not defined". Could you please add what are the changes you did. – Bharathi Sep 10 '15 at 17:06
  • @Bharathi, bug fixed. – HYRY Sep 11 '15 at 01:30
  • Perhaps it's useful to note that if you want to see some output of the code above you have to add at least fig.savefig("somename.png") at the end. – keocra Feb 03 '17 at 14:29
  • 1
    Also I had a problem using the example above with degrees greater than 360 for axis. I.e. the dashed line for the title "A" was missing. I solved this issue by adding a new line with "self.angles = [a % 360 for a in self.angles]" after "self.angles = np.arange(90, 90+360, 360.0/self.n)". Environment: Python 2.7.12 :: Anaconda 4.2.0 (64-bit), matplotlib (1.5.3), numpy (1.11.1). Anyway thanks for your work ;-) – keocra Feb 07 '17 at 14:28
  • 3
    Had the same problem as @keocra, probably the libraries got updated and now behave differently. Here's my working solution for a 12-axis radar chart: https://gist.github.com/geberl/c65517bf8273552486f9a8954e80ddf4 – Günther Eberl Sep 21 '18 at 09:59