【Python百日进阶-数据分析】Day116 - Plotly 入门

一、概述

1.1 plotly是什么

Python的plotly库是一个交互式的,开放源码绘图库,支持超过40独特的图表类型覆盖范围广的统计,金融,地理,科学,和3维的用例。

Plotly 建立在 JavaScript 库 ( plotly.js )之上,plotly使 Python 用户能够创建漂亮的基于 Web 的交互式可视化,这些可视化可以在 Jupyter notebook中显示,保存到独立的 HTML 文件中,或作为纯 Python 构建的 Web 应用程序的一部分使用Dash的Python plotly库有时称为“plotly.py”以区分JavaScript库。

由于与我们的Kaleido图像导出实用程序深度集成,plotly还为非网络上下文提供了强大的支持,包括桌面编辑器(例如 QtConsole、Spyder、PyCharm)和静态文档发布(例如将Jupyter notebook导出为带有高质量矢量图像的 PDF)。

1.2 比 matplotlib 效率高十倍的数据可视化神器

心理学上有一个名词叫“沉没成本谬误”,它指如果我们已经在一项事业上花费了很多时间,那么即使明知是失败的,我们仍然会倾向于继续把时间和资源花在上面。
在数据可视化的路上,我也曾犯过这样的错误。
当我明知存在更高效、更具交互性和外观更好的替代方案时,我却仍然继续使用一个过时的绘图库——matplotlib,只是因为我曾经花了数百个小时来学习 matplotlib 复杂的语法。
幸运的是,现在有许多的开源绘图库可供选择,经过仔细研究,我发现 plotly 包无论从易用性、交互性还是功能性来看,都有绝对的优势。
当我们在选择绘图库的时候,有几点是永远需要考虑的:

  • 用少量的代码进行数据探索
  • 可以实时与数据交互,查看数据子集情况
  • 根据自己的需要,选择性挖掘数据中的细节
  • 非常便利地润色最终演示的图表
    而到目前为止,能够在 Python 中实现上述需求的不二选择便是 plotly。plotly 使我们能够快速地进行可视化,让我们通过与图表的交互更好地了解我们的数据。日常工作中,在使用其他绘图库的时候,我感觉绘图是一项单调乏味的任务,但是使用 plotly 时,我觉得绘图是数据科学中相当有趣的工作之一!

二、安装

plotly可以使用pip以下方法安装:

pip install plotly

或conda:

 conda install -c plotly

该软件包包含将图形写入独立 HTML 文件所需的一切。

注意:使用 plotly.py 不需要互联网连接、帐户或付款。在版本 4 之前,该库可以在“在线”或“离线”模式下运行。文档倾向于强调在线模式,在这种模式下,图表将发布到 Chart Studio Web 服务。在版本 4 中,所有“在线”功能都从plotly包中删除,现在可以作为单独的可选chart-studio包使用(见下文)。plotly.py 版本 4 仅是“离线”的,不包括将图形或数据上传到云服务的任何功能。

import plotly.graph_objects as go
fig = go.Figure(data=go.Bar(y=[2, 3, 1]))
fig.write_html('first_figure.html', auto_open=True)

在这里插入图片描述

三、Dash 中的绘图图表

Dash是使用 Plotly 图形在 Python 中构建分析应用程序的最佳方式。
要运行下面的应用程序,请运行pip install dash
在这里插入图片描述

四、Jupyter Notebook Support

要在经典Jupyter Notebook 中使用,请 使用以下命令安装notebook和ipywidgets包

pip install "notebook>=5.3" "ipywidgets>=7.5"

or conda:

conda install "notebook>=5.3" "ipywidgets>=7.5"

这些包包含运行 Jupyter notebook 所需的一切…

jupyter notebook

并使用笔记本渲染器内联显示图形…

import plotly.graph_objects as go
fig = go.Figure(data=go.Bar(y=[2, 3, 1]))
fig.show()

在这里插入图片描述
或使用FigureWidget对象

import plotly.graph_objects as go
fig = go.FigureWidget(data=go.Bar(y=[2, 3, 1]))
fig

五、静态图像导出

plotly.py 支持静态图像导出,使用kaleido 包pip install kaleido(推荐,从plotly4.9 版开始支持)或orca 命令行实用程序(从plotly4.9 版开始)。

5.1 交互式与静态导出

在 Web 浏览器中查看时,绘图图形是交互式的:您可以将鼠标悬停在数据点、平移和缩放轴上,并通过单击或双击图例来显示和隐藏轨迹。您可以将图形导出为静态图像文件格式,如 PNG、JPEG、SVG 或 PDF

5.2 安装依赖

静态图像生成需要Kaleido(推荐,自plotly4.9 起支持)或orca(自plotly4.9 起支持)。kaleido可以使用 pip 安装该软件包

pip install -U kaleido -i https://mirror.baidu.com/pypi/simple

