https://datawhalechina.github.io/pms50/#/chapter7/chapter7
边缘箱形图 (Marginal Boxplot)
边缘箱图与边缘直方图具有相似的用途。 然而,箱线图有助于精确定位 X 和 Y 的中位数、第25和第75百分位数。
导入所需要的库
import numpy as np # 导入numpy库 import pandas as pd # 导入pandas库 import matplotlib as mpl # 导入matplotlib库 import matplotlib.pyplot as plt import seaborn as sns # 导入seaborn库 %matplotlib inline # 在jupyter notebook显示图像
设定图像各种属性
large = 22; med = 16; small = 12 params = {'axes.titlesize': large, # 设置子图上的标题字体 'legend.fontsize': med, # 设置图例的字体 'figure.figsize': (16, 10), # 设置图像的画布 'axes.labelsize': med, # 设置标签的字体 'xtick.labelsize': med, # 设置x轴上的标尺的字体 'ytick.labelsize': med, # 设置整个画布的标题字体 'figure.titlesize': large} plt.rcParams.update(params) # 更新默认属性 plt.style.use('seaborn-whitegrid') # 设定整体风格 sns.set_style("white") # 设定整体背景风格
程序代码
# step1:导入数据
df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")
# step2:创建子图对象与网格
# 画布 fig = plt.figure(figsize = (16, 10), # 画布大小_(16, 10) dpi = 80) # 分辨率_80 # 网格 grid = plt.GridSpec(4, # 行数 4, # 列数 hspace = 0.5, # 行与行之间的间隔 wspace = 0.2) # 列与列之间的间隔
# step3:明确子图的位置
# 确定如图所示散点图的位置 ax_main = fig.add_subplot(grid[:-1, :-1]) # 确定如图所示右边边缘箱形图的位置 ax_right = fig.add_subplot(grid[:-1, -1], xticklabels = [], yticklabels = []) # 确定如图所示最底下边缘箱形图的位置 ax_bottom = fig.add_subplot(grid[-1, 0:-1], xticklabels = [], yticklabels = [])
# step4:散点图
ax_main.scatter('displ', # 横坐标 'hwy', # 纵坐标 s= df.cty * 5, # 设置点的尺寸 c = df.manufacturer.astype('category').cat.codes, # 颜色类别 alpha = 0.9, # 透明度 data = df, # 所使用的数据 cmap = 'tab10', # 调色板 edgecolors = 'gray', # 边框颜色 linewidths = 0.5) # 线宽
# step5:右边的箱线图
sns.boxplot(df.hwy, # 需要绘制的变量 ax = ax_right, # 绘制需要的子图 orient= 'v') # 方位__垂直
# step6:底部的箱线图
sns.boxplot(df.displ, # 需要绘制的变量 ax = ax_bottom, # 绘制需要的子图 orient = 'h') # 方位__水平
# step7:装饰图像
ax_main.set(title = 'Scatterplot with Histograms displ vs hwy', # 设置标题 xlabel = 'displ', # 横坐标名称 ylabel = 'hwy') # 纵坐标名称 ax_main.title.set_fontsize(20) # 设置标题字体大小 # xaxis.label__x坐标轴的标题 # yaxis.label__y坐标轴的标题 # xticklabel__x坐标轴的标尺 # yticklabel__y坐标轴的标尺 # 遍历每一个对象并且修改其字体大小 for item in ([ax_main.xaxis.label, ax_main.yaxis.label] + ax_main.get_xticklabels() + ax_main.get_yticklabels()): item.set_fontsize(14) # 修改字体大小 xlabels = ax_main.get_xticks().tolist() # 将散点图上的x坐标轴上的标尺提取后转换为list(一位小数) ax_main.set_xticklabels(xlabels) # 将xlabels中的数字设置为散点图上的坐标轴上的标尺 plt.show()
博文总结
seaborn.boxplot
seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,
orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True,
fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)
seaborn.boxplot 接口的作用是绘制箱形图以展现与类别相关的数据分布状况。
箱形图(或盒须图)以一种利于变量之间比较或不同分类变量层次之间比较的方式来展示定量数据的分布。图中矩形框显示数据集的上下四分位数,而矩形框中延伸出的线段(触须)则用于显示其余数据的分布位置,剩下超过上下四分位间距的数据点则被视为“异常值”。
输入数据可以通过多种格式传入,包括:
- 格式为列表,numpy数组或pandas Series对象的数据向量可以直接传递给
x
,y
和hue
参数。 - 对于长格式的DataFrame,
x
,y
,和hue
参数会决定如何绘制数据。 - 对于宽格式的DataFrame,每一列数值列都会被绘制。
- 一个数组或向量的列表。
在大多数情况下,可以使用numpy或Python对象,但更推荐使用pandas对象,因为与数据关联的列名/行名可以用于标注横轴/纵轴的名称。此外,您可以使用分类类型对变量进行分组以控制绘图元素的顺序。
此函数始终将其中一个变量视为分类,并在相关轴上的序数位置(0,1,... n)处绘制数据,即使数据属于数值类型或日期类型也是如此。
更多信息请参阅 教程。
参数:x, y, hue
:数据
或向量数据中的变量名称,可选
用于绘制长格式数据的输入。查看样例以进一步理解。
data
:DataFrame,数组,数组列表,可选
用于绘图的数据集。如果
x
和y
都缺失,那么数据将被视为宽格式。否则数据被视为长格式。
order, hue_order
:字符串列表,可选
控制分类变量(对应的条形图)的绘制顺序,若缺失则从数据中推断分类变量的顺序。
orient
:“v” | “h”,可选
控制绘图的方向(垂直或水平)。这通常是从输入变量的dtype推断出来的,但是当“分类”变量为数值型或绘制宽格式数据时可用于指定绘图的方向。
color
:matplotlib颜色,可选
所有元素的颜色,或渐变调色板的种子颜色。
palette
:调色板名称,列表或字典,可选
用于
hue
变量的不同级别的颜色。可以从color_palette()
得到一些解释,或者将色调级别映射到matplotlib颜色的字典。
saturation
:float,可选
控制用于绘制颜色的原始饱和度的比例。通常大幅填充在轻微不饱和的颜色下看起来更好,如果您希望绘图颜色与输入颜色规格完美匹配可将其设置为
1
。
width
:float,可选
不使用色调嵌套时完整元素的宽度,或主要分组变量一个级别的所有元素的宽度。
dodge
:bool,可选
使用色调嵌套时,元素是否应沿分类轴移动。
fliersize
:float,可选
用于表示异常值观察的标记的大小。
linewidth
:float,可选
构图元素的灰线宽度。
whis
:float,可选
控制在超过高低四分位数时IQR的比例,因此需要延长绘制的触须线段。超出此范围的点将被识别为异常值。
notch
:boolean,可选
是否使矩形框“凹陷”以指示中位数的置信区间。还有其他几个参数可以控制凹槽的绘制方式;参见
plt.boxplot
以查看关于此问题的更多帮助信息。
ax
:matplotlib轴,可选
绘图时使用的Axes轴对象,否则使用当前Axes轴对象。
kwargs
:键,值映射
其他在绘图时传给
plt.boxplot
的参数。
返回值:ax
:matplotlib轴
返回Axes对轴象,并在其上绘制绘图。