plotly-express-1-爱上可视化神器plotly_express

一文爱上可视化神器plotly_express,目前使用和见识过最棒的可视化库。必须爱上它❤️

目录

image.png

\color{red}{Attention}:下面的所有图在jupyter notebook均是动态可交互式图形

\color{red}{Attention}:下面的所有图在jupyter notebook均是动态可交互式图形

\color{red}{Attention}:下面的所有图在jupyter notebook均是动态可交互式图形

什么是plotly_express

首先,我们看看官网上对plotly_express的定义:

Plotly Express is the easy-to-use, high-level interface to Plotly, which operates on "tidy" data and produces easy-to-style figures.

Every Plotly Express function returns a graph_objects.Figure object whose data and layout has been pre-populated according to the provided arguments.

Plotly Express 是一个新的高级 Python 可视化库:它是 Plotly.py 的高级封装,它为复杂的图表提供了一个简单的语法,内置了大量实用、现代的绘图模板,用户只需调用简单的API函数,即可快速生成漂亮的互动图表。

安装与使用

安装非常简单,使用pip命令即可

使用的时候,导入import之后一般是用px别名

pip install plotly_express   # 安装
import plotly_express as px  # 导入

内置数据

px中有几个内置数据,可以供用户使用

image

比如使用其中著名的iris数据,见如下的使用方法:

image

使用内置数据集Gapminder

如何使用内置数据集

选择数据
gapminder = px.data.gapminder()
gapminder.head()
image
查看属性
image

line图

设置线条类型

# line 图
fig = px.line(gapminder,x="year",y="lifeExp",color="continent",line_group="continent",
              hover_name="country",line_shape="spline",render_mode="svg")
fig.show()
image.png

堆积区域图area

# area 图
fig = px.area(gapminder,x="year",y="pop",color="continent",line_group="country")
fig.show()
image

散点图

散点图是最简单的图形,有两个属性即可作图。下面的color属性表示颜色根据哪个属性

gapminder2007 = gapminder.query("year==2007")
px.scatter(gapminder2007,x="gdpPercap",y="lifeExp")

注意各个参数的含义

image

改变每个点的大小-size

px.scatter(gapminder2007,x="gdpPercap",y="lifeExp"
           ,color="continent"  # 区分颜色
           ,size="pop"   # 区分圆的大小
           ,size_max=60)
image

悬停参数-hover_name

px.scatter(gapminder2007
           ,x="gdpPercap"
           ,y="lifeExp"
           ,color="continent"  # 区分颜色
           ,size="pop"   # 区分圆的大小
           ,size_max=60
           ,hover_name="country"
           ,log_x=True)
image

分块facet_col+滚动条animation_frame

px.scatter(gapminder   # 绘图使用的数据
           ,x="gdpPercap" # 横纵坐标使用的数据
           ,y="lifeExp"
           ,color="continent"  # 区分颜色的属性
           ,size="pop"   # 区分圆的大小
           ,size_max=60  # 圆的最大值
           ,hover_name="country"  # 图中可视化最上面的名字
           ,animation_frame="year"  # 横轴滚动栏的属性year
           ,animation_group="country"
           ,facet_col="continent"   # 按照国家country属性进行分格显示
           ,log_x=True
           ,range_x=[100,100000]
           ,range_y=[25,90]
           ,labels=dict(pop="Populations",  # 属性名字的变化,更直观
                       gdpPercap="GDP per Capital",
                       lifeExp="Life Expectancy"))
image

地理图

choropleth-面分布图
fig = px.choropleth(gapminder,locations="iso_alpha",color="lifeExp",
             hover_name="country",animation_frame="year",
             range_color=[20,80],projection="natural earth")
fig.show()
image
scatter_geo地图_点分布
fig = px.scatter_geo(gapminder,locations="iso_alpha",
                     color="continent",hover_name="country",
                     size="pop",animation_frame="year",
                     projection="natural earth")

fig.show()
image

去掉projection参数,看不同的效果

px.scatter_geo(gapminder,locations="iso_alpha",color="continent",hover_name="country",size="pop",animation_frame="year"
#,projection="natural earth"   # 去掉projection参数
)
image
line_geo-线型地理图
image

使用内置数据集iris

查看文档并导入数据

# 查看数据文档
print(px.data.iris.__doc__)

# 导入数据集
iris = px.data.iris()
iris 

# 查看属性
iris["species"].value_counts()
image

绘制散点图

# 如何知道每个点的种类:指定颜色参数color="species"
px.scatter(iris,x="sepal_width",y="sepal_length",color="species")
image

联合分布图(散点图+直方图)

上方增加直方图,右方增加细条图

