Matplotlib__Part02 基本图表绘制
绘制基本的图表
'''
【课程3.6】 基本图表绘制 plt.plot()
图表类别:线形图、柱状图、密度图,以横纵坐标两个维度为主
同时可延展出多种其他图表样式
plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None, legend=False,
style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds)
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
1.创建方式
1.1Series创建
ts = pd.Series(np.random.randn(50),index=pd.date_range('1/1/2000',periods=50))
ts = ts.cumsum()
# print(ts)
# plt.plot(ts) 或者
ts.plot(kind='line',
label='hehe',
style='--g',
color='red',
alpha=0.6,
use_index=True, # 是否使用index,如果是,就会将index用于坐标轴
rot=45, # x轴的标签文本的倾斜角度
grid=True,
ylim=[-10,10], # y轴坐标边界
yticks=list(range(-10,10,4)), # y轴坐标刻度
figsize=(8,4),
title='elementary',
legend = True) # 是否使用图例
#plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'x') # 网格
plt.legend()
# Series.plot():series的index为横坐标,value为纵坐标
# kind → line,bar,barh...(折线图,柱状图,柱状图-横...)
# label → 图例标签,Dataframe格式以列名为label
# style → 风格字符串,这里包括了linestyle(-),marker(.),color(g)
# color → 颜色,有color指定时候,以color颜色为准
# alpha → 透明度,0-1
# use_index → 将索引用为刻度标签,默认为True
# rot → 旋转刻度标签,0-360
# grid → 显示网格,一般直接用plt.grid
# xlim,ylim → x,y轴界限
# xticks,yticks → x,y轴刻度值
# figsize → 图像大小
# title → 图名
# legend → 是否显示图例,一般直接用plt.legend()
# 也可以 → plt.plot()
<matplotlib.legend.Legend at 0x15029e5f2e8>
1.2DataFrame创建
# Dataframe直接生成图表
df = pd.DataFrame(np.random.randn(1000,4),index=pd.date_range('2010/1/1',periods=1000),columns=list('ABCD'))
df = df.cumsum()
df.plot(
kind='line',
style='--',
alpha=0.6,
use_index=True,
colormap='Greens', # 色块
title='primary',
subplots=False, # 是否显示子图,选择True则按照columns将其拆分为4个子图
rot=45,
grid=True,
legend=True,
figsize=(8,4)
)
# subplots → 是否将各个列绘制到不同图表,默认False
# 也可以 → plt.plot(df)
<matplotlib.axes._subplots.AxesSubplot at 0x1502d173978>
2.柱状图,堆叠图
'''
【课程3.7】 柱状图、堆叠图
plt.plot(kind='bar/barh') , plt.bar()
'''
2.1柱状图
2.1.1 创建柱状图
# 柱状图与堆叠图
fig, axes = plt.subplots(4,1,figsize=(10,10)) # 创建一个4*1的figure画布,包含4个子图
# print(np.random.randint(0,10,16)) # [0,10)之间的整数,生成16个
s = pd.Series(np.random.randint(0,10,16),index=list('abcdefghijklmnop'))
df = pd.DataFrame(np.random.rand(10,3),columns=list('abc'))
# 单系列柱状图方法一:plt.plot(kind='bar/barh')
s.plot(kind='bar',color='k',grid=True,alpha=0.4,ax=axes[0]) # Series创建柱状图,填充到第一个子图
# 多系列柱状图
df.plot(kind='bar',grid=True,alpha=0.6,legend=True,colormap='Reds_r',ax=axes[1]) # DataFrame创建柱状图,填充到第二个子图
# 多系列堆叠图 stacked → 堆叠
df.plot(kind='bar',grid=True,alpha=0.9,legend=True,colormap='Reds_r',stacked=True,ax=axes[2]) # DateFrame创建堆叠图
# 新版本plt.plot.<kind> barh横向柱状图,bar纵向柱状图
df.plot.barh(ax = axes[3],grid = True,stacked=True,colormap = 'BuGn_r')
<matplotlib.axes._subplots.AxesSubplot at 0x150333a63c8>
2.1.2 柱状图添加text文本
# 柱状图 plt.bar() 使用这种方式绘制柱状图,优点,参数更多,更细节
plt.figure(figsize=(10,4))
x = np.arange(10)
y1 = np.random.rand(10)
y2 = -np.random.rand(10)
plt.bar(x=x,height=y1,width=1,facecolor='yellowgreen',edgecolor='white',yerr=y1*0.1,align='center')
plt.bar(x,y2,width=1,facecolor='lightskyblue',edgecolor='white',yerr=y2*0.1)
# x,y参数:x,y值
# width:宽度比例
# facecolor柱状图里填充的颜色、edgecolor是边框的颜色
# left-每个柱x轴左边界,bottom-每个柱y轴下边界 → bottom扩展即可化为甘特图 Gantt Chart
# align:决定整个bar图分布,纠正(默认是center 可选参数align='edge',表示从边缘开始绘制) 默认left表示默认从左边界开始绘制,center会将图绘制在中间位置
# xerr/yerr :x/y方向error bar 就是让y轴按照y*0.1显示之类
# 添加text文本
for i,j in zip(x,y1):
plt.text(i-0.3,j-0.15,' %.2f'%j,color='red')
for i,j in zip(x,y2):
plt.text(i-0.3,j+0.15,' %.2f'%j,color='red')
2.2 堆叠图
# print(np.linspace(0,0.5,5)) # 产生5个数值,包含头尾,所以步长为(0.5-0)/(5-1) = 0.125
# print(np.linspace(0,0.5,6)) # 产生6个数值,包含头尾,所以步长为(0.5)/(6-1) = 1
# 只要记住 n个数值(包含头尾)中会产生n-1个空格
# 外嵌图表plt.table()
# table(cellText=None, cellColours=None,cellLoc='right', colWidths=None,rowLabels=None, rowColours=None, rowLoc='left',
# colLabels=None, colColours=None, colLoc='center',loc='bottom', bbox=None)
data = [[ 66386, 174296, 75131, 577908, 32015],
[ 58230, 381139, 78045, 99308, 160454],
[ 89135, 80552, 152558, 497981, 603535],
[ 78415, 81858, 150656, 193263, 69638],
[139361, 331509, 343164, 781380, 52269]]
columns = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
rows = ['%d year' % x for x in (100, 50, 20, 10, 5)]
df = pd.DataFrame(data,columns = columns, index = rows)
print(df)
# 创建堆叠图
df.plot(kind='bar',stacked=True,legend=True,colormap='Blues_r',grid=True,figsize=(8,3))
plt.legend(loc='upper left')
plt.table(cellText=data, cellColours=None,
cellLoc='center', colWidths=None,
rowLabels=rows, rowColours=plt.cm.BuPu(np.linspace(0, 0.5,5))[::-1], # BuPu可替换成其他colormap
rowLoc='right', # 行标签靠右对齐
colLabels=columns, colColours=plt.cm.Reds(np.linspace(0, 0.5,5))[::-1]
, colLoc='center', # 列标签居中对齐
loc='bottom', bbox=None)
# cellText:表格文本
# cellLoc:cell内文本对齐位置
# rowLabels:行标签
# colLabels:列标签
# rowLoc:行标签对齐位置
# loc:表格位置 → left,right,top,bottom
plt.xticks([])
# 不显示x轴标注
Freeze Wind Flood Quake Hail
100 year 66386 174296 75131 577908 32015
50 year 58230 381139 78045 99308 160454
20 year 89135 80552 152558 497981 603535
10 year 78415 81858 150656 193263 69638
5 year 139361 331509 343164 781380 52269
([], <a list of 0 Text xticklabel objects>)
3.面积图、填图、饼图
'''
【课程3.8】 面积图、填图、饼图
plt.plot.area()
plt.fill(), plt.fill_between()
plt.pie()
'''
3.1 面积图
# 面积图 面积图就是填充之后的折线图
fig, axes = plt.subplots(2,1,figsize=(8,6))
df1 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
df1.plot.area(colormap='Greens_r',alpha=0.5,ax=axes[0])
df2.plot.area(colormap='Set2',alpha=0.5,stacked=False,ax=axes[1])
# 使用Series.plot.area()和DataFrame.plot.area()创建面积图
# stacked:是否堆叠,默认情况下,区域图被堆叠
# 为了产生堆积面积图,每列必须是正值或全部负值!
# 当数据有NaN时候,自动填充0,所以图标签需要清洗掉缺失值
<matplotlib.axes._subplots.AxesSubplot at 0x15035f7f550>
3.2 填图
# 填图 填图就是填充线图和某一标准线之前的区域
fig, axes = plt.subplots(2,1,figsize=(8,6))
x = np.linspace(0, 1, 500)
y1 = np.sin(4 * np.pi * x) * np.exp(-5 * x)
y2 = -np.sin(4 * np.pi * x) * np.exp(-5 * x)
axes[0].fill(x,y1,'r',alpha=0.5,label='y1')
axes[0].fill(x,y2,'g',alpha=0.5,label='y2')
# 对函数与坐标轴之间的区域进行填充,使用fill函数
# 也可写成:plt.fill(x, y1, 'r',x, y2, 'g',alpha=0.5)
x = np.linspace(0, 5 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.sin(2 * x)
axes[1].fill_between(x,y1,y2,color='b',alpha=0.5,label='area') # 这里的label指的是填充的区域
# 填充两个函数之间的区域,使用fill_between函数
for i in range(2):
axes[i].legend()
axes[i].grid()
# 添加图例、格网
3.3 饼图
# 饼图 plt.pie()
# plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
# radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None)
s = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
plt.axis('equal') # 保证长宽相等
plt.pie(s,
explode = [0.1,0.3,0,0], # 指定每部分的偏移量
labels = s.index,
colors=['r', 'g', 'b', 'c'],
autopct='%.2f%%', # 面饼上的数据标签显示格式
pctdistance=0.6, # 面饼上的数据标签里圆形的距离
labeldistance = 1.2, # 面饼外的label离中心的距离
shadow = True,
startangle=0,
radius=2, # 整个面饼的半径
frame=False)
print(s)
# 第一个参数:数据
# explode:指定每部分的偏移量
# labels:标签
# colors:颜色
# autopct:饼图上的数据标签显示方式
# pctdistance:每个饼切片的中心和通过autopct生成的文本开始之间的比例
# labeldistance:被画饼标记的直径,默认值:1.1
# shadow:阴影
# startangle:开始角度
# radius:半径
# frame:图框
# counterclock:指定指针方向,顺时针或者逆时针
a 2.147834
b 0.994587
c 1.427921
d 0.458101
Name: series, dtype: float64
4.直方图
4.1直方图+密度图
'''
【课程3.9】 直方图
plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None,
histtype='bar', align='mid', orientation='vertical',rwidth=None, log=False, color=None, label=None,
stacked=False, hold=None, data=None, **kwargs)
'''
# 直方图+密度图
# 直方图和柱状图的区别:柱状图仅仅是显示数据,而直方图显示的是数据的分布情况,经常和密度图一起出现
s = pd.Series(np.random.randn(1000))
s.hist(
bins=20,
histtype='stepfilled',
align='mid',
orientation='vertical',
alpha=0.5,
# normed=True #时了
density=True
)
# bin:箱子的宽度 如果区间是[-3,3] bin位20,那么会有20个区间
# histtype 风格,bar,barstacked,step,stepfilled
# orientation 水平还是垂直{‘horizontal’, ‘vertical’}
# align : {‘left’, ‘mid’, ‘right’}, optional(对齐方式)
# normed 标准化
# 加入密度曲线图
s.plot(kind='kde',style='k--')
<matplotlib.axes._subplots.AxesSubplot at 0x1506ed43e10>
4.2面积到相加为1的直方图
# 得到相加为1的直方图
data = np.random.rand(100)
y, x = np.histogram(data, bins=10, density=False)
y = y.astype(float) / y.sum()
print(y)
print(x)
print(x[1]-x[0])
plt.bar(x[:-1], y, width=x[1]-x[0], color='g')
plt.show()
[0.17 0.1 0.11 0.11 0.06 0.11 0.09 0.08 0.06 0.11]
[0.00614327 0.10509281 0.20404235 0.30299189 0.40194143 0.50089097
0.59984051 0.69879005 0.79773959 0.89668913 0.99563867]
0.09894954048719008
4.3 堆叠直方图
# 堆叠直方图
plt.figure(num=1)
df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
'c': np.random.randn(1000) - 1, 'd': np.random.randn(1000)-2},
columns=['a', 'b', 'c','d'])
df.plot.hist(stacked=True,
bins=20,
colormap='Greens_r',
alpha=0.5,
grid=True)
# 使用DataFrame.plot.hist()和Series.plot.hist()方法绘制
# stacked:是否堆叠
df.hist(bins=50)
# 生成多个直方图
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000001506F909518>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001506F87AF98>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000001506F8AE0B8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001506F9D6320>]],
dtype=object)
<Figure size 432x288 with 0 Axes>
5.散点图、矩阵散点图
'''
【课程3.10】 散点图、矩阵散点图
plt.scatter(), pd.scatter_matrix()
'''
5.1 散点图
# plt.scatter()散点图
# plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None,
# alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)
plt.figure(figsize=(8,6))
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x,y,marker='.',
s = np.random.randn(1000)*100, # 用点的大小表示一个维度,由s对应的值决定
cmap = 'Reds',
c = y, # 用点上面颜色的深浅表示另一个维度,由c所对应的值决定
alpha = 0.8,)
plt.grid()
# s:散点的大小
# c:散点的颜色
# vmin,vmax:亮度设置,标量
# cmap:colormap
5.2 散点矩阵
# pd.scatter_matrix()散点矩阵
# pd.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None,
# grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwds)
df = pd.DataFrame(np.random.randn(100,4),columns = ['a','b','c','d'])
# 比较各个columns之间散点图的对应关系,注意:这个方法是pd自带的方法
pd.plotting.scatter_matrix(df,figsize=(10,6),
marker = 'o',
diagonal='kde',
alpha = 0.5,
range_padding=0.1)
# diagonal:({‘hist’, ‘kde’}),必须且只能在{‘hist’, ‘kde’}中选择1个 → 每个指标的频率图,hist就是直方图显示
# range_padding:(float, 可选),图像在x轴、y轴原点附近的留白(padding),该值越大,留白距离越大,图像远离坐标原点
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070D96710>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070DC5710>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070E275F8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070E50860>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070E77AC8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070EA0D30>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070EC26A0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070EEA940>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070EEA978>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070F3CDD8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070F6E080>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070F952E8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070FBB550>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000015070FE49B0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001507100EF28>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001507103C4E0>]],
dtype=object)
5.3 极坐标图的创建
'''
【课程3.11】 极坐标图
调用subplot()创建子图时通过设置projection='polar',便可创建一个极坐标子图,然后调用plot()在极坐标子图中绘图
'''
# 创建极坐标轴
# 横坐标为角度,纵坐标标为值,一周是2pi = 3.14*2= 6.28
s = pd.Series(np.arange(20))
theta=np.arange(0,2*np.pi,0.02) # 这是创建了 2*3.14/0.02个点,所有看起来像弧线
print(s.head())
print(theta[:10])
# 创建数据
fig = plt.figure(figsize=(8,4))
ax1 = plt.subplot(121, projection = 'polar') # projection = 'polar' 指定为极坐标系
ax2 = plt.subplot(122)
# 创建极坐标子图
# 还可以写:ax = fig.add_subplot(111,polar=True)
ax1.plot(theta,theta*3,linestyle = '--',lw=1)
ax1.plot(s, linestyle = '--', marker = '.',lw=2)
ax2.plot(theta,theta*3,linestyle = '--',lw=1)
ax2.plot(s)
plt.grid()
# 创建极坐标图,参数1为角度(弧度制),参数2为value
# lw → 线宽
0 0
1 1
2 2
3 3
4 4
dtype: int32
[0. 0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16 0.18]
5.4 极坐标参数设置
# 极坐标参数设置
theta=np.arange(0,2*np.pi,0.02)
plt.figure(figsize=(8,4))
ax1= plt.subplot(121, projection='polar')
ax2= plt.subplot(122, projection='polar')
ax1.plot(theta,theta/6,'--',lw=2)
ax2.plot(theta,theta/6,'--',lw=2)
# 创建极坐标子图ax
ax2.set_theta_direction(-1)
# set_theta_direction():坐标轴正方向,默认逆时针
ax2.set_thetagrids(np.arange(0.0, 360.0, 90),['a','b','c','d'])
ax2.set_rgrids(np.arange(0,2,0.4))
# set_thetagrids():设置极坐标角度网格线显示及标签 → 网格和标签数量一致
# set_rgrids():设置极径网格线显示,其中参数必须是非负数
ax2.set_theta_offset(np.pi/2)
# set_theta_offset():设置角度偏移,逆时针,弧度制
ax2.set_rlim(0.2,1.2) #从半径0.2开始显示,主要的还是影响的起点的数据,如果起始位置n大于等于set_rgrids中设置的网格线的起始位置,那么小于n的网格线都不会显示
ax2.set_rmax(2) # 圆的半径最大为2
# ax2.set_rticks(np.arange(0.1, 1.5, 0.2)) # 设置网格线显示范围 对set_rlim的起始位置有影响 对set_rgrids也有影响
# set_rlim():设置显示的极径范围
# set_rmax():设置显示的极径最大值
# set_rticks():设置极径网格线的显示范围
5.5 极坐标的折线图/填图
# 雷达图1 - 极坐标的折线图/填图 - plt.plot()
plt.figure(figsize=(8,4))
ax1= plt.subplot(111, projection='polar')
ax1.set_title('radar map\n') # 创建标题
ax1.set_rlim(0,12)
data1 = np.random.randint(1,10,10)
data2 = np.random.randint(1,10,10)
data3 = np.random.randint(1,10,10)
theta=np.arange(0,2*np.pi,2*np.pi/10)
# 创建数据
ax1.plot(theta,data1,'.--',label='data1')
ax1.fill(theta,data1,alpha=0.2)
ax1.plot(theta,data2,'.--',label='data2')
ax1.fill(theta,data2,alpha=0.2)
ax1.plot(theta,data3,'.--',label='data3')
ax1.fill(theta,data3,alpha=0.2)
# 绘制雷达线
[<matplotlib.patches.Polygon at 0x1506f674668>]
5.6 通过极坐标坐雷达图
# 雷达图2 - 极坐标的折线图/填图 - plt.polar()
# 首尾闭合
labels = np.array(['a','b','c','d','e','f']) # 标签
dataLenth = 6 # 数据长度
data1 = np.random.randint(0,10,6)
data2 = np.random.randint(0,10,6) # 数据
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) # 分割圆周长
data1 = np.concatenate((data1, [data1[0]])) # 闭合 扩充,将6个值变成7个值
data2 = np.concatenate((data2, [data2[0]])) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
plt.polar(angles, data1, 'o-', linewidth=1) #做极坐标系 # 直接使用plt.polar创建雷达图
plt.fill(angles, data1, alpha=0.25)# 填充
plt.polar(angles, data2, 'o-', linewidth=1) #做极坐标系
plt.fill(angles, data2, alpha=0.25)# 填充
plt.thetagrids(angles * 180/np.pi, labels) # 设置网格、标签
plt.ylim(0,10) # polar的极值设置为ylim
(0, 10)
5.7 极坐标上的柱状图
# 极轴图 - 极坐标的柱状图
plt.figure(figsize=(8,4))
ax1= plt.subplot(111, projection='polar')
ax1.set_title('radar map\n') # 创建标题
ax1.set_rlim(0,12)
data = np.random.randint(1,10,10)
theta=np.arange(0,2*np.pi,2*np.pi/10) #除数是根据数据量来的,有多少数据就除以多少
# 创建数据
bar = ax1.bar(theta,data,alpha=0.5)
for r,bar in zip(data, bar):
bar.set_facecolor(plt.cm.jet(r/10.)) # 设置颜色
plt.thetagrids(np.arange(0.0, 360.0, 90), []) # 设置网格、标签(这里是空标签,则不显示内容)
(<a list of 8 Line2D thetagridline objects>,
<a list of 4 Text thetagridlabel objects>)
6.箱型图
- 什么是箱形图?
https://blog.youkuaiyun.com/qq_40587575/article/details/80215776
6.1箱型图的简单绘制
'''
【课程3.12】 箱型图
箱型图:又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图
包含一组数据的:最大值、最小值、中位数、上四分位数(Q3)、下四分位数(Q1)、异常值
① 中位数 → 一组数据平均分成两份,中间的数
② 上四分位数Q1 → 是将序列平均分成四份,计算(n+1)/4与(n-1)/4两种,一般使用(n+1)/4
③ 下四分位数Q3 → 是将序列平均分成四份,计算(1+n)/4*3=6.75
④ 内限 → T形的盒须就是内限,最大值区间Q3+1.5IQR,最小值区间Q1-1.5IQR (IQR=Q3-Q1)
⑤ 外限 → T形的盒须就是内限,最大值区间Q3+3IQR,最小值区间Q1-3IQR (IQR=Q3-Q1)
⑥ 异常值 → 内限之外 - 中度异常,外限之外 - 极度异常
plt.plot.box(),plt.boxplot()
'''
# plt.plot.box()绘制
fig,axes = plt.subplots(2,1,figsize=(10,6))
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
# 箱型图着色
# boxes → 箱线
# whiskers → 分位数与error bar横线之间竖线的颜色
# medians → 中位数线颜色
# caps → error bar横线颜色
df.plot.box(ylim=[0,1.2],
grid = True,
color = color,
ax = axes[0])
# color:样式填充
df.plot.box(vert=False,
positions=[1, 4, 5, 6, 8], # 表示'A', 'B', 'C', 'D', 'E'各个columns在轴上的位置,数值越大,位置越高
ax = axes[1],
grid = True,
color = color)
# vert:是否垂直,默认True
# position:箱型图占位
<matplotlib.axes._subplots.AxesSubplot at 0x15039017390>
6.2箱型图的参数设置
# plt.boxplot()绘制
# pltboxplot(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_xticks=True, autorange=False,
# zorder=None, hold=None, data=None)
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
plt.figure(figsize=(10,4))
# 创建图表、数据
f = df.boxplot(sym = 'o', # 异常点形状,参考marker
vert = True, # 是否垂直
whis = 1.5, # IQR,默认1.5 代表内限,也可以设置成3,代表外限,也可以设置区间比如[5,95],代表强制上下边缘为数据95%和5%位置
patch_artist = True, # 上下四分位框内是否填充,True为填充
meanline = False,showmeans=True, # 是否有均值线及其形状
showbox = True, # 是否显示箱线
showcaps = True, # 是否显示边缘线
showfliers = True, # 是否显示异常值
notch = False, # 中间箱体是否缺口
return_type='dict' # 返回类型为字典
)
plt.title('boxplot')
print(f)
# 设置每个部分的更多细节
for box in f['boxes']:
box.set( color='b', linewidth=1) # 箱体边框颜色
box.set( facecolor = 'b' ,alpha=0.5) # 箱体内部填充颜色
for whisker in f['whiskers']:
whisker.set(color='k', linewidth=0.5,linestyle='-')
for cap in f['caps']:
cap.set(color='gray', linewidth=2)
for median in f['medians']:
median.set(color='DarkBlue', linewidth=2)
for flier in f['fliers']:
flier.set(marker='o', color='y', alpha=0.5)
# boxes, 箱线
# medians, 中位值的横线,
# whiskers, 从box到error bar之间的竖线.
# fliers, 异常值
# caps, error bar横线
# means, 均值的横线,
{'whiskers': [<matplotlib.lines.Line2D object at 0x00000150392AE588>, <matplotlib.lines.Line2D object at 0x00000150392AE978>, <matplotlib.lines.Line2D object at 0x00000150392B9F60>, <matplotlib.lines.Line2D object at 0x00000150392C3390>, <matplotlib.lines.Line2D object at 0x00000150392CF978>, <matplotlib.lines.Line2D object at 0x00000150392CFD68>, <matplotlib.lines.Line2D object at 0x0000015039120390>, <matplotlib.lines.Line2D object at 0x0000015039120780>, <matplotlib.lines.Line2D object at 0x000001503912BD68>, <matplotlib.lines.Line2D object at 0x000001503912BEB8>], 'caps': [<matplotlib.lines.Line2D object at 0x0000015039267CF8>, <matplotlib.lines.Line2D object at 0x00000150392AEDA0>, <matplotlib.lines.Line2D object at 0x00000150392C36D8>, <matplotlib.lines.Line2D object at 0x00000150392C3A20>, <matplotlib.lines.Line2D object at 0x00000150392CFE48>, <matplotlib.lines.Line2D object at 0x0000015039118438>, <matplotlib.lines.Line2D object at 0x0000015039120AC8>, <matplotlib.lines.Line2D object at 0x0000015039120E10>, <matplotlib.lines.Line2D object at 0x00000150391364E0>, <matplotlib.lines.Line2D object at 0x0000015039136828>], 'boxes': [<matplotlib.patches.PathPatch object at 0x00000150392AE320>, <matplotlib.patches.PathPatch object at 0x00000150392B9D30>, <matplotlib.patches.PathPatch object at 0x00000150392CF748>, <matplotlib.patches.PathPatch object at 0x0000015039120160>, <matplotlib.patches.PathPatch object at 0x000001503912BB38>], 'medians': [<matplotlib.lines.Line2D object at 0x00000150392B9390>, <matplotlib.lines.Line2D object at 0x00000150392C3D68>, <matplotlib.lines.Line2D object at 0x0000015039118780>, <matplotlib.lines.Line2D object at 0x0000015039120EF0>, <matplotlib.lines.Line2D object at 0x0000015039136B70>], 'fliers': [<matplotlib.lines.Line2D object at 0x00000150392B9A20>, <matplotlib.lines.Line2D object at 0x00000150392CF438>, <matplotlib.lines.Line2D object at 0x0000015039118E10>, <matplotlib.lines.Line2D object at 0x000001503912B828>, <matplotlib.lines.Line2D object at 0x0000015039136F60>], 'means': [<matplotlib.lines.Line2D object at 0x00000150392B96D8>, <matplotlib.lines.Line2D object at 0x00000150392C3E48>, <matplotlib.lines.Line2D object at 0x0000015039118AC8>, <matplotlib.lines.Line2D object at 0x000001503912B4E0>, <matplotlib.lines.Line2D object at 0x0000015039136EB8>]}
6.3箱型图的分组汇总
# plt.boxplot()绘制
# 分组汇总
df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
print(df
# plt.boxplot()绘制
# 分组汇总
df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
print(df)
df.boxplot(by = 'X') # 按照X字段进行分组汇总,按照X字段分成A B组,显示Col1对应的A、B组的的信息和Col2对应的A、B组的的信息
df.boxplot(column=['Col1','Col2'], by=['X','Y']) # 看到Col1和Col2对应的XY字段联合分组后的箱形图信息
# columns:按照数据的列分子图
# by:按照列分组做箱型图
Col1 Col2 X Y
0 0.195281 0.993670 A A
1 0.584688 0.469348 A B
2 0.054851 0.680496 A A
3 0.512132 0.819512 A B
4 0.201062 0.597924 A A
5 0.912829 0.736956 B B
6 0.016214 0.679446 B A
7 0.921317 0.059050 B B
8 0.503442 0.281322 B A
9 0.145872 0.759193 B B
array([<matplotlib.axes._subplots.AxesSubplot object at 0x00000150394051D0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x00000150394F0F60>],
dtype=object)