可视化神器Plotly玩转多子图绘制
很长时间没有Plotly绘图的文章,之前已经介绍如何绘制柱状图、饼图、小提琴图、桑基图等,今天给大家带来的是一篇关于Plotly如何绘制多子图的文章,在一个画布中如何实现多种类型图形的绘制。
Plotly连载文章
多子图绘制
首先看看实际的效果:
Plotly中有两种方式来绘制子图,基于plotly_express和 graph_objects。
但是plotly_express只支持 facet_plots(切面图) 和 marginal distribution subplots(边际分布子图),只有graph_objects是基于make_subplots模块才能够绘制真正意义上的多子图。下面通过实际例子来讲解。
1 | import pandas as pd |
最重要的是要导入make_subplots模块。
基于plotly_express
plotly_express绘制“子图”是通过参数marginal_x
和 marginal_y
来实现的,表示在边际上图形的类型,可以是"histogram", “rug”, “box”, or “violin”。
基于facet_plots
切面图是由具有相同轴集的多个子图组成的图形,其中每个子图显示数据的子集,也称之为:trellis(网格) plots or small multiples。直接上官方英文,感觉更合适,暂时找不到比较恰当的中文来翻译。
不同图形切面展示
先导入内置的消费数据集:
1、基于散点图的切面图形
1 | fig = px.scatter(tips, # 数据 |
2、基于柱状图的切面展示
1 | # 2、柱状图切面 |
控制子图个数
3、wrapping column Facets:控制显示元素个数的切面图
当我们指定的某个切面的字段的取值有很多种不同的情况,我们可以通过facet_col_wrap参数来控制每行最多显示的图形个数,wrap可以理解成:被限制的意思,就是每行限制显示多少。
使用内置的GDP数据集:
1 | # 3、被限制每行图形个数的切面图 |
上面的切面图形的col字段是洲,最多只有5个洲。下面的图形选用时间year:
1 | fig = px.scatter(gdp, # 数据集 |
每行最多显示4个图形:
1 | fig = px.scatter(gdp, |
子图坐标轴设置
默认情况下子图的y轴是相同的:
1 | # 独立轴的切面:默认情况是相同的y轴 |
通过参数设置不共享y轴:
1 | fig = px.scatter(tips, |
如果是facet_col在列方向上的切面,则可以设置不共享x轴
1 | fig = px.scatter(tips, |
子图标题设置
1 | fig = px.scatter(tips, |
通过设置改变子图的标题:
1 | fig = px.scatter(tips, |
基于边际图Marginal
该方法主要是通过marginal_x和marginal_y来实现的。首先导入数据集:
基于不同图形边际图
1、基于散点图:
1 | fig = px.scatter(iris, # 数据集 |
2、基于密度热图的边际图形设置:
1 | fig = px.density_heatmap( |
3、边际图颜色设置
1 | fig = px.scatter(iris, |
边际图和切面图连用
1 | fig = px.scatter( |
基于graph_objects
graph_objects方式其实是通过make_subplots函数来实现的。一定要先导入:
1 | # 这种方式一定要导入的模块 |
基础子图
1 | # 两个基本参数:设置行、列 |
1 | fig = make_subplots(rows=3, cols=1) # 3行1列 |
多行多列子图
多行多列的时候,我们可以指定第一个图形的位置,表示图形从哪里开始。默认左上角是第一个图形的位置。
1 | \fig = make_subplots(rows=2, cols=2,# 2行2列 |
多子图标题设置
很多时候我们要给每个子图取名,用subplot_titles来实现
1 | fig = make_subplots(rows=2, cols=2, |
多子图标注Annotations
在子图中我们还可以给数据添加标注:
1 | fig = make_subplots(rows=1, cols=2, |
子图宽度设置
上面绘制的多子图都是大小相同的,我们可以通过参数来进行设置显示不同的大小:column_widths
1 | fig = make_subplots(rows=1, |
共享x轴
共享x轴指的是针对在同列行中的多个图形共享x轴:
1 | fig = make_subplots(rows=3, |
共享y轴
共享y轴指的是针对在同一行中的多个图形共享y轴:
1 | fig = make_subplots(rows=2, cols=2, # 2*2 |
坐标轴自定义
1 | from plotly.subplots import make_subplots |
共享颜色轴
使用的参数是coloraxis
1 | fig = make_subplots(rows=1, cols=2, |
子图位置自定义
子图位置的自定义是通过参数spec来实现的,spec是一个2维的列表集合,列表中包含rows和cols两个参数。
比如我们想绘制2*2的图形,但是只有3个图形,那么肯定有个图形会占据2行1列或者是1行2列的位置,通过例子来解释。
1 | fig = make_subplots( |
1 | fig = make_subplots( |
让我们看一个更为复杂的例子:
1 | fig = make_subplots( |
子图类型自定义
子图可供选择的图形类型:
-
“xy”: 二维的散点scatter、柱状图bar等
-
“scene”: 3维的scatter3d、球体cone
-
“polar”: 极坐标图形如scatterpolar, barpolar等
-
“ternary”: 三元图如scatterternary
-
“mapbox”: 地图如scattermapbox
-
“domain”: .针对有一定域的图形,如饼图pie, parcoords, parcats,
1 | from plotly.subplots import make_subplots |
多子图类型和位置的连用:
1 | from plotly.subplots import make_subplots |
参数解释
最后附上官网地址,多多学习:https://plotly.com/python/subplots/
1 | plotly.subplots.make_subplots(rows=1, # 行列数值决定位置 |
通过下面的方式查看帮助文档:
1 | from plotly.subplots import make_subplots |