Python Matplotlib-已创建绘图的子绘图

Python Matplotlib-已创建绘图的子绘图,python,pandas,matplotlib,subplot,Python,Pandas,Matplotlib,Subplot,我有一个函数,返回特定列的绘图 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"]]

我有一个函数,返回特定列的绘图

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")

我想制作4个这样的图,并将它们显示为2行2列的子图。但是如果我尝试

plt.figure()
plt.subplot(1,2,1)
nb
plt.subplot(1,2,2)
sn
我明白了

这显然不是我所期望的


提前谢谢你的帮助

您需要将绘制到现有轴上。因此,您的函数应采用轴作为输入:

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)

您需要将绘制到现有轴。因此,您的函数应采用轴作为输入:

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)

实际上,您的输出正是给定代码时所期望的:

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}
此外,您还可以将轴作为最重要的细节处理。您还可以
共享轴
,并使用其他几个参数和参数:


一个简单的工作示例将更好地识别问题并获得更好的答案。

实际上,您的输出正是给定代码时所期望的:

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}
此外,您还可以将轴作为最重要的细节处理。您还可以
共享轴
,并使用其他几个参数和参数:


一个简单的工作示例将更好地识别问题并获得更好的答案。

对于所显示的错误,代码仍然有点太复杂。也许可以把它缩短一些,并与a保持一致。代码并不是那么复杂。函数创建并返回一个条形图,如示例图像中显示的条形图。现在的问题是使用这个函数来创建子图。不要使用
plt.subplot(1,2,1)\n plt.bar(x,y)
使用这个:
plt.subplot(1,2,1)\n class\u分布(colname)
如果你想要四个图,你应该使用
plt.subplot(2,2,…)
。然后通过
plt.subplot(2,2,i)
选择其中一个子地块后,其中
i=(1,2,3,4)
需要绘制想要绘制的任何内容。它不起作用。我得到的输出与使用
plt的代码完全相同。子批(1,2,I)
对于所显示的错误,代码仍然有点太复杂。也许可以把它缩短一些,并与a保持一致。代码并不是那么复杂。函数创建并返回一个条形图,如示例图像中显示的条形图。现在的问题是使用这个函数来创建子图。不要使用
plt.subplot(1,2,1)\n plt.bar(x,y)
使用这个:
plt.subplot(1,2,1)\n class\u分布(colname)
如果你想要四个图,你应该使用
plt.subplot(2,2,…)
。然后通过
plt.subplot(2,2,i)
选择其中一个子地块后,其中
i=(1,2,3,4)
需要绘制想要绘制的任何内容。它不起作用。我得到的输出与使用
plt.subplot(1,2,I)