boxplot的绘制方法,seaborn库和pandas库、matplotlib库均提供相关的方法。但所有方法都离不开pandas数据格式DataFrame的转换。在这里介绍一下pandas库的绘制,及遇到的相关问题和解决方案。
一、 pandas盒形图绘制
一个简单的代码例子如下:
import pandas as pd
from pandas import DataFrame,Series
df = DataFrame(np.random.randn(10, 2), columns=['Col1', 'Col2'])
boxplot=df.boxplot()
考虑到实际过程中,例如横轴可能是身高、体重等等,可能较为复杂,写一个相对复杂的代码演示如下:
# -*- coding:utf-8 -*-
"""
绘制箱体图
Created on 2020.01.03 by Luan
"""
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
"""
generate data from min to max
"""
def list_generator(number, min, max):
dataList = list()
for i in range(1, number):
dataList.append(np.random.randint(min, max))
return dataList
#generate 4 lists to draw
list1 = list_generator(100, 20, 80)
list2 = list_generator(100, 20, 50)
list3 = list_generator(100, 50, 100)
list4 = list_generator(100, 5, 60)
data = pd.DataFrame({
"dataSet1":list1,
"dataSet2":list2,
"dataSet3":list3,
"dataSet4":list4,
})
#draw
data.boxplot()
plt.ylabel("ylabel")
plt.xlabel("different datasets")
plt.show()
二、 数据不等长报错问题
在考虑一个更复杂的情况,即图像的每一列的样本个数是不一样,按照上述字典转df格式,会出现一个问题,举个例子:
d = {'A': [1, 2], 'C': [1, 2, 3, 4]}
data = pd.DataFrame(d)
print(data)
报错如下:
ValueError: arrays must all be same length
将上述代码进行更改
c = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in d.items()]))
此时该错误得以解决。
三、 plotbox绘制时,横坐标的标签重合问题
官方pandas.DataFrame.boxplot解释如下:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.boxplot.html
参数说明如下:
column,默认为None,输入为str 或由str构成的list,其作用是指定要进行箱型图分析的列
by,默认为None,str or array-like,其作用为pandas的group by,通过指定by=‘columns’,可进行多组合箱型图分析
ax,matplotlib.axes.Axes的对象,没有太大作用
fontsize,箱型图坐标轴字体大小
rot,箱型图坐标轴旋转角度
grid,箱型图网格线是否显示
figsize,箱型图窗口尺寸大小
layout,必须配合by 一起使用,类似于subplot 的画布分区域功能
return_type,指定返回对象的类型,默认为None,可输入的参数为‘axes’,‘dict’,‘both’,当与by一起使用是,返回的对象为Series或array(for return_type = None)
输入代码为:
data.boxplot(rot='45')
此时,标签会以一个45度的倾角,避免了重合。