Перечислить графики на рисунке matplotlib

На рисунке matplotlib я хотел бы перечислить все (под) сюжеты с помощью a), b), c) и так далее. Есть ли способ сделать это автоматически?

Пока я использую заголовки отдельных графиков, но это далеко не идеально, так как я хочу, чтобы число было выровнено по левому краю, а необязательный реальный заголовок должен располагаться по центру рисунка.


person Se Norm    schedule 19.03.2014    source источник
comment
В качестве примечания, каждая ось на самом деле имеет три названия (слева, справа, по центру), но я не помню, было ли это в 1.3 или все еще только на мастере.   -  person tacaswell    schedule 19.03.2014


Ответы (3)


import string
from itertools import cycle
from six.moves import zip

def label_axes(fig, labels=None, loc=None, **kwargs):
    """
    Walks through axes and labels each.

    kwargs are collected and passed to `annotate`

    Parameters
    ----------
    fig : Figure
         Figure object to work on

    labels : iterable or None
        iterable of strings to use to label the axes.
        If None, lower case letters are used.

    loc : len=2 tuple of floats
        Where to put the label in axes-fraction units
    """
    if labels is None:
        labels = string.ascii_lowercase

    # re-use labels rather than stop labeling
    labels = cycle(labels)
    if loc is None:
        loc = (.9, .9)
    for ax, lab in zip(fig.axes, labels):
        ax.annotate(lab, xy=loc,
                    xycoords='axes fraction',
                    **kwargs)

пример использования:

from matplotlib import pyplot as plt
fig, ax_lst = plt.subplots(3, 3)
label_axes(fig, ha='right')
plt.draw()

fig, ax_lst = plt.subplots(3, 3)
label_axes(fig, ha='left')
plt.draw()

Мне это кажется достаточно полезным, поэтому я поместил это в суть: https://gist.github.com/tacaswell/9643166

person tacaswell    schedule 19.03.2014

Я написал функцию, которая делает это автоматически, где метка представлена ​​в виде легенды:

import numpy
import matplotlib.pyplot as plt

def setlabel(ax, label, loc=2, borderpad=0.6, **kwargs):
    legend = ax.get_legend()
    if legend:
        ax.add_artist(legend)
    line, = ax.plot(numpy.NaN,numpy.NaN,color='none',label=label)
    label_legend = ax.legend(handles=[line],loc=loc,handlelength=0,handleheight=0,handletextpad=0,borderaxespad=0,borderpad=borderpad,frameon=False,**kwargs)
    label_legend.remove()
    ax.add_artist(label_legend)
    line.remove()

fig,ax = plt.subplots()
ax.plot([1,2],[1,2])
setlabel(ax, '(a)')
plt.show()

Положением метки можно управлять с помощью аргумента loc, расстоянием до оси можно управлять с помощью аргумента borderpad (отрицательное значение выталкивает метку за пределы фигуры), также можно использовать другие параметры, доступные для legend, такие как fontsize . Приведенный выше скрипт дает такую ​​цифру: setlabel

person Hongcheng Ni    schedule 13.06.2017

Очень быстрый способ сделать это — воспользоваться тем фактом, что chr() преобразует целые числа в символы. Поскольку a-z попадают в диапазон 97–122, можно сделать следующее:

import matplotlib.pyplot as plt

fig,axs = plt.subplots(2,2)
for i,ax in enumerate(axs.flat, start=97):
  ax.plot([0,1],[0,1])
  ax.text(0.05,0.9,chr(i)+')', transform=ax.transAxes)

который производит:

подсюжеты

person compuphys    schedule 22.04.2020