文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
在 Python 中显示图形
使用 Plotly 的 Python 图形库显示图形。
显示图形
Plotly的Python图形库plotly.py
提供了多种显示图形的选项和方法。
通常有五种不同的方法可以显示plotly
图形:
- 在脚本或笔记本中使用
renderers
框架(本文主要主题) - 在Web应用中使用Dash
- 在
ipywidgets
环境中使用FigureWidget
而非Figure
- 导出为HTML文件并在浏览器中立即或稍后加载
- 使用Kaleido将图形渲染为静态图像文件(如PNG/JPEG/SVG/PDF/EPS)并在任何查看器中加载
下文将讨论前三种方法。
使用renderers
框架显示图形
renderers
框架是一种灵活的方法,可在多种环境中显示plotly.py
图形。要使用此框架显示图形,可以在图形对象上调用.show()
方法,或将图形传递给plotly.io.show
函数。两种方式都会使用当前默认的渲染器显示图形。
python
import plotly.graph_objects as go
fig = go.Figure(
data=[go.Bar(y=[2, 1, 3])],
layout_title_text="使用fig.show()显示的图形"
)
fig.show()

大多数情况下,可以省略.show()
调用,让图形自动显示:
python
import plotly.graph_objects as go
fig = go.Figure(
data=[go.Bar(y=[2, 1, 3])],
layout_title_text="自动显示的图形"
)
fig

需满足两个条件才能自动显示图形:首先,单元格中的最后一个表达式必须是图形;其次,plotly.py
必须在IPython
内核中运行。
多数环境下会自动选择合适的渲染器,无需额外配置。 这些环境包括经典的Jupyter Notebook、JupyterLab、VS Code笔记本、Google Colab、Kaggle笔记本、Azure笔记本以及Python交互式shell。
其他环境(如IPython控制台、QtConsole、Spyder等)也支持兼容的渲染器。
接下来将介绍如何配置默认渲染器,并详细描述所有内置渲染器及其适用场景。
注意:renderers
框架是早期版本中plotly.offline.iplot
和plotly.offline.plot
函数的通用化实现。这些函数已通过renderers
框架重构,仍支持向后兼容,但本文不作讨论。
设置默认渲染器
使用plotly.io.renderers
配置对象管理当前和可用的渲染器。显示此对象可查看当前默认渲染器和所有可用渲染器列表。
python
import plotly.io as pio
pio.renderers
您看到的默认渲染器可能与此处不同,因为plotly.py
会在启动时尝试自动检测合适的渲染器。可通过将可用渲染器名称赋值给pio.renderers.default
属性来更改默认渲染器。例如,切换到在默认浏览器标签页中打开图形的'browser'
渲染器:
python
import plotly.io as pio
pio.renderers.default = "browser"
注意:默认渲染器在单次会话中持续有效,但不会跨会话保存。在IPython
内核中工作意味着默认渲染器在内核生命周期内有效,但重启内核后不会保留。
也可通过系统环境变量设置默认渲染器。启动时,plotly.py
会检查名为PLOTLY_RENDERER
的环境变量。如果此变量设置为可用渲染器名称,则将其设为默认值。
临时覆盖默认渲染器
可通过向show()
方法传递renderer
参数临时覆盖默认渲染器。以下示例在不更改默认渲染器的情况下使用svg
渲染器(后文介绍)显示图形:
python
import plotly.graph_objects as go
fig = go.Figure(
data=[go.Bar(y=[2, 1, 3])],
layout_title_text="使用'svg'渲染器显示的图形"
)
fig.show(renderer="svg")
内置渲染器
本节详细介绍内置渲染器,以便选择最适合需求的选项。
交互式渲染器
交互式渲染器使用plotly.js JavaScript库显示图形,支持平移、缩放、悬停提示等交互功能。
notebook
专为经典Jupyter Notebook(非JupyterLab)设计。首次渲染图形时将完整的plotly.js JavaScript库添加到笔记本中,因此无需互联网连接。
此渲染器适合导出为HTML文件的笔记本(通过nbconvert或"下载为HTML"操作),因为导出的HTML文件可离线工作。
注意:添加plotly.js包会使笔记本增加几MB大小。若始终有网络连接,可考虑使用notebook_connected
渲染器以减小笔记本体积。
notebook_connected
与notebook
渲染器相同,但plotly.js库从在线CDN加载。这节省了几MB空间,但需要互联网连接才能显示图形。
此渲染器适合通过nbviewer共享的笔记本,因为用户需联网才能访问nbviewer。
kaggle
和azure
notebook_connected
的别名,适用于Kaggle内核和Azure Notebooks。
colab
专为Google Colab设计的自定义渲染器。
browser
在默认浏览器的标签页中打开图形。此渲染器要求Python内核与浏览器在同一本地机器运行,不兼容Jupyter Hub或在线笔记本服务。
实现说明1:"默认浏览器"由Python
webbrowser
模块选择。实现说明2:通过单次使用的本地Web服务器在端口上提供图形。服务器在图形加载后立即关闭,因此刷新浏览器无法恢复图形。
firefox
、chrome
和chromium
与browser
渲染器相同,但强制使用特定浏览器。
iframe
和iframe_connected
将图形写入独立的HTML文件,并显示引用这些文件的iframe
元素。iframe
渲染器在HTML文件中包含plotly.js库,iframe_connected
则引用在线CDN位置加载plotly.js。因此iframe_connected
生成的文件更小,但需要联网。
此渲染器适用于包含大量大型图形的笔记本。使用notebook
或notebook_connected
时,所有图形数据都内联存储在笔记本中。如果导致笔记本过大,可使用iframe
渲染器替代,图形数据存储在单独的HTML文件中,从而减小笔记本体积。
实现说明:HTML文件存储在iframe_figures
子目录中,文件名基于生成图形的笔记本单元格执行序号。这意味着每次重启内核都会覆盖之前的HTML文件。因此不应在相同目录存储多个使用iframe
渲染器的笔记本,否则可能导致图形相互覆盖。
plotly_mimetype
创建图形的规范(称为MIME类型包),并请求当前用户界面显示它。支持此渲染器的界面包括JupyterLab、nteract和VS Code笔记本界面。
jupyterlab
、nteract
和vscode
plotly_mimetype
的别名,适用于JupyterLab、nteract和VS Code笔记本界面。注意在VSCode中,用于渲染的plotly.js版本由vscode-python扩展提供,通常比最新版落后数周,因此最新功能可能无法立即使用。Nteract情况类似。
静态图像渲染器
提供一组渲染器将图形显示为静态图像。详见静态图像导出页面。
png
、jpeg
和svg
这些渲染器将图形显示为静态的.png
、.jpeg
和.svg
文件。适用于不支持内联HTML输出但支持内联静态图像的环境,如QtConsole、Spyder和PyCharm笔记本界面。
python
import plotly.graph_objects as go
fig = go.Figure(
data=[go.Bar(y=[2, 1, 3])],
layout_title_text="使用'png'渲染器显示的图形"
)
fig.show(renderer="png")
pdf
将图形显示为静态PDF文件。特别适用于通过nbconvert的LaTeX导出功能导出为PDF的笔记本。
其他渲染器
json
在支持的环境(JupyterLab、nteract、VS Code笔记本界面)中,以可折叠的交互式树结构显示图形的JSON表示。这对检查复杂图形的结构非常有用。
多渲染器
通过用"+"
连接名称可指定多个渲染器。这在需要支持多环境的代码中很有用。例如,如果笔记本的默认渲染器字符串为"notebook+plotly_mimetype+pdf"
,则该笔记本可在经典Jupyter Notebook、JupyterLab中运行,并支持通过nbconvert
导出为PDF。
自定义内置渲染器
大多数内置渲染器都有可配置选项。要查看渲染器描述及其配置选项,可在plotly.io.renderers
配置对象上使用字典式键访问并显示它。例如访问并显示png
渲染器:
python
import plotly.io as pio
png_renderer = pio.renderers["png"]
png_renderer
输出显示png
渲染器支持三个属性:width
、height
和scale
。可通过赋值自定义这些属性。
以下示例自定义png
渲染器更改图像尺寸,设为默认渲染器后显示图形:
python
import plotly.io as pio
png_renderer = pio.renderers["png"]
png_renderer.width = 500
png_renderer.height = 500
pio.renderers.default = "png"
import plotly.graph_objects as go
fig = go.Figure(
data=[go.Bar(y=[2, 1, 3])],
layout_title_text="使用'png'渲染器显示的图形"
)
fig.show()

