Whilst plotting my complex radar chart, I am getting the error "radial grids must be strictly positive", but all of the values and ranges I have used in my radar chart are all positive. Can someone tell me why I am getting this error, and what I can do to fix it? The code I have used is below:-
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns # improves plot aesthetics
def _invert(x, limits):
"""inverts a value x on a scale from
limits[0] to limits[1]"""
return limits[1] - (x - limits[0])
def _scale_data(data, ranges):
"""scales data[1:] to ranges[0],
inverts if the scale is reversed"""
for d, (y1, y2) in zip(data[1:], ranges[1:]):
assert (y1 <= d <= y2) or (y2 <= d <= y1)
x1, x2 = ranges[0]
d = data[0]
if x1 > x2:
d = _invert(d, (x1, x2))
x1, x2 = x2, x1
sdata = [d]
for d, (y1, y2) in zip(data[1:], ranges[1:]):
if y1 > y2:
d = _invert(d, (y1, y2))
y1, y2 = y2, y1
sdata.append((d-y1) / (y2-y1)
* (x2 - x1) + x1)
return sdata
class ComplexRadar():
def __init__(self, fig, variables, ranges,
n_ordinate_levels=6):
angles = np.arange(0, 360, 360./len(variables))
axes = [fig.add_axes([0.1,0.1,0.8,0.8],polar=True,
label = "axes{}".format(i))
for i in range(len(variables))]
l, text = axes[0].set_thetagrids(angles,
labels=variables)
[txt.set_rotation(angle-90) for txt, angle
in zip(text, angles)]
for ax in axes[1:]:
ax.patch.set_visible(False)
ax.grid("off")
ax.xaxis.set_visible(False)
for i, ax in enumerate(axes):
grid = np.linspace(*ranges[i],
num=n_ordinate_levels)
gridlabel = ["{}".format(round(x,2))
for x in grid]
if ranges[i][0] > ranges[i][1]:
grid = grid[::-1] # hack to invert grid
# gridlabels aren't reversed
gridlabel[0] = "" # clean up origin
ax.set_rgrids(grid, labels=gridlabel,
angle=angles[i])
#ax.spines["polar"].set_visible(False)
ax.set_ylim(*ranges[i])
# variables for plotting
self.angle = np.deg2rad(np.r_[angles, angles[0]])
self.ranges = ranges
self.ax = axes[0]
def plot(self, data, *args, **kw):
sdata = _scale_data(data, self.ranges)
self.ax.plot(self.angle, np.r_[sdata, sdata[0]], *args, **kw)
def fill(self, data, *args, **kw):
sdata = _scale_data(data, self.ranges)
self.ax.fill(self.angle, np.r_[sdata, sdata[0]], *args, **kw)
# example data
variables = ("Attribute1", "Attribute2", "Attribute3",
"Attribute4", "Attribute5", "Attribute6", "Attribute7",
"Attribute8", "Attribute9", "Attribute10", "Attribute11",
"Attribute12", "Attribute13", "Attribute14", "Attribute15",
"Attribute16", "Attribute17")
data = (1.0, 185, 0.02,
1.5, 0.1, 1.3, 1.1,
2.3, 0.1, 6.6, 24.5,
83, 7.5, 5.6, 4.6,
6.5, 1.3)
data2 = (1.0, 177, 0.0,
0.0, 0.7, 1.3, 1.3,
4.3, 0.0, 4.7, 30,
93, 3.7, 5.0, 7.7,
8.0, 3.5)
ranges = [(10.0, 0.0), (170.0, 189.0), (0.0, 0.3),
(0.6, 5.2), (0.1, 2.0), (0.3, 2.2), (1.4, 0.3),
(0.9, 3.0), (0.0, 0.7), (2.6, 11.4), (14.4, 43.5),
(72.0, 94.0), (1.4, 7.9), (2.5, 6.5), (2.4, 6.2),
(4.0, 7.9), (1.1, 3.9)]
# plotting
fig1 = plt.figure(figsize=(9, 9))
radar = ComplexRadar(fig1, variables, ranges)
radar.plot(data, color="deepskyblue", label= "Compare1")
radar.fill(data, color="deepskyblue", alpha=0.5)
radar = ComplexRadar(fig1, variables, ranges)
radar.plot(data2, color="orangered", label= "Compare2")
radar.fill(data2, color="orangered", alpha=0.5)
radar.ax.legend(loc='upper center', bbox_to_anchor=(0.9, 1.10),
fancybox=False, shadow=False, ncol=48)
plt.show()