如何使用Pandas为整个矩阵生成单个箱线图
如何使用Pandas为整个矩阵生成单个箱线图
嗨,我来帮你搞定这个问题!你当前的代码会生成4个箱线图,是因为Pandas的boxplot()默认会对DataFrame的每一列单独统计并绘图。要给整个矩阵生成单个箱线图,关键是把所有数据合并成一个一维的数据集,再进行绘图操作,这里有两种简单的实现方式:
方法一:将数据展平为一维序列后绘图
把DataFrame里的所有数据通过flatten()展平成一维数组,再转成Pandas Series,之后调用boxplot()就会生成单个箱线图了:
import numpy as np import pandas as pd import matplotlib.pyplot as plt # 导入matplotlib用于显示图像 # 生成随机矩阵数据 data = np.random.random(size=(4,4)) df = pd.DataFrame(data) # 展平所有数据为一维序列 all_data = df.values.flatten() # 基于一维序列绘制单个箱线图 pd.Series(all_data).boxplot() plt.show() # 手动显示图像,有些环境可能不需要,但加上更保险
方法二:将宽格式数据转成长格式后绘图
用Pandas的melt()方法把原来的宽格式DataFrame转成长格式,指定统一的数值列,再针对这个列绘制箱线图:
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = np.random.random(size=(4,4)) df = pd.DataFrame(data) # 转换为长格式数据 long_format_df = df.melt(value_name='all_values') # 仅针对all_values列绘制箱线图 long_format_df.boxplot(column='all_values') plt.show()
简单说下原理:你原来的df.boxplot()会自动按列分组,每个列对应一个箱线图。而上面两种方法都把所有数据归到了同一个分组下,这样Pandas就只会生成一个包含所有数据分布的箱线图啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