也可通过向show()
方法传递关键字参数临时覆盖渲染器参数值:
python
import plotly.graph_objects as go
fig = go.Figure(
data=[go.Bar(y=[2, 1, 3])],
layout_title_text="使用'png'渲染器显示的图形"
)
fig.show(renderer="png", width=800, height=300)

在Dash中显示图形
Dash是使用Plotly图形构建Python分析应用的最佳方式。要运行下方应用,请执行pip install dash
,点击"Download"获取代码并运行python app.py
。
python
from dash import Dash, dcc, html, Input, Output
import plotly.graph_objects as go
import numpy as np
app = Dash(__name__)
app.layout = html.Div([
html.H4('Interactive plot with custom data source'),
dcc.Graph(id="graph"),
html.P("Number of bars:"),
dcc.Slider(id="slider", min=2, max=10, value=4, step=1),
])
@app.callback(
Output("graph", "figure"),
Input("slider", "value"))
def update_bar_chart(size):
data = np.random.normal(3, 2, size=size) # replace with your own data source
fig = go.Figure(
data=[go.Bar(y=data)],
layout_title_text="Native Plotly rendering in Dash"
)
return fig
app.run(debug=True)
使用ipywidgets
显示图形
Plotly图形可在ipywidgets环境中通过plotly.graph_objects.FigureWidget
对象显示。FigureWidget
既是图形对象(类似plotly.graph_objects.Figure
),因此可以像常规Figure
一样添加轨迹和更新;同时也是ipywidgets
对象,这意味着可与其他ipywidgets
一起显示以构建用户界面。
详见Plotly FigureWidget概述了解如何将plotly.py
图形与ipywidgets
集成。
重要提示:FigureWidget
不使用上述渲染器框架,因此不应在FigureWidget
对象上使用plotly.io.show
函数。
性能
无论选择何种方式显示图形,图形数据结构都会首先(自动在内部)序列化为JSON字符串,然后从Python环境传输到浏览器(或先到HTML文件,或到Kaleido进行静态图像导出)。
5.0版新增功能
对于包含大量数据点或大型numpy
数组/数据框的图形,默认JSON序列化机制可能较慢。如果安装了orjson
包 ,plotly
将使用它替代内置的json
包,这可为大型图形带来5-10倍加速。
图形序列化为JSON后,必须由浏览器渲染(立即在用户浏览器中,或导出为HTML后稍后渲染),或由Kaleido的内部无头浏览器为静态图像导出立即渲染。渲染时间通常与图形中的数据点总数、轨迹数和子图数量成正比。当渲染性能较慢时,建议考虑使用plotly
WebGL轨迹利用浏览器的GPU加速渲染,或使用Datashader库在Python端渲染后通过px.imshow()
渲染图形。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。