Matplotlib

1
import matplotlib.pyplot as plt

绘制流程

  1. 创建画布 plt.figure()

    1
    2
    3
    4
    plt.figure(figsize=(), dpi=)
    # figsize:指定图的长宽
    # dpi:图像的清晰度
    # 返回fig对象
  2. 绘制图形

    1
    2
    # 以折线图为例子
    plt.plot(x,y)
  3. 显示图像

折线图——

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
# 1.创建画布
plt.figure(figsize=(10, 10), dpi=100)
# 2.绘制折线图
plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,13])
# 3.显示图像
plt.show()

具体介绍

  • plt.figure()
1
2
3
4
5
6
7
8
9
plt.figure(num=3, figsize=(8, 5))
'''
num: 指定当前的figure的序号,之前默认是由figure1开始每有一个新的窗口便加一,如:figure1、
figure2、figure3....

figsize: 指定窗口的大小,例如figsize=(8, 5)则窗口横向为8个单位大小,纵向为5个单位大小。

注意:plt.figure()后面跟的画图操作都是作用于这个窗口的,除非新的plt.figure()出现。
'''
  • plt.plot
    1
    2
    3
    4
    5
    6
    7
    plt.plot(x, y, color="red", linewidth=1, linestyle="--")
    '''
    color: 指定画图的颜色,如“red”为红色。
    linewidth: 指定线的粗细。
    linestyle: 指定画出的样式,如“-”为实线, “--”为虚线。
    '''

其它设置

  • 设置坐标名字
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #设置坐标轴的名字
    plt.xlabel("X") #设置横向坐标轴的名字为X
    plt.ylable("Y") #设置纵向坐标轴的名字为Y

    #设置坐标轴的范围
    plt.xlim((-1,1)) #设置横向坐标轴的范围为-1到1
    plt.ylim((-1,8))

    #设置坐标轴的间隔
    new_xticks = np.linspace(-2,2,5) #产生一个-2到2之间均匀分布的5个数字作为一维数据
    plt.xticks(new_xticks) #将产生的一维数组作为横向坐标轴的坐标值

    #将坐标轴的刻度改变为其它标识
    plt.yticks([1, 3, 5], ["$bad$", "OK", "good"])


  • 设置坐标轴的位置
