我试图使用matplotlib在一个窗口中显示两个极坐标图。 这是使用子图实现的。 使用此解决方案创建每个子图。 然后使用此解决方案组合这两个图:
Radar类处理单个雷达图的创建:
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)以下代码用于创建两个雷达图并将其添加到一个图中:
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()合并两个数字后,不同尺度的标签消失了(图1和图2是期望的结果,而图3的组合缺少一些标签)
如何添加缺少的标签?
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?
最满意答案
如果您想从其功能中受益,您需要实际使用雷达类。
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()
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()更多推荐
发布评论