px.scatter(iris,x="sepal_width",y="sepal_length",color="species",
           marginal_x="histogram",marginal_y="rug"  # 主要是这两个参数决定
          )
image

violin-小提琴图

px.scatter(iris,x="sepal_width",y="sepal_length",color="species"
           ,marginal_y="violin",marginal_x="box"    # 定义两个属性
           ,trendline="ols"  # 显示数据的变化趋势
          )
image.png

SPLOM-散点矩阵图

这个图真的是非常棒,一条语句可以直接生成矩阵图

image

平行坐标图

px.parallel_coordinates(iris,color="species_id",labels={"species_id":"Species",
                                                       "sepal_width":"Sepal Width",
                                                       "sepal_length":"Sepal Length",
                                                       "petal_length":"Petal Length",
                                                       "petal_width":"Petal Width"},
                       color_continuous_scale=px.colors.diverging.Tealrose,
                       color_continuous_midpoint=2)
image

箱体误差图

在上下分别加上误差值

# 对当前值加上下两个误差值
iris["e"] = iris["sepal_width"] / 100
px.scatter(iris,x="sepal_width",y="sepal_length",color="species",error_x="e",error_y="e")

image

等密度线图density_contour

px.density_contour(iris,x="sepal_width",y="sepal_length",color="species")

[站外图片上传中...(image-90cadd-1593914392458)]

等密度线图加上其他的图

px.density_contour(iris,x="sepal_width",y="sepal_length",color="species",
                  marginal_x="rug",marginal_y="histogram"   # 在密度图的基础上,指定另外两种图形
                  )

image

密度热力图density_heatmap

px.density_heatmap(iris,x="sepal_width",y="sepal_length",
                  marginal_y="rug",marginal_x="histogram"   # 在密度图的基础上,指定另外两种图形
                  )

image

小费tips实例

image

散点图

根据性别的不同进行分类作图

# 根据性别属性进行分类作图
fig = px.scatter(tips,x="total_bill",y="tip",color="size",render_mode="webgl",
                facet_col="sex",color_continuous_scale=px.colors.sequential.Viridis)
fig.show()

[站外图片上传中...(image-7c13a7-1593914392458)]

并行类别图

fig = px.parallel_categories(tips,color="size",color_continuous_scale=px.colors.sequential.Inferno)
fig.show()

[站外图片上传中...(image-153026-1593914392458)]

Bar-柱状图

image

多重属性的柱状图

fig = px.bar(tips,x="sex",y="total_bill",color="smoker",barmode="group"
      ,facet_row="time",facet_col="day",category_orders={"day": ["Thur","Fri","Sat","Sun"],"time":["Lunch", "Dinner"]})
fig.show()

image

Histogram-直方图

px.histogram(tips,x="sex",y="tip",histfunc="avg",color="smoker",barmode="group",
            facet_row="time",facet_col="day",category_orders={"day":["Thur","Fri","Sat","Sun"],
                                                             "time":["Lunch","Dinner"]})

image

box-箱型图

# notched=True显示连接处的锥形部分
px.box(tips,x="day",y="total_bill",color="smoker",notched=True)

image

如果不加notched参数,则连接处则会是矩形,而不是锥形

image

violin-小提琴图

px.violin(tips,x="smoker",y="tip",color="sex",box=True   # box是显示内部的箱体
          ,points="all",hover_data=tips.columns  # 结果中显示全部数据
         )

image

3D图形绘制

使用的是election数据集

image

散点3D图

fig = px.scatter_3d(election,x="Joly",y="Coderre",z="Bergeron"  # 指定3个轴
                    ,color="winner",size="total",hover_name="district_id"  # 指定颜色种类、大小和显示名称
                    ,symbol="result"  # 右边的圆形和菱形
                    ,color_discrete_map={"Joly":"blue","Bergeron":"green","Coderre":"red"}   # 改变默认颜色
                   )
fig.show()

image

line-3D图

px.line_3d(election,x="Joly",y="Coderre",z="Bergeron",color="winner",line_dash="winner")

image

)

极坐标图-内置数据wind

使用的数据是wind

image

scatter-polar散点极坐标

fig = px.scatter_polar(wind,r="frequency",theta="direction",color="strength",symbol="strength"
                      ,color_discrete_sequence=px.colors.sequential.Plasma_r)
fig.show()

image

line_polar线性极坐标

fig = px.line_polar(wind,r="frequency",theta="direction",color="strength",line_close=True
                      ,color_discrete_sequence=px.colors.sequential.Plasma_r)
fig.show()

image

bar_polar柱状极坐标

