1.Seaborn 前言
Seaborn 和 Matplotlib 同为 Python 最强大的两个可视化库。Seaborn 是在 matplotlib 的基础上进行了更高级的 API 封装,让你能用更少的代码去调用 matplotlib 的方法,从而使得作图更加容易,在大多数情况下使用 seaborn 就能做出很具有吸引力的图,而使用 matplotlib 就能制作具有更多特色的图。应该把 Seaborn 视为 matplotlib 的补充,而不是替代物。
Seaborn:作图更容易,图像更漂亮。主要的缺点则是定制化能力会比较差,只能实现固化的一些可视化模板类型。
Matplotlib:可以实现高度定制化绘图的,高度定制化可以让你获得最符合心意的可视化输出结果,但也因此需要设置更多的参数,因而代码更加复杂一些。
Seaborn 官方文档 http://seaborn.pydata.org/tutorial
建议阅读顺序:Plot aesthetics,Plotting functions,Multi-plot grids。
1.1 快速优化图形
Seaborn 以多变优雅的绘图风格出名,首先热个身:
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
sinplot() // 输出如图 1
sns.set()
sinplot() // 输出如图 2
使用 Seaborn 完成图像快速优化的方法非常简单。只需要将 Seaborn 提供的样式声明代码 sns.set()
放置在绘图前即可。
sns.set()
还可进行细致化设置:
sns.set(context=, style=, palette=, font=, font_scale=, color_codes=, rc=)
context=
参数控制着默认的画幅大小,分别有{paper, notebook, talk, poster}
四个值。其中,poster > talk > notebook > paper
。style=
参数控制默认样式,分别有{darkgrid, whitegrid, dark, white, ticks}
,你可以自行更改查看它们之间的不同。默认为darkgrid
。palette=
参数为预设的调色板。分别有{deep, muted, bright, pastel, dark, colorblind}
等,你可以自行更改查看它们之间的不同。- 剩下的
font=
用于设置字体,font_scale=
设置字体大小,color_codes=
不使用调色板而采用先前的'r'
等色彩缩写。
另外,还有两个直接控制风格的函数方法:sns.set_style()
和sns.axes_style()
。
其包含两个参数style=
,可直接设置样式;rc=
,字典值,其参数映射将覆盖预设的 seaborn 样式字典中的值。对于sns.axes_style()
,如没有进行赋值,则返回当前默认设置,字典格式数据。
1.2 去掉坐标轴
sns.despine(offset=,trim=,left=)
1.3 临时绘图风格
with sns.axes_style("white"): // 用来切换绘图风格
ax = f.add_subplot(gs[0, 0])
sinplot1()
sinplot2() //sinplot1()和 sinplot2() 绘图风格不一样
1.4 缩放图风格
sns.set() // 重置函数
// 包含四个预设,相对大小的顺序,paper,notebook,talk,和 poster
// 包含四个预设,相对大小的顺序为 paper,notebook,talk,和 poster
sns.set_context("paper")
2. Seaborn 绘图 API
Seaborn 一共拥有 50 多个 API 类,相比于 Matplotlib 数千个的规模,可以算作是短小精悍了。其中,根据图形的适应场景,Seaborn 的绘图方法大致分类 6 类,分别是:
关联图、类别图、分布图、回归图、矩阵图和组合图。
而这 6 大类下面又包含不同数量的绘图函数。
Seaborn 中的 API 分为 Figure-level 和 Axes-level 两种。
Figure-level 和 Axes-level API 的区别在于,Axes-level 的函数可以实现与 Matplotlib 更灵活和紧密的结合,而 Figure-level 则更像是「懒人函数」,适合于快速应用。
2.1 关联图
关联图的 Figure-level 接口是relplot
。【relating plot】
总函数:sns.relplot()
,主要有 散点图 和折线图 2 种样式。
分函数:sns.scatterplot()
,sns.lineplot()
。
sns.relplot(x=, y=, data=,kind=, palette=, ax=, hue=, style=, *kwargs)
x=, y=
:传data=
中的数字自变量和因变量。data=
:DataFrame 类型的数据表。kind=
:指定绘制的图像类型,选项为'scatter'
和'line'
,与分函数对应。默认散点图。palette=
:调色板,可指定内置的样式,色彩丰富。ax=
:指定图标绘画在哪个坐标系。hue=
:指定绘制数据的颜色映射集。style=
:赋予不同类别的散点不同的形状映射集*kwargs
:包含size=
,指定图点大小映射集;sizes=
,既可以是某个具体数值,也可以是映射集。
分函数用法与之相同,只是不用指定 kind。
如想水平绘图,交换 xy 数据就行。
2.2 类别图
与关联图相似,类别图的 Figure-level 接口是 catplot
。 【categorical plot】
总函数:sns.catplot()
,主要有 分类散点图 , 分类分布图 , 分类估计图 3 类样式。
sns.catplot(x=, y=, kind=, data=, palette=, hue=) // 参数意义同关联图, 默认 kind="strip"
sns.stripplot()
(kind="strip"
):带状散点图,一个类别的所有点都将沿着与分类变量相对应的轴落在同一位置。
sns.swarmplot()
(kind="swarm"
):带状散点图(散点不重叠),使用防止重叠的算法沿分类轴调整点。它仅适用于相对较小的数据集,但它可以更好地表示观测值的分布。
例:
sns.boxplot()
(kind="box"
):箱线图
sns.violinplot()(kind="violin")
:小提琴图
sns.boxenplot()
(kind="boxen"
):增强箱线图
sns.pointplot()
(kind="point"
):点线图
sns.barplot()
(kind="bar"
):条形图
- 分类图中的条形图只是将点线图中的平均值以条形方框展示而已;置信区间还是以线的形式展示。
sns.countplot()
(kind="count"
):计数条形图
2.3 分布图
分布图主要是用于可视化变量的分布情况,一般分为单变量分布和双变量分布。
2.3.1 jointplot()
sns.jointplot(x=, y=, data=,kind= color=, *kwargs)
kind=“scatter” | “reg” | “resid” | “kde” | “hex”
主要是用于绘制二元变量分布图。散点图,六边形图,核密度估计
2.3.2 pairplot()
sns.pairplot(data=, hue=, vars=, *kwargs)
支持一次性将数据集中的特征变量两两对比绘图。默认情况下,对角线上是单变量分布图,而其他则是二元变量分布图。
2.3.3 distplot()
sns.distplot(a, bins=, hist=, kde=, color=, label=, *kwargs)
绘制单变量分布。直方图,核密度估计,拟合参数分布
2.3.4 kdeplot()
sns.kdeplot(data, shade=, vertical=, *kwargs)
绘制二维核密度图
2.4 回归图
sns.lmplot(x=, y=, hue=, data=, *kwargs)
同样是用于绘制回归图,但 lmplot
支持引入第三维度进行对比
sns.regplot(x=, y=, data=, *kwargs)
绘制回归图时,只需要指定自变量和因变量即可,regplot
会自动完成线性回归拟合。
2.5 矩阵图
2.5.1 heatmap()
sns.heatmap(data, vmin=, vmax=, cmap=, center=, *kwargs)
主要用于绘制热力图。
2.5.2 clustermap()
sns.clustermap(data, method=, metric=, *kwargs)
支持绘制层次聚类结构图。
3. pygal 库
Pygal 是另一个简单易用的数据图库,它以面向对象的方式来创建各种数据图,而且使用 Pygal 可以非常方便地生成各种格式的数据图,包括 PNG、SVG 等。
其最大的特点是能够生成 矢量图形 SVG,还可进行点击显示 交互。
3.1 安装
pip install pygal -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2 使用
pygal 有非常简单清晰的官方文档,需要用时直接查阅就好。
Pygal 官方文档
http://www.pygal.org/en/stable/documentation/index.html
4. Pyecharts 库
Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。
特点:良好的交互性,支持链式调用,精巧的图表设计
官方文档是中文滴!http://pyecharts.org/#/zh-cn/intro
要想使用直接阅读官方文档即可。其中的【5 分钟上手】初学者一定要看。
为了更快的读懂官方文档,在下面会做一些总结。
4.1 初识语法
首先给一段简单代码看看 Pyecharts 是怎么画图的:
// 条形图绘制
from pyecharts.charts import Bar
bar1 = Bar() // 首先创建一个条形图画板
bar1.add_xaxis([" 衬衫 ", " 羊毛衫 ", " 雪纺衫 ", " 裤子 ", " 高跟鞋 ", " 袜子 "])
bar1.add_yaxis(" 商家 A", [5, 20, 36, 10, 75, 90])
bar1.add_yaxis(" 商家 B", [10, 25, 35, 6, 100, 70])
bar1.render()
//render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
// 也可以传入路径参数,如 bar.render("mycharts.html")
打开生成的 render.html 文件如下:
要想直接在 jupyter notebook 中直接显示,可采用如下方式:
bar1.render_notebook()
以上画图方法简单吧。下面再看看怎么进行更多的设置。
4.2 会用官方文档
4.2.1 会看图表说明
想要对图表进行进一步的设置,则看官方文档中对应的设置部分,对于条形图 Bar:
上述中 def
定义了函数名add_yaxis
,调用格式:Bar().add_yaxis()
,括号的可以传入的参数和用法即为在画红下划线里的那些。有等于号 = 的通过赋值传参,没有等于号的直接传参。
举个例子:
from pyecharts.charts import Line
L=Line()
L.add_xaxis(['1 月份 ','2 月份 ','3 月份 ','4 月份 ','5 月份 ','6 月份 '])
L.add_yaxis(" 商家 A", [5, 20, 36, 10, 75, 90])
L.add_yaxis(" 商家 B", [10, 25, 35, 6, 100, 70],
is_smooth = True,
linestyle_opts = opts.LineStyleOpts(type_='dotted')) // 给商家 B 搞点不一样
L.render_notebook()
上述中给商家 B 搞点不一样,就是 参照官方文档中的用法进行了设置。查看应用路径如下:
这下学会怎么看官方文档了吧!!!
点个赞,快!
接下来如果想要添加【标题】或者修改【图例】等,需要在 全局配置项 中添加。
4.2.2 会用全局配置项
全局配置项中可对这些元素进行配置:
全局配置项可通过
set_global_options
方法设置。
在使用全局变量时,需要再 import 一个方法:
from pyecharts import options as opts // 使用 options 配置项,在 pyecharts 中,一切皆 Options。
首先找到全局配置项的那一部分,看目录,如我需要给图表加标题,则找到【TitleOpts:标题配置项】。
如我需要给图表加视觉映射,则找到【VisualMapOpts:视觉映射配置项】。
看了这两个例子应该学会举一反三,配置任何全局变量了吧!
4.2.3 链式调用
在使用 Pyecharts 过程中,一般都会采用链式调用的方法去写代码,当然怎么选择可凭个人习惯。
先看段代码:
from pyecharts import options as opts
from pyecharts.charts import Scatter
def scatter_spliteline() -> Scatter: // 这里是 python 中一种特殊写法,下面会有解释。
c = (Scatter() // 该函数的方法调用就是链式调用
.add_xaxis(['1 月份 ','2 月份 ','3 月份 ','4 月份 ','5 月份 ','6 月份 ',])
.add_yaxis(" 商家 A", [80, 55, 35, 10, 100, 70])
.set_global_opts(title_opts=opts.TitleOpts(title="Scatter- 显示分割线 "),
xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)),
)
)
return c
scatter_spliteline().render_notebook()
首先定义一个变量 c,去接收画的图表;括号里传入图表类型函数 Scatter(),代表要绘制散点图,再分别调用 Scatter()里面的 add_xaxis(),add_yaxis(),set_global_opts()三个函数,用点连接,代表方法调用。
【如何理解链式调用】
所谓链式调用,就是一个函数可以“叠加”使用其中的方法。比如普通类 Car()中定义了三个方法,A,B,C,当使用其中的方法时,只能分别调用,如:
Car().A() Car().B() Car().C()
而链式调用,则可以直接:
Car().A().B().C() #同时调用 A,B,C 三个函数 #上面的画图函数就是这样写的: Scatter().add_xaxis() .add_xaxis() .set_global_opts()
当然要实现这样的调用,类函数 Car()中的方法要 return 本身。
如:
class Chain(): def __init__(self,name): self.name=name def A(self): print('%s 正在调用方法 A'%self.name) return self def B(self): print(' 正在调用方法 B') return self def C(self): print(' 正在调用方法 C') return self chain=Chain(name='author') chain.A().B().C() #输出结果为: author 正在调用方法 A 正在调用方法 B 正在调用方法 C #以上这就是链式调用
以上过程可以这样理解:
第一层:
chain.A()
调用方法 A,打印出“author 正在调用方法 A”,随后return
回self
(就是Chain()
本身,即chain.A()
又相当于Chain()
)第二层:
chain.A().B()
等价于chain.B()
。依次类推。
【如何理解 python 代码中的箭头—>
】
函数参数中的箭头指向是参数的
类型建议符
,以告诉程序员希望传入的实参的类型。是 Python 3.5 新加的功能。值得注意的是,类型建议符并非强制规定和检查,也就是说即使传入的实际参数与建议参数不符,也不会报错。
可以把它看成一种注释即可。不编译,不执行。
def add(x, y) -> int: # 这里 —> int 表示:告诉程序员这里 x,y 建议输入数据类型为整型 return x+y
4.2.4 输出图片
Pyecharts 默认的输出方式为 html 网页文件,要想输出图片,可参阅官方文档【 渲染图片】
4.3 进阶用法
等到我需要用到的时候再进行更新吧。
欢迎各位看官及技术大佬前来交流指导呀,可以邮件至 jqiange@yeah.net