5.3 创建图形

现在让我们创建一个简单的散点图,其中包含 100 个不同颜色和大小的随机点。

import plotly.graph_objects as go
import numpy as np
np.random.seed(1)

N = 100
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
sz = np.random.rand(N) * 30

fig = go.Figure()
fig.add_trace(go.Scatter(
    x=x,
    y=y,
    mode="markers",
    marker=go.scatter.Marker(
        size=sz,
        color=colors,
        opacity=0.6,
        colorscale="Viridis"
    )
))

fig.show()

在这里插入图片描述

5.4 写入图像文件

该plotly.io.write_image函数用于将图像写入文件或类似文件的 Python 对象。您还可以使用.write_image图形对象的图形方法。

让我们首先创建一个输出目录来存储我们的图像

import os

if not os.path.exists("images"):
    os.mkdir("images")

5.5 图像格式:PNG、JPEG 和 WebP

plotly.py 可以将图形输出为多种图像格式,包括PNG、JPEG 和 WebP

fig.write_image("images/fig1.png")
fig.write_image("images/fig1.jpeg")
fig.write_image("images/fig1.webp")

5.6 矢量格式:SVG 和 PDF…

plotly.py 还可以输出多种矢量格式的图形,包括SVG 和 PDF…

fig.write_image("images/fig1.svg")
fig.write_image("images/fig1.pdf")
fig.write_image("images/fig1.eps")		# 需要 poppler 库

5.7 Dash 中的图像导出

from base64 import b64encode
import dash
from dash import dcc, html
from dash.dependencies import Input, Output
import plotly.express as px
from numpy.random import seed, rand
import numpy as np
import os

if not os.path.exists("images"):
    os.mkdir("images")

np.random.seed(1)
x, y, sz, cl = np.random.rand(4, 100)
fig = px.scatter(x=x, y=y, size=sz, color=cl)

app = dash.Dash(__name__)

app.layout = html.Div([
    html.P("渲染选项:"),
    dcc.RadioItems(
        id='render-option',
        options=[{'value': x, 'label': x}
                 for x in ['interactive', 'image']],
        value='image'
    ),
    html.Div(id='output'),
])

@app.callback(
    Output("output", "children"),
    [Input('render-option', 'value')])
def display_graph(render_option):
    if render_option == 'image':
        # 写出到文件夹
        fig.write_image("images/fig1.png")  
        # 写出到网页
        img_bytes = fig.to_image(format="png")
        encoding = b64encode(img_bytes).decode()
        img_b64 = "data:image/png;base64," + encoding
        return html.Img(src=img_b64, style={'width': '100%'})
    else:
        return dcc.Graph(figure=fig)

app.run_server(debug=True)

在这里插入图片描述

5.8 以字节为单位获取图像

该plotly.io.to_image函数用于将图像作为字节对象返回。您还可以使用.to_image图形对象的图形方法。

让我们将图形转换为PNG字节对象…

img_bytes = fig.to_image(format="png")

然后显示前20个字节。

b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\xbc'

5.9 将字节显示为图像使用 IPython.display.Image

可以使用IPython.display.Image类直接在notebook中显示表示 PNG 图像的字节对象。这也适用于Jupyter的Qt 控制台!

from IPython.display import Image
Image(img_bytes)

在这里插入图片描述

5.10 更改图像尺寸和比例

除了图像格式之外,to_image和write_image函数还提供参数以指定图像width和height逻辑像素。它们还提供了一个scale参数,可用于增加 ( scale> 1) 或减少 ( scale< 1) 结果图像的物理分辨率。

img_bytes = fig.to_image(format="png", width=600, height=350, scale=2)
Image(img_bytes)

在这里插入图片描述

5.11 图像导出设置 (Kaleido)

可以使用该plotly.io.kaleido.scope对象配置各种图像导出设置。例如,该default_format属性可用于指定默认导出格式应svg为png

import plotly.io as pio
pio.kaleido.scope.default_format = "svg"

以下是可用图像导出设置的完整列表:

  • default_width:用于图像导出的默认像素宽度。
  • default_height:用于图像导出的默认像素高度。
  • default_scale:应用于图像导出的默认图像比例因子。
  • default_format:导出时使用的默认图像格式。一"png",“jpeg”,“webp”,“svg”,“pdf”,或"eps"。
  • mathjax:渲染 LaTeX 字符所需的 MathJax 包的位置。默认为 CDN 位置。如果需要完全离线导出,请将其设置为本地 - MathJax 包。
  • topojson:呈现等值线轨迹所需的 topojson 文件的位置。默认为 CDN 位置。如果需要完全离线导出,请将其设置为包含- Plotly.js topojson 文件的本地目录。
  • mapbox_access_token:默认的 Mapbox 访问令牌。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岳涛@心馨电脑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值