Matplotlib - Сюжет из уже созданных сюжетов - PullRequest
0 голосов
/ 19 января 2020

У меня есть функция, которая возвращает график для указанных c столбцов

def class_distribution(colname):
    df = tweets_best.groupby(["HandLabel", colname]).size().to_frame("size")
    df['percentage'] = df.groupby(level=0).transform(lambda x: (x / x.sum()).round(2))
    df_toPlot = df[["percentage"]]

    plot = df_toPlot.unstack().plot.bar()
    plt.legend(df_toPlot.index.get_level_values(level = 1))
    plt.title("{} predicted sentiment distribution".format(colname))
    plt.ylim((0,1))
    plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
    return plot.get_figure()

И пример вывода выглядит так

nb = class_distribution("Naive_Bayes")

example_output

Я хотел бы подготовить 4 таких графика и представить их в виде 2-х строк и 2-х столбцов. Однако, если я попытаюсь

plt.figure()
plt.subplot(1,2,1)
nb
plt.subplot(1,2,2)
sn

, я получу

example_output2

, что, очевидно, не то, что я ожидал бы

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 19 января 2020

На самом деле, вы получите именно то, что ожидаете, учитывая ваш код:

plt.figure()
plt.subplot(1,2,1)
nb
plt.subplot(1,2,2)
sn

В этой строке plt.subplot(1,2,1) вы указываете два графика в этом расположении: один ряд и два столбца, и размещение графика слева.

Определяет (1,2,1) (количество строк, количество столбцов, индекс для графика).

Поскольку вы хотите, чтобы вспомогательные участки располагались 2 на 2, укажите (2,2,i) где i - индекс. Это упорядочит ваши графики:

plt.figure()
plt.subplot(2,2,1)
{plot in upper left}
plt.subplot(2,2,2)
{plot in upper right}
plt.subplot(2,2,3)
{plot in lower left}
plt.subplot(2,2,4)
{plot in lower right}

Кроме того, вы можете обрабатывать оси как детали ImportanceOfBeingEarnest. Вы также можете share axes и использовать несколько других параметров и аргументов: https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.subplot.html

Минимальный рабочий пример поможет лучше определить проблему и получить лучшие ответы.

1 голос
/ 19 января 2020

Вам необходимо построить от до уже существующих осей. Таким образом, ваша функция должна принимать оси в качестве входных данных:

def class_distribution(colname, ax=None):
    ax = ax or plt.gca()

    df = ...  # create dataframe based on function input

    df.unstack().plot.bar(ax=ax)
    ax.legend(...)
    ax.set_title("{} predicted sentiment distribution".format(colname))
    ax.set_ylim((0,1))
    ax.yaxis.set_major_formatter(PercentFormatter(1))
    return ax

Затем вы можете создать фигуру и один или несколько вспомогательных участков для построения графика:

fig = plt.figure()

ax1 = fig.add_subplot(1,2,1)
class_distribution("colname1", ax=ax1)

ax2 = fig.add_subplot(1,2,2)
class_distribution("colname2", ax=ax2)
...