python 如何为Pandas数据框中的每列创建箱形图?

vuv7lop3  于 2023-02-18  发布在  Python
关注(0)|答案(3)|浏览(157)

我的数据框(Pandas的结构)看起来像上面的

现在我想在单独的画布上为每个特征绘制箱线图。分离条件是第一列。我有类似的直方图图(下面的代码),但我不能为箱线图绘制工作版本。

hist_params = {'normed': True, 'bins': 60, 'alpha': 0.4}
# create the figure
fig = plt.figure(figsize=(16,  25))
for n, feature in enumerate(features):
    # add sub plot on our figure
    ax = fig.add_subplot(features.shape[1] // 5 + 1, 6, n + 1)
    # define range for histograms by cutting 1% of data from both ends
    min_value, max_value = numpy.percentile(data[feature], [1, 99])
    ax.hist(data.ix[data.is_true_seed.values == 0, feature].values, range=(min_value, max_value), 
             label='ghost', **hist_params)
    ax.hist(data.ix[data.is_true_seed.values == 1, feature].values, range=(min_value, max_value), 
             label='true', **hist_params)
    ax.legend(loc='best')

    ax.set_title(feature)

以上代码生成的输出如下(仅附加了部分输出):

lxkprmvk

lxkprmvk1#

DataFrame.boxplot()很好地实现了自动化:

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

df = pd.DataFrame({'is_true_seed': np.random.choice([True, False], 10),
                   'col1': np.random.normal(size=10),
                   'col2': np.random.normal(size=10),
                   'col3': np.random.normal(size=10)})

   is_true_seed      col1      col2      col3
0         False -0.990041 -0.561413 -0.512582
1         False  0.825099  0.827453 -0.366211
2          True  0.083442 -1.199540  0.345792
3          True  0.065715  1.560029 -0.324501
4          True -1.699770 -0.270820 -1.380125

ax = df.boxplot(['col1', 'col2', 'col3'], 'is_true_seed', figsize=(10,  10))

第一个参数告诉Pandas要画哪一列,第二个参数告诉Pandas要按哪一列分组(你称之为分离条件),第三个参数告诉Pandas要画哪一个轴。
列出所有列(除了要分组的列)可能会很繁琐,但可以通过省略第一个参数来避免这种情况,然后必须显式地指定其他两个参数:

ax = df.boxplot(by='is_true_seed', figsize=(10,  10))
368yc8dk

368yc8dk2#

  • 一个月一次 *

如果要为每列创建单独的图,则可以迭代每列,并使用plt.figure()为每个图初始化一个新图形。

import matplotlib.pyplot as plt

for column in df:
    plt.figure()
    df.boxplot([column])

如果只想将所有列放入同一个箱线图中,则可以使用df.plot(kind='box')

roejwanj

roejwanj3#

如果您想使用Seaborn在一个图形中绘制所有这些数据,您可以先对数据框进行melt,然后再进行绘制。

import numpy as np
import pandas as pd
import seaborn as sns

df = pd.DataFrame({'is_true_seed': np.random.choice([True, False], 10),
                   'col1': np.random.normal(size=10),
                   'col2': np.random.normal(size=10),
                   'col3': np.random.normal(size=10)})

sns.boxplot(data = df.melt(), x = 'variable', y = 'value')

相关问题