第五章. 可视化数据分析图
本节主要介绍常用图表的绘制,主要包括箱形图,3D柱形图,3D曲面图。
·箱形图又称箱线图、盒须图或盒式图
·用于显示一组数据分散情况的统计图
·优点:不受异常值的影响,可以以一种相对稳定的方式描述数据的离散分布情况,也常用于异常值的识别
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_ticks=True, autorange=False, zorder=None, *, data=None
参数说明:
x:指定要绘制箱形图的数据
notch:是否以凹口的形式展现箱形图,默认False
sym:指定异常点的形状,默认‘+’
vert:是否需要将箱形图垂直摆放,默认True
whis:指定上下限与上下四分位的距离,默认1.5倍的四分位差
positions :指定箱形图的位置,默认位[0,1,2…]
widths:指定箱形图的宽度,默认为0.5
patch_artist:是否填充箱体的颜色
meanline:是否用线的形式表示均值,默认用点
showmeans: 是否显示均值,默认False
showcaps:是否显示箱形图顶端和末端的两条线,默认True
showbox:是否显示箱形图的箱体,默认True
showfliers:是否显示异常值,默认True
boxprops:设置箱子的属性,如边框色,填充色
labels:为箱体填充标签,类似于图例
flierprops: 设置异常值的属性,如异常点的形状,颜色,填充色
medianprops:设置中位数的属性,如线的类型,颜色
meanprops: 设置均值的属性,如点的大小,颜色
capprops:设置箱形图顶端和末端线条的属性,如颜色,粗线
whiskerprops:设置必须的属性,如颜色,粗细,线的类型等
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('F:\\Note\\清单.xlsx', sheet_name='Sheet6')
plt.boxplot(x=df['value'], whis=1.5, widths=0.5, patch_artist=True, showmeans=True, boxprops={'facecolor': 'c'},
flierprops={'markerfacecolor': 'red', 'markersize': 4},
meanprops={'marker': '*', 'markerfacecolor': 'skyblue'}, medianprops={'linestyle': '--', 'color': 'orange'},
capprops={'color': 'r'})
Q1 = df['value'].quantile(q=0.25)
Q2 = df['value'].quantile(q=0.5)
Q3 = df['value'].quantile(q=0.75)
low_limit = Q1 - 1.5 * (Q3 - Q1)
upper_limit = Q3 + 1.5 * (Q3 - Q1)
print('下四分位数:', Q1)
print('中位数:', Q2)
print('上四分位数:', Q3)
print('下限:', low_limit)
print('上限:', upper_limit)
# 查找异常值
val = df['value'][(df['value'] > upper_limit) | (df['value'] < low_limit)]
print('数据中的异常值:', val)
#显示图像
plt.show()
名词说明:
·下四分位数:指数据的25%分位点所对应的值(Q1)
·中位数:指数据的50%分位点所对应的值(Q2)
·上四分位数:指数据的75%分位点所对应的值(Q3)
·上限:上限=Q3+1.5*(Q3-Q1)
·下限:下限=Q1-1.5*(Q3-Q1)
·异常值的判定标准:当变量的数据值大于上限或小于下限时,判定为异常值
计算方法:
1).数据集:7,36,15,39,41,40
2).按从小到大的顺序对数据集进行排列:7,15,36,39,40,41
3)确定四分位数索引位置的根据公式:1+(n-1)*数据的百分比分位点,在根据索引位置确定索引所对应的数据值(n是数据集的数量 n=6)
·Q1_position=1+(6-1)*0.25=2.25 (Q1在第二个数和第三个数之间)
·Q1_value=15+(36-15)*(2.25-2)=20.25
·Q2_position=1+(6-1)*0.5=3.5 (Q2在第三个数和第四个数之间)
·Q2_value=36+(39-36)*(3.5-3)=37.5
·Q3_position=1+(6-1)*0.75=4.75 (Q3在第四个数和第五个数之间)
·Q3_value=39+(40-39)*(4.75-4)=39.75
·上限=39.75+(39.75-20.25)*1.5=69
·下限=20.25-(39.75-20.25)*1.5=-9
极端异常值:
·极端上限:上限=Q3+3*(Q3-Q1)
·极端下限:下限=Q1-3*(Q3-Q1)
·极端异常值的判定标准:当变量的数据值大于极端上限或小于极端下限时,判定为极端异常值
mpl_toolkits.mplot3d.axes3d.bar(left, height, zs=0, zdir=‘z’, *args, **kwargs)
参数说明:
left:x轴数据集
height:柱子的高度
zs:z轴的数据集
zdir:可选参数{‘x’, ‘y’, ‘z’}, 默认: ‘z’
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
#创建画布
fig = plt.figure()
# 创建3D坐标系
axes3d = Axes3D(fig)
x = np.arange(0, 5)
zs = np.arange(1,15,5)
for z in zs:
y = np.random.randint(0, 100, size=5)
axes3d.bar(x, y, zs=z, zdir='x', color=['r', 'g', 'y', 'c'])
plt.xticks(zs, ['小明', '小美', '小强'])
plt.yticks(x, ['语文', '数学', '英语', '物理', '生物'])
plt.xlabel('姓名')
plt.ylabel('学科')
# 设置标题和图例
plt.title('学生成绩统计')
# 调整图表与画布边缘间距
plt.subplots_adjust(left=0.15, bottom=0.15, right=0.9, top=0.9)
# 坐标轴的刻度线向内显示还是向外显示
plt.tick_params(left=True, bottom=True, right=False, top=False)
plt.show()
mpl_toolkits.mplot3d.axes3d.plot_surface( X, Y, Z, *, norm=None, vmin=None,vmax=None, lightsource=None, **kwargs)
参数说明:
X, Y, Z,:2D数组形式的数据值
rstride:数组行距(步长大小)
cstride:数组列距(步长大小)
color:曲面块颜色
cmap:颜色块颜色映射
facecolors:单独曲面块表面颜色
norm:将值映射为颜色的 Nonnalize实例
vmin:映射的最小值
vmax:映射的最大值
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
#创建画布
fig = plt.figure()
# 创建3D坐标系
axes3d = Axes3D(fig)
x = np.arange(-5.0, 5.0,0.5)
y = np.arange(-3.0,3,0.5)
#返回list,对x,y数据进行网格化
X,Y=np.meshgrid(x,y)
Z1=np.sin(X)
Z2=np.sin(Y)
Z=(Z1-Z2)*2
surf=axes3d.plot_surface(X, Y, Z, cmap=plt.get_cmap('rainbow'))
# 设置标题
plt.title("3D曲面图")
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()