[Day 22] Python 视觉化解释数据 - Plotly Express

Plotly Express

今日学习目标

  • 安装 plotly
  • 手把手实作视觉化鸢尾花朵资料集
    • 直方图
    • 特徵关联度分析
    • 散布图
    • 箱形图
    • 复合型视觉化技巧
    • 汇出图片

前言

Plotly Express 是一个高精致的资料视觉化套件。初学机器学习的你一定碰过像是 matplotlib 和 seaborn 这类型的图表化套件,不过使用过 Plotly Express 会让你对於资料视觉化有更不一样的体验。它的功能使用起来非常直观,并且可以很好地与 Pandas DataFrame 配合使用。Plotly Express 於 2019 年由加拿大 Plotly 这间公司释出了第一版高阶的 Python 资料视觉化套件。

https://ithelp.ithome.com.tw/upload/images/20211004/20107247Hq7xqNCcwn.png

安装 plotly

若尚未安装此套件的读者,可以开启终端机输入以下指令进行安装:

pip install plotly

1) 载入资料集

在今天的范例中我们一样采用鸢尾花朵资料集来做示范,让大家瞧瞧 Plotly Express 是如优雅的处理资料视觉化。

import plotly.express as px
import plotly.graph_objects as go
from IPython.display import HTML

df_data = px.data.iris()
df_data

https://ithelp.ithome.com.tw/upload/images/20211004/20107247k5Bzz3ff5f.png

直方图

为了更清楚了解特徵的分布状况,我们可以采用直方图 histogram 做更近一步的分析。从直方图我们可以更清楚知道特徵的每个值的频率分布。由於目前版本在 Notebook 无法直接使用 fig.show() 显示互动图,必须安装一些小插件模组与设定。因此范例中采用最简单方法,先转换成 HTML code 并透过 IPython.display 中的 HTML 方法显示出来。

fig = px.histogram(df_data, x="sepal_width")
HTML(fig.to_html())

https://ithelp.ithome.com.tw/upload/images/20211004/20107247kZCRpuLdeb.png

除此之外我们也能观察每一个独立特徵对於花的品种的每个分布状况。每个不同的颜色代表不同的花朵品种,我们可以藉由参数设定每个直方图是否重叠,以及重叠的透明程度。

fig = px.histogram(df_data, x="sepal_width", color="species")
fig.update_layout(barmode='overlay')
fig.update_traces(opacity=0.75)
HTML(fig.to_html())

接下来一样透过直方图方式来观察每个花朵品种的数量。从视觉化可以很清楚得知该资料集是否是一个平稳的资料集。

fig = px.histogram(df_data, x='species', y='sepal_width', histfunc='count', height=300,
                    title='Histogram Chart')
HTML(fig.to_html())

https://ithelp.ithome.com.tw/upload/images/20211004/201072478avmXPAcw3.png

特徵关联度分析

我们可以采用 scatter_matrix 为每一个特徵彼此间做一个关联度分析。透过这种视觉化方式我们可以很清楚的知道两个特徵间是否正相关与负相关。

