首页 > 解决方案 > 子图 python Matplotlib 不使用 groupby().sum()

问题描述

在这段代码中,我尝试在一个图中显示相同的图 4 次。

faiGraficoBarh( parolePerAutore(dfPulito), 'message for every person','x','y', 2,2,1) 
faiGraficoBarh( parolePerAutore(dfPulito), 'message for every person','x','y', 2,2,2) 
faiGraficoBarh( parolePerAutore(dfPulito), 'message for every person','x','y', 2,2,3) 
faiGraficoBarh( parolePerAutore(dfPulito), 'message for every person','x','y', 2,2,4) 
plt.show()

parolePerAutoreMethod返回一个数据框:

def parolePerAutore(df):
   return df[['author', 'wordCount', 'letterCount']].groupby('author').sum()

制作情节的方法faiGraficoBarh是:

def faiGraficoBarh(table, titolo , x ,y, nrow, ncol, fig):
   plt.subplot(nrow,ncol,fig)
   table.head(10).plot.barh()
   plt.title(titolo)
   plt.xlabel(x)
   plt.ylabel(y)

问题在于plt.show它生成 5 个图形后:一个包含绘图,4 个仅包含 4 个不同位置的轴。 这是我看到的一个例子

标签: pythonpython-3.xpandasmatplotlib

解决方案


当您有多个子图时,熊猫图需要ax绘制。最简单的解决方案是使用“当前斧头”,如table.head(10).plot.barh(ax=plt.gca()). 当前的斧头由plt.subplot()命令更改。

请注意,该subplot()函数是一个旧结构,类似于 Matlab 的。在较新版本的 matplotlib 中有plt.subplots更易于管理的参数,它可以创建图形和轴。还有一个参数gridspec_kw={'hspace': 0.4, 'wspace': 0.15})可以用来控制子图之间的间距。gridspec_kw=还允许创建不同大小的子图。can的一个有趣参数plt.subplotssharex=True,使所有子图都具有相同的 x 轴,因此比较具有不同条形长度的图会更容易。

您可以按如下方式使用该构造:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

def faiGraficoBarh(table, titolo, x, y, ax):
    table.head(10).plot.barh(ax=ax)
    ax.set_title(titolo)
    ax.set_xlabel(x)
    ax.set_ylabel(y)

def parolePerAutore(dfPulito):
    return pd.DataFrame({'words': np.random.uniform(1, 10, 10), 'letters': np.random.uniform(1, 10, 10)},
                        index=list('ABCDEFGHIJ'))

dfPulito = None  # we're just working for dummy data

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 5),
                         gridspec_kw={'hspace': 0.4, 'wspace': 0.15})

faiGraficoBarh(parolePerAutore(dfPulito), 'message for every person', 'x', 'y', axes[0][0])
faiGraficoBarh(parolePerAutore(dfPulito), 'message for every person', 'x', 'y', axes[0][1])
faiGraficoBarh(parolePerAutore(dfPulito), 'message for every person', 'x', 'y', axes[1][0])
faiGraficoBarh(parolePerAutore(dfPulito), 'message for every person', 'x', 'y', axes[1][1])

plt.show()

推荐阅读