0

I am trying to display two polar plots in one window using matplotlib. This is realized using subplots. Each subplot is created using this solution. The two diagrams are then combined using this solution:

The Radar class handles the creation of a single radar chart:

class Radar:

    def __init__(self, fig, titles, labels, ylimit, lines, rect=None):

        if rect is None:
            rect = [0.2, 0.2, 0.6, 0.6]

        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(lines, angle=angle, labels=label)
        ax.spines["polar"].set_visible(False)
        ax.set_ylim(ylimit[0], ylimit[1])

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

The following code is used in order to create two radar charts and add them to one figure:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.pyplot import Line2D

fig1 = plt.figure(figsize=(9, 9))
plt.ioff()

#############################
# first radar chart
#############################

titles = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
lbl_count = 7
upper_bound = 70
values = [0, 10, 40, 30, 20, 50, 30, 40]
labels1 = np.tile(np.arange(-60 + upper_bound / lbl_count, 20, upper_bound / lbl_count), (8, 1))

lines1 = np.arange(10, upper_bound, 10)
radar1 = Radar(fig1, titles, labels1, (0, upper_bound), lines1)
plt1 = radar1.plot(values, "-", lw=2, color="b", alpha=0.4, label="Fitness")  # type: List[Line2D]

#############################
# second radar chart
#############################

fig2 = plt.figure(figsize=(9, 9))

values = [0.4, 0.7, 0.2, 0.1, 0.8, 0.3, 0.5, 0.7]
lbl_count = 5
labels2 = [list("12345"), [0.1, 0.2, 0.3, 0.4, 0.5], list("54321"), [10, 8, 6, 4, 2], list("12345"), list("12345"), list("12345"), list("12345")]

lines2 = np.arange(0.2, 1.2, 0.2)
radar2 = Radar(fig2, titles, labels2, (0, 1), lines2)
plt2 = radar2.plot(values, "-", lw=2, color="b", alpha=0.4, label="Values")
plt3 = radar2.plot([0.1, 0.2, 0.5, 0.2, 0.1, 0.7, 0.4, 0.2], "-", lw=2, color="r", alpha=0.4, label="Critical Thresholds")


#############################
# combine radar charts
#############################

fig3, (ax1, ax2) = plt.subplots(1, 2, subplot_kw=dict(projection='polar'), figsize=(25, 15))

line1, = ax1.plot(plt1[0].get_xdata(), plt1[0].get_ydata(), 'g-', label="Fitness")
line2, = ax2.plot(plt2[0].get_xdata(), plt2[0].get_ydata(), 'b-', label="Values")
line3, = ax2.plot(plt3[0].get_xdata(), plt3[0].get_ydata(), 'r-', label="Critical Thresholds")

ax1.set_ylim(0, 80)
ax2.set_ylim(0, 1)

plt.tight_layout()
plt.show()
plt.close()

After combining the two figures, the labels with the different scales are gone (figures 1 and 2 are the desired result, while the combined figure 3 is missing some lables)

How do I add the missing labels?

user2035039
  • 961
  • 3
  • 16
  • 30
  • 1
    You should show a complete [mcve] of the issue, otherwise it's not possible to see at which point your approach fails. Also note that your question is hard to understand as in terms of matplotlib terminology, "subplot" and "axes" are identical, so when talking about axes it's not clear if you mean the plural of axis or the subplot. – ImportanceOfBeingErnest Jun 21 '17 at 08:19
  • I clarified my question, but I cannot seem to get the formatting right, hence I cannot submit my edits... Do you know where I can get help with that? The editor complains about badly formatted code, even though all code I inserted was formatted with STRG+K – user2035039 Jun 21 '17 at 09:16
  • I've never experienced any issue like that. In the worst case you could put in your code without formatting and I or someone else could try to edit it correctly? You might also put to to pastebin.com or similar and one could try to edit it in. – ImportanceOfBeingErnest Jun 21 '17 at 09:20
  • Okay fixed it, the problem seemed to be that my screenshots could not be uploaded due to my company's proxy... – user2035039 Jun 21 '17 at 09:24
  • Isn't the problem simply that you're not actually using the Radar class for your combined plot? – ImportanceOfBeingErnest Jun 21 '17 at 09:32
  • But as far as I know, the Radar class plots multiple data sets into the same diagram, I am trying to display two radar charts with multiple data sets each in one figure. – user2035039 Jun 21 '17 at 09:35

1 Answers1

1

You need to actually use the radar class if you want to benefit from its features.

fig3 = plt.figure(figsize=(13, 8))

titles = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

### first subplot:
lbl_count = 7
upper_bound = 70
values = [0, 10, 40, 30, 20, 50, 30, 40]
labels1 = np.tile(np.arange(-60 + upper_bound / lbl_count, 20, upper_bound / lbl_count), (8, 1))

lines1 = np.arange(10, upper_bound, 10)
radar1 = Radar(fig3, titles, labels1, (0, upper_bound), lines1, rect=[0.55,0.1,0.35,0.8])
plt1 = radar1.plot(values, "-", lw=2, color="b", alpha=0.4, label="Fitness") 

### second subplot:
values = [0.4, 0.7, 0.2, 0.1, 0.8, 0.3, 0.5, 0.7]
lbl_count = 5
labels2 = [list("12345"), [0.1, 0.2, 0.3, 0.4, 0.5], list("54321"), [10, 8, 6, 4, 2], list("12345"), list("12345"), list("12345"), list("12345")]

lines2 = np.arange(0.2, 1.2, 0.2)
radar2 = Radar(fig3, titles, labels2, (0, 1), lines2, rect=[0.1,0.1,0.35,0.8])
plt2 = radar2.plot(values, "-", lw=2, color="b", alpha=0.4, label="Values")
plt3 = radar2.plot([0.1, 0.2, 0.5, 0.2, 0.1, 0.7, 0.4, 0.2], "-", lw=2, color="r", alpha=0.4, label="Critical Thresholds")

plt.show()

enter image description here

ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712