pandas 直方图:将每列的直方图绘制为大图的子图

问题描述 投票:0回答:4

我正在使用以下代码,尝试将我的 pandas 数据框 df_in 的每一列的直方图绘制为大图的子图。

%matplotlib notebook
from itertools import combinations
import matplotlib.pyplot as plt

fig, axes = plt.subplots(len(df_in.columns) // 3, 3, figsize=(12, 48))
for x in df_in.columns:
    df_in.hist(column = x, bins = 100)

fig.tight_layout()

但是,直方图没有显示在子图中。有人知道我错过了什么吗?谢谢!

python pandas histogram
4个回答
14
投票

我无法评论布尔汉的回答,因为我没有足够的声誉点。他的答案的问题在于

axes
不是一维的,它包含轴三元组,因此需要展开:

%matplotlib notebook
from itertools import combinations
import matplotlib.pyplot as plt

fig, axes = plt.subplots(len(df_in.columns)//3, 3, figsize=(12, 48))

i = 0
for triaxis in axes:
    for axis in triaxis:
        df_in.hist(column = df_in.columns[i], bins = 100, ax=axis)
        i = i+1

7
投票
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

fig, axis = plt.subplots(2,3,figsize=(8, 8))
df_in.hist(ax=axis)

上面将绘制一个 2*3(数据帧总共 6 个直方图)。根据您的排列要求调整行和列(列数)

我的助教 @Benjamin 曾经告诉我,dataframe 意味着不必使用 for 循环。


3
投票

您需要指定要绘制到哪个轴。这应该有效:

fig, axes = plt.subplots(len(df_in.columns)//3, 3, figsize=(12, 48))
for col, axis in zip(df_in.columns, axes):
    df_in.hist(column = col, bins = 100, ax=axis)

0
投票

偶然发现了这篇古老的帖子,我想我应该添加一个正确的答案,上面的答案大多是正确的,但忽略了他们需要+1地板功能的事实。在 @burhan 的回答中有所解决,但只是在这里清理了一下:

import seaborn as sns
from matplotlib import pyplot as plt

def plot_univariate_distributions(df, numcols=3, fig_kwargs = dict()):
    fig, axes = plt.subplots(1+len(df.columns)//numcols, numcols, **fig_kwargs)
    for col, ax in zip(df.columns, axes.flat):
        sns.histplot(df[col], ax=ax)
        ax.set_title(col, size=10)
    plt.tight_layout()

plot_univariate_distributions(mydf, fig_kwargs={'figsize':[10,5]})
© www.soinside.com 2019 - 2024. All rights reserved.