1
2
3
ax = plt.gca()#意为 get current axis,得到当前的坐标轴信息
ax.spines[“top"].set_color("none") #设置上边框颜色为白色
ax.spines[“right"].set_color("none") #设置右边框颜色为白色

Seaborn

seaborn 总结(CSDN)
import seaborn as sns

当处理一组数据时,通常先要做的就是了解变量是如何分布的。

  • 对于单变量的数据来说 采用直方图或核密度曲线是个不错的选择
  • 对于双变量来说,可采用多面板图形展现,比如 散点图、二维直方图、核密度估计图形等。

变量分布

单变量

1
2
3
4
5
6
7
8
9
10
11
12
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, color=None)

'''
述函数中常用参数的含义如下:
(1) a:表示要观察的数据,可以是 Series、一维数组或列表。
(2) bins:用于控制条形的数量。
(3) hist:接收布尔类型,表示是否绘制(标注)直方图。
(4) kde:接收布尔类型,表示是否绘制高斯核密度估计曲线。
(5) rug:接收布尔类型,表示是否在支持的轴方向上绘制rugplot。
'''

sns.distplot(data)

图中蓝色实线即是核密度线。
只画核密度可以——
sns.distplot(array_random, hist=False, rug=True)

双变量

多变量分布图采用的函数是jointplot

1
2
3
4
5
6
7
8
9
10
11
12
tips = sns.load_dataset("tips")
g = sns.jointplot(x="total_bill", y="tip", data=tips)
'''
x,y,data:绘制图的数据。
kind:scatter、reg、resid、kde、hex。
color:绘制元素的颜色。
height:图的大小,图会是一个正方形。
ratio:主图和副图的比例,只能为一个整形。
space:主图和副图的间距。
dropna:是否需要删除x或者y值中出现了NAN的值。
marginal_kws:副图的一些属性,比如设置bins、rug等。
'''

通过设置kind='reg'可以设置回归绘图和核密度曲线。

对于数据过于集中的,可以转为六边形kind=hex

1
2
sns.jointplot(x="Height",y="Weight",data=china_athletes,kind="hex",gridsize=20)
# kind="hex"


通过设置kind='kde'可以设置用等高线图来表示核密度曲线。

成对绘图

pairplot可以把某个数据集中某几个字段之间的关系图一次性绘制出来。比如iris鸢尾花数据,我们想要看到petal_widthpetal_heightsepal_width以及sepal_height之间的关系,那么我们就可以通过pairplot来绘制。

1
2
sns.pairplot(iris,vars=['sepal_length',"sepal_width",'petal_length','petal_width'])

默认情况下,对角线的图(x和y轴的列相同)是直方图,其他地方的图是散点图,如果想要修改这两种图,可以通过diag_kindkind来实现。

参数可取的值为:

  1. diag_kindauto, hist, kde
  2. kindscatter, reg

示例代码如下:

1
sns.pairplot(iris,vars=['sepal_length',"sepal_width",'petal_length','petal_width'],diag_kind="kde",kind="reg")

在这里插入图片描述

关系绘图

relplot

可以用来表示多个变量之间的关联关系。默认情况下是绘制散点图,也可以绘制线性图。

kind参数

具体绘制什么图形是通过kind参数来决定的。

实际上以下两个函数就是relplot的特例:

  1. scatterplotrelplot(kind='scatter')
  2. lineplotrelplot(kind='line')
基础绘制
1
2
3
import seaborn as sns
tips = sns.load_dataset("tips",cache=True)
sns.relplot(x="total_bill",y="tip",data=tips)

散点图

折线图

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint",y="signal",kind="line",data=fmri) #见下图一:折线图基础绘制


#见下图2:折线图进阶绘制
# 设置hue为event,就会根据event来绘制不同的颜色
# 设置col为region,就会根据region值的个数来绘制指定个数的图
# 设置style为event,就会根据event来设置线条的样式
sns.relplot(x="timepoint",y="signal",kind="line",hue="event",col="region",style="event",data=fmri)


效果图如下: 折线图基础绘制
折线图进阶绘制

hue参数

hue参数是用来控制第三个变量的颜色显示的
以上图的基础之上体现出星期几的参数,那么可以通过以下代码来实现:

1
sns.relplot(x="total_bill",y="tip",hue="day",data=tips)

效果图如下:
在这里插入图片描述

col和row参数

Lunch(午餐)Dinner(晚餐)分割,把性别按照行显示出来,代码如下:

1
sns.relplot(x="total_bill",y="tip",hue="day",col="time",row="sex",data=tips)

效果图如下:
在这里插入图片描述

col_wrap参数

通过col_wrap来指定具体多少列。示例代码如下:

1
sns.relplot(x="total_bill",y="tip",col="day",col_wrap=2,data=tips)

效果图如下:
在这里插入图片描述

分类绘图

sns.catplot

分类散点图

  1. stripplot()catplot(kind="strip"),默认的。
  2. swarmplot()catplot(kind="swarm")

stripplot——

1
2
sns.catplot(x="day",y="total_bill",data=tips,hue="sex")
# stripplot

在这里插入图片描述
swarmplot——
相比第一个更加散开(不过于集中),但是不能设置size和style

1
2
sns.catplot(x="day",y="total_bill",kind="swarm",data=tips,hue="sex")
# swarmplot

在这里插入图片描述

如需要绘制横线的图,将xy调换位置即可。

分类分布图

根据分类来看,然后在每个分类下数据的分布情况

箱线图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
athletes = pd.read_csv("athlete_events.csv")
countries = {
'CHN':'中国',
'JPN':"日本",
'KOR':'韩国',
'USA':"美国",
'CAN':"加拿大",
'BRA':"巴西",
'GBR':"英国",
'FRA':"法国",
'ITA':"意大利",
'ETH':"埃塞俄比亚",
'KEN':"肯尼亚",
'NIG':"尼日利亚",
}
plt.rcParams['font.sans-serif'] = ['FangSong']
# print(plt.rcParams.keys())
need_athletes = athletes[athletes['NOC'].isin(list(countries.keys()))]
g = sns.catplot(x="NOC",y="Height",data=need_athletes,kind="box",hue="Sex")
g.fig.set_size_inches(20,5)
g.set_xticklabels(list(countries.values()))
# 设置X轴标签

小提琴图

小提琴实际上就是两个对称的核密度曲线合并起来,然后中间是一个箱线图(也可以为其他图)组成的

1
sns.catplot(x="day",y="total_bill",data=tips,kind="violin",hue="sex",split=True)

效果图如下:
在这里插入图片描述
inner参数:提琴的中间默认绘制的是箱线图,也可以修改为其他类型的。

  1. box:默认的,箱线图。
  2. quartile:四分位数。上下四分位数加中位数。
  3. point:散点。
  4. stick:线条。

    分类统计图

根据分类,统计每个分类下的数据的个数或者比例

  1. barplot()catplot(kind="bar")
  2. pointplot()catplot(kind="point")
  3. countplot()catplot(kind="count")

条形图:

kind="bar"

seaborn中的条形图具有统计功能,可以统计出比例,平均数

统计平均数:

1
2
# 统计星期三到星期天的消费总额的平均数
sns.catplot(x="day",y="total_bill",data=tips,kind="bar")

在这里插入图片描述
统计比例:

1
2
# 统计男女中获救的比例
sns.catplot(data=titanic,kind="bar",x="sex",y="survived")

在这里插入图片描述
自定义统计函数:(案例统计总和)

当然你也可以用柱状图

1
2
# 自定义统计函数,统计出每个性别下获救的人数
sns.barplot(x="sex",y="survived",data=titanic,estimator=lambda values:sum(values))

在这里插入图片描述

柱状图

醉了,上面那个叫条形图

统计某个单一变量出现数量的图形
使用kind="count"

使用hue参数来指定分组:

1
sns.catplot(x="day",kind="count",data=tips,hue="sex")

在这里插入图片描述

点线图:

kind="point"

点线图可以非常方便的看到变量之间的趋势变化。

1
sns.catplot(x="sex",y="survived",data=titanic,kind="point",hue="class")

效果图如下:
在这里插入图片描述

FacetGrid

创建一个FacetGrid对象,然后再调用这个对象的map方法。其中map方法的第一个参数是一个函数,后续map将调用这个函数来绘制图形。后面的参数就是传给这个函数的参数。

示例代码如下:

1
2
3
tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips)
g.map(plt.scatter,"total_bill","tip")

