def addTextBox(plot: matplotlib.axes.SubplotBase, text: str, position='bottomright'): # these are matplotlib.patch.Patch properties props = dict(boxstyle='square', facecolor='#fff', alpha=1) # place a text box in upper left in axes coords # top right: xy=(1, 1), xytext=(15, 15), verticalalignment='top' # bottom right: xy=(1, 0), xytext=(-15, 15), verticalalignment='bottom' if position == 'topright': positionArgs = { 'xy': (1, 1), 'xytext': (15, 15), 'verticalalignment': 'top', 'horizontalalignment': 'right' } if position == 'bottomright': positionArgs = { 'xy': (1, 0), 'xytext': (-15, 15), 'verticalalignment': 'bottom', 'horizontalalignment': 'right' } plot.annotate(text, fontsize=10, bbox=props, zorder=10, xycoords='axes fraction', textcoords='offset points', **positionArgs)
def stackplot( self, eco, title: titleType = None, logscale: bool = True, ax: matplotlib.axes.SubplotBase = None, ) -> matplotlib.figure.Figure: populations = eco.population_sizes if ax is None: _, ax = plt.subplots() else: ax = ax figure = ax.get_figure() turns = range(len(populations)) pops = [ [populations[iturn][ir] for iturn in turns] for ir in self.result_set.ranking ] ax.stackplot(turns, *pops) ax.yaxis.tick_left() ax.yaxis.set_label_position("right") ax.yaxis.labelpad = 25.0 ax.set_ylim([0.0, 1.0]) ax.set_ylabel("Relative population size") ax.set_xlabel("Turn") if title is not None: ax.set_title(title) trans = transforms.blended_transform_factory(ax.transAxes, ax.transData) ticks = [] for i, n in enumerate(self.result_set.ranked_names): x = -0.01 y = (i + 0.5) * 1 / self.result_set.num_players ax.annotate( n, xy=(x, y), xycoords=trans, clip_on=False, va="center", ha="right", fontsize=5, ) ticks.append(y) ax.set_yticks(ticks) ax.tick_params(direction="out") ax.set_yticklabels([]) if logscale: ax.set_xscale("log") plt.tight_layout() return figure