fig = px.bar_polar(wind,r="frequency",theta="direction",color="strength",template="plotly_dark"
                  ,color_discrete_sequence=px.colors.sequential.Plasma_r)
fig.show()

image

颜色面板和序列

在px库中,px.colors模块中有很多可用的色标和序列:定性的、序列型的、离散的、循环等。

px.colors.qualitative.swatches()

image
px.colors.sequential.swatches()  # 部分截图

image
image

主题

主题允许用户控制图形范围的设置,包含边距、字体、背景颜色、刻度定位等。px内置的主题有3种:

  • plotly
  • plotly_white
  • plotly_dark
px.scatter(iris,x="sepal_width",y="sepal_length",color="species",marginal_x="box",
          marginal_y="histogram",height=600,trendline="ols",template="plotly")

image
px.scatter(iris,x="sepal_width",y="sepal_length",color="species",marginal_x="box",
          marginal_y="histogram",height=600,trendline="ols",template="plotly_white")

image
px.scatter(iris,x="sepal_width",y="sepal_length",color="species",marginal_x="box",
          marginal_y="histogram",height=600,trendline="ols",template="plotly_dark")

image

参数详解

以散点图为例,对绘制的参数进行解释

定义

def scatter(data_frame, x=None, y=None, color=None, symbol=None, size=None, 
            hover_name=None, hover_data=None, text=None, facet_row=None, 
            facet_col=None, error_x=None, error_x_minus=None, error_y=None, 
            error_y_minus=None, animation_frame=None, animation_group=None, 
            category_orders={}, labels={}, color_discrete_sequence=None, 
            color_discrete_map={}, color_continuous_scale=None, 
            range_color=None, color_continuous_midpoint=None, 
            symbol_sequence=None, symbol_map={}, opacity=None,
            size_max=None, marginal_x=None, marginal_y=None, trendline=None,
            trendline_color_override=None, log_x=False, log_y=False,
            range_x=None, range_y=None, render_mode='auto', title=None, 
            template=None, width=None, height=None):

    return