其中第一个参数是可以绘制Axes图,并且可以接收color参数的函数。可以取的值如下:

参数 描述 对应使用了FacetGrid函数
plt.plot/sns.lineplot 绘制折线图 sns.relplot(kind="line")
plt.hexbin 绘制六边形图形 sns.jointplot(kind="hex")
plt.hist 绘制直方图 sns.distplot
plt.scatter/sns.scatterplot 绘制散点图 sns.relplot(kind="scatter")
sns.stripplot 绘制分类散点图 sns.catplot(kind="strip")
sns.swarmplot 绘制散开来的分类散点图 sns.catplot(kind="swarm")
sns.boxplot 绘制箱线图 sns.catplot(kind="box")
sns.violinplot 绘制小提琴图 sns.catplot(kind="violin")
sns.pointplot 绘制点线图 sns.catplot(kind="point")
sns.barplot 绘制条形图 sns.catplot(kind="bar")
sns.countplot 绘制数量柱状图 sns.catplot(kind="count")
sns.regplot 绘制带有回归线的散点图 sns.lmplot

其他设置

基础

大同小异

  • 换行

示例代码如下:

1
2
g = sns.FacetGrid(tips,col="day",col_wrap=2)
g.map(sns.regplot,"total_bill","tip")

效果图如下:
在这里插入图片描述

  • 多个颜色观察字段

hue

  • 设置尺寸

FacetGrid中设置heightaspect来实现
其中height表示的是每个图形的尺寸(默认是宽高一致)
aspect表示的是宽度/高度的比例。

1
2
3
g = sns.FacetGrid(tips,col="day",row="time",height=10,aspect=2)
g.map(sns.regplot,"total_bill","tip")

进阶

- 图例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 直接添加
g = sns.FacetGrid(tips,col="day",hue="time")
g.map(sns.regplot,"total_bill","tip")
g.add_legend()

# 进阶玩法

# 1. 通过`title`来控制图例的标题。
# 2. 通过`label_order`来控制图例元素的顺序。
sns.set(rc={"font.sans-serif":"simhei"})
g3 = sns.FacetGrid(tips,col="day",hue="time")
g3.map(plt.scatter,"total_bill","tip")
new_labels = ['午餐','晚餐']
# 通过`title`来控制图例的标题。
g3.add_legend(title="时间")
for t,l in zip(g3._legend.texts,new_labels):
t.set_text(l)
# 将`g3._legend.texts`和`new_labels`两个列表中的元素进行配对。
# 使用`set_text()`方法将它们的文本设置为`new_labels`中对应的值。

标题