fig = px.scatter_matrix(df_data, dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"], color="species")
HTML(fig.to_html())

散布图

我们使用散布图将花萼的长度与宽度显示在二维坐标平面上。使用 Plotly Express 套件中的 scatter 方法,我们可以轻松构建图形,并放入 DataFrame 格式的资料并指定必要参数 x 轴中的变数和 y 轴中的变数。

fig = px.scatter(df_data, x="sepal_width", y="sepal_length")
HTML(fig.to_html())

https://ithelp.ithome.com.tw/upload/images/20211004/201072471PzeISBGoW.png

如果想要更清楚表达每个资料点所对应的类别,可以再加上 color 并指定种类的栏位即会将所有资料自动分成三类。此外我们也能够设定滑鼠移到资料点上所显示的资讯,透过 hover_data 并给予指定栏位即可看到输出。

fig = px.scatter(df_data, x="sepal_width", y="sepal_length", color="species"
                     , hover_data=['petal_length','petal_width'])
HTML(fig.to_html())

Plotly Express 也提供三维的视觉化,此外使用者也能够过控制变版自由的放大与缩小甚至旋转。下图范例中我们将 x 轴设定花萼宽度,y 轴设定花萼长度,z 轴设定花瓣宽度。此外 size 可以控制每一个资料点的大小,这里采用花瓣的长度做为每个资料点大小的依据。因此从这个立体空间可以发现从花瓣长度对於花的种类有很强的关联性。

fig = px.scatter_3d(df_data, x="sepal_width", y="sepal_length", z="petal_width", 
                    color="species",size='petal_length')
HTML(fig.to_html())

箱形图

我们可以透过箱形图进行特徵的分布状况分析。从视觉化图中可以清楚地知道花萼的宽度范围介於 2~4.5 之间,以及四分位数和离群值的讯息。

fig = px.box(df_data, y="sepal_width")
HTML(fig.to_html())

https://ithelp.ithome.com.tw/upload/images/20211004/20107247MPt83v65fN.png

除此之外我们能够更近一步的分析花萼宽度对於每个品种的分布状况。

fig = px.box(df_data, x="species", y="sepal_width",color="species")
HTML(fig.to_html())

https://ithelp.ithome.com.tw/upload/images/20211004/201072473bVfTQzyoB.png

复合型视觉化技巧

复合型视觉化方式可以同时预览两个变数间的散布图与箱型图关系。主要是透过 marginal_ymarginal_x 设置横轴与纵轴的视觉化方式,因此在一个图表中可以结合两种视觉化。此外 trendline 可以为散布图绘制趋势线,设置 ols 会采用最小平方法位数据建立一个线性回归。

fig = px.scatter(df_data, x="sepal_width", y="sepal_length", color="species", marginal_y="box",
           marginal_x="box", trendline="ols", template="simple_white")
HTML(fig.to_html())

https://ithelp.ithome.com.tw/upload/images/20211004/20107247KzQBdml6nb.png

也可以试着将横轴与纵轴改成直方图。

fig = px.scatter(df_data, x="sepal_width", y="sepal_length", color="species", marginal_y="histogram",
           marginal_x="histogram", trendline="ols", template="simple_white")
HTML(fig.to_html())

https://ithelp.ithome.com.tw/upload/images/20211004/201072476JV3gzvYRJ.png

汇出图片

方法一

直接点选控制面板的相机图示 (Download plot as a png) 可以立即下载图片。

https://ithelp.ithome.com.tw/upload/images/20211004/20107247TrYyT79p1L.png

方法二

首先要安装 kaleido 才能汇出 Plotly Express 的静态图片。

!pip install kaleido
  • 汇出静态图片
fig.write_image("./demo.png")
  • 汇出网页格式,保留互动形式
fig.write_html("./demo.html")

Reference

本系列教学内容及范例程序都可以从我的 GitHub 取得!


<<:  DAY19:进阶清单元件之实作

>>:  Day 19. slate × Operation × WeakMap

成为工具人应有的工具包-27 ShellMenuView

ShellMenuView 今天一样来认识这个看 shell 外挂选单的工具(?) ShellMen...

[Day 2] 快来探索AI的世界

快来探索AI的世界 Day 2 学习目标 人工智慧的演进 人工智慧的分级 机器是如何学习的 人工智慧...

Day12不可以坏坏!vue.js判断是否session

延续昨日 今天来使用一下我们的session吧!! 在mounted的范围接一下 session 这...

Day 23: Behavioral patterns - Memento

目的 当系统需要提供「复原功能」、「取消复原功能」、「回复到上一个步骤」等需要将这些资料暂时存放在记...

图的储存结构 - 相邻多重串列 - DAY 23

基本介绍 名称我自己取的,对不起作者了~ 它的组成照步骤走比较好组成,不然会乱掉 STEP 1 - ...