参数解释

  • data_frame:目标数据,类型为dataframe;
  • x :指定列名。列中的值用于笛卡尔坐标中沿 X 轴的定位标记。图表类型为水平柱状图时,这些值用作参数histfunc的入参;
  • y :指定列名。列中的值用于笛卡尔坐标中沿 Y 轴的定位标记。图表类型为垂直柱状图时,这些值用作参数histfunc的入参;
  • color:指定列名。为列中的不同值,(由px)自动匹配不同的标记颜色;若列为数值数据时,还会自动生成连续色标
  • symbol:指定列名。为列中的不同值,设置不同的标记形状;
  • size:指定列名。为列中的不同值,设置不同的标记大小;
  • hover_name:指定列名。将列中的值,加粗显示在悬停提示内容的正上方;
  • hover_data:指定列名组成的列表。所有列的值,显示在悬停提示内容中,位于x/y值的下方。指定的列与x/y重复时仅显示1条数据;
  • text:指定列名。列中的值,在图的标记中显示为文本标签,同时也显示在悬停提示内容中;
  • facet_row:指定列名。根据列中不同的(N个)值,在垂直方向上显示N个子图,并在子图右侧,垂直方向上,进行文本标注;
  • facet_col:指定列名。根据列中不同的(N个)值,在水平方向上显示N个子图,并在子图上方,水平方向上,进行文本标注;
  • error_x:指定列名。显示误差线,列中的值用于调整 X 轴误差线的大小。如果参数error_x_minus == None,则悬停提示内容中,显示对称的误差值;否则显示正向的误差值。该列通常是基于元数据加工的结果,目的是统计元数据指标的误差值,一般会用元数据除以100的整数倍。
  • error_x_minus:指定列名。列中的值用于在负方向调整 X 轴误差线的大小,如果参数error_x==None,则直接忽略该参数;
  • error_y:指定列名。显示误差线,列中的值用于调整 Y 轴误差线的大小。如果参数error_y_minus == None,则悬停提示内容中,显示对称的误差值;否则显示正向的误差值。该列通常是基于元数据加工的结果,目的是统计元数据指标的误差值,一般会用元数据除以100的整数倍。
  • error_y_minus:指定列名。列中的值用于在负方向调整 Y 轴误差线的大小,如果参数error_y==None,则直接忽略该参数;
  • animation_frame:指定列名。列中的值用于为动画帧指定标记,即设置滑动条;
  • animation_group:指定列名。列中的值用于提供跨动画帧的联动匹配;
  • category_orders:带有字符串键和字符串列表值的字典,默认为{},此参数用于强制每列的特定值排序,dict键是列名,dict值是指定的排列顺序的字符串列表。默认情况下,在Python 3.6+中,轴,图例和构面中的分类值的顺序取决于在data_frame中首次出现的顺序,而在3.6以下的Python中,默认不保证顺序,该参数即为解决此类问题而设计;
  • labels:带字符串键和字符串值的dict,默认为{}。此参数用于修改图表中显示的列名称。默认情况下,图表中使用列名称作为轴标题、图例条目、悬停提示等,此参数可以进行修改,dict的键是列名,dict值是修改的新名称;
  • color_discrete_sequence:有效的CSS颜色字符串列表,取自plotly_express的color子模块。当参数color指定的列不是数值数据时,该参数为color列指定颜色序列,若category_orders参数不为None,则按category_orders中设定的顺序循环执行color_discrete_sequence,除非color列的值在参数color_discrete_map入参的dict键中;
  • color_discrete_map:带字符串键和有效CSS颜色字符串值的dict,默认为{}。当参数color指定的列不是数值数据时,该参数用于将特定颜色分配给,与特定值对应的标记,color_discrete_map中的键为color表示的列值。其优先级高,会覆盖color_discrete_sequence参数中的设置;
  • color_continuous_scale:有效的CSS颜色字符串列表,取自plotly_express的color子模块。当参数color指定的列是数值数据时,为连续色标,设置指定的颜色序列。实际上,color指定列时,px会自动匹配颜色:1)若指定列是数值数据,通过参数color_continuous_scale可以设定具体的颜色序列;2)若指定列是非数值数据时,通过参数color_discrete_sequence可以设定具体的颜色序列(循环匹配);通过参数color_discrete_map可以为列中不同值,指定具体的颜色;
  • range_color:2个数字元素组成的列表,参数用于设定连续色标上的自动缩放,即边界的大小值;
  • color_continuous_midpoint:数字,默认为无。如果设置,则计算连续色标的边界以具有所需的中点。 若使用plotly_express.colors.diverging色标作为color_continuous_scale的如参时,建议设置此值;
  • symbol_sequence:定义plotly.js符号的字符串列表。参数用于为列中的值分配符号,除非symbol的值是symbol_map中的键。分配符号的顺序:按按category_orders中设置的顺序循环执行;
  • symbol_map:带字符串键和定义plotly.js符号的字符串值的dict,默认值{}。该参数用于将特定符号分配给,与特定值对应的标记,symbol_map中的键为symbol表示的列值。其优先级高,会覆盖symbol_sequence参数中的设置;
  • opacity:数字,介于0和1之间,设置标记的不透明度;
  • size_max:整数,默认为20。使用size参数时,设置最大标记的大小;
  • marginal_x:字符串,取值:rug(细条)、box(箱图)、violin(小提琴图)、histogram(直方图)。该参数用于在主图上方,绘制一个水平子图,以便对x分布,进行可视化;
  • marginal_y:字符串,取值:rug(细条)、box(箱图)、violin(小提琴图)、histogram(直方图)。该参数用于在主图右侧,绘制一个垂直子图,以便对y分布,进行可视化;
  • trendline:字符串,取值:ols、lowess、None。取值为ols时,将为每个离散颜色/符号组,绘制一个普通最小二乘回归线;取值为lowess时,则将为每个离散颜色/符号组,绘制局部加权散点图平滑线;
  • trendline_color_override:字符串,有效的CSS颜色。如果设置了参数trendline趋势线,则将以此颜色绘制所有趋势线;
  • log_x:布尔值,默认为False。如果为True,则 X 轴在笛卡尔坐标系中进行对数缩放;
  • log_y:布尔值,默认为False。如果为True,则 Y 轴在笛卡尔坐标系中进行对数缩放;
  • range_x:2个数字元素组成的列表,用于设定笛卡尔坐标中 X 轴上的自动缩放,即边界的大小值;
  • range_y:2个数字元素组成的列表,用于设定笛卡尔坐标中 Y 轴上的自动缩放,即边界的大小值;
  • render_mode:字符串,取值:auto(默认)、svg、webgl。用于控制绘制标记的浏览器API,svg适用于少于1000的数据,并允许完全矢量化输出;webgl可以接收1000点以上的数据;auto使用启发式方法来选择模式;
  • title:字符串,设置图表的标题;
  • template:字符串或Plotly.py模板对象,设置图表的背景颜色。有三个内置的 Plotly 主题: plotly, plotly_white 和 plotly_dark;
  • width:整数,默认无,设置图表的宽度(以像素为单位);
  • height:整数,默认600,设置图表的高度(以像素为单位);

其他作图方法的作图参数类似

参考资料

可视化神器plotly_express详解

API详解

Plotly_express in python

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335