设置标题可以通过g.set_titles(template=None,row_template=None,col_template=None)来实现,这三个参数意义如下:

  1. template:给图设置标题,其中有{row_var}:绘制每行图像的名称{row_name}:绘制每行图像的值{col_var}:绘制每列图像的名称{col_name}:绘制每列图像的值这几个参数可以使用。
  2. col_template:给图像设置列的标题。其中有{col_var}以及{col_name}可以使用。
  3. row_template:给图像设置行的标题。其中有{row_var}以及{row_name}可以使用。

示例代码如下:

1
2
3
g = sns.FacetGrid(tips,col="day",row="time")
g.map(sns.regplot,"total_bill","tip")
g.set_titles(template="时间{row_name}/星期{col_name}")

在这里插入图片描述

设置坐标轴:
  1. g.set_axis_labels(x_var,y_var):一次性设置xy的坐标的标题。
  2. g.set_xlabels(label):设置x轴的标题。
  3. g.set_ylabels(label):设置y轴的标题。
  4. g.set(xticks,yticks):设置xy轴的刻度。
  5. g.set_xticklabels(labels):设置x轴的刻度文字。
  6. g.set_yticklabels(labels):设置y轴的刻度文字。

示例代码如下:

1
g.set(xticks=range(0,60,10),xticklabels=['$0','$10','$20','$30','$40','$50'])

效果图如下:
在这里插入图片描述

风格

1
2
3
4
5
sns.set_style("white") # 背景纯白
sns.set_style("whitegrid") # 背景带网格
sns.set_style("dark") # 背景灰了
sns.set_style("darkgrid") # 灰色+网格
sns.set_style("ticks") # 纯白但是坐标轴有刻度(类似数轴的竖线)

风格设置函数

sns.axes_style

如果不传递任何参数,那么将会返回可以设置的所有属性

临时的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{'axes.facecolor': 'white',
'axes.edgecolor': 'black',
'axes.grid': False,
'axes.axisbelow': 'line',
'axes.labelcolor': 'black',
'figure.facecolor': (1, 1, 1, 0),
'grid.color': '#b0b0b0',
'grid.linestyle': '-',
'text.color': 'black',
'xtick.color': 'black',
'ytick.color': 'black',
'xtick.direction': 'out',
'ytick.direction': 'out',
'lines.solid_capstyle': 'projecting',
'patch.edgecolor': 'black',
'image.cmap': 'viridis',
'font.family': ['sans-serif'],
'font.sans-serif': ['DejaVu Sans',
'Bitstream Vera Sans',
'Computer Modern Sans Serif',
'Lucida Grande',
'Verdana',
'Geneva',
'Lucid',
'Arial',
'Helvetica',
'Avant Garde',
'sans-serif'],
'patch.force_edgecolor': False,
'xtick.bottom': True,
'xtick.top': False,
'ytick.left': True,
'ytick.right': False,
'axes.spines.left': True,
'axes.spines.bottom': True,
'axes.spines.right': True,
'axes.spines.top': True}

sns.set_style()

一旦设置了,那么下面的所有绘图都是用这个风格。

sns.set

除了style以外,还可以设置调色板,字体,字体大小,颜色等,也可以设置其他的matplotlib.rcParams可以接收的参数。

sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)

调色盘设置

定性调色盘

一般在数据不连续,比较离散

默认
1
2
3
4
5
6
7
8
9
current_palette = sns.color_palette()
# 绘制调色盘,默认是默认调色盘
sns.palplot(current_palette)


# 或者
# 设置调色盘风格
current_palette = sns.color_palette("dark")
sns.palplot(current_palette)

可选默认调色盘参数

hls圆形颜色系统
1
2
3
4
5
6
# 使用hls圆形颜色系统,取20个颜色
sns.palplot(sns.color_palette("hls",20))

# 或者
sns.hls_palette(n_colors=6, h=0.01, l=0.6, s=0.65)
# 通过更改`h`来更改开始的颜色,通过更改`l`来调整亮度,通过更改`s`来调整饱和度

连续的颜色盘

使用同一个色系

1
2
3
4
5
6
sns.palplot(sns.color_palette("Blues"))
sns.palplot(sns.color_palette("Blues_r"))
# 加了_r标识反转了

# 通过`sns.choose_colorbrewer_palette("sequential")`查看有哪些色系可供选择。

正常的
反转的

离散的色盘

中间浅色 两边深色(或者反)

1
2
values = [12,15,17,18,-5,-10]with sns.color_palette("RdBu_r"):    sns.barplot([1,2,3,4,5,6],sorted(values))
# 通过`sns.choose_colorbrewer_palette("diverging")`查看离散的色盘有哪些可以选择。

Seaborn速查手册

引用自