文中內容僅限技術學習與代碼實踐參考,市場存在不確定性,技術分析需謹慎驗證,不構成任何投資建議。
在 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
函數。兩種方式都會使用當前默認的渲染器顯示圖形。
import plotly.graph_objects as go
fig = go.Figure(data=[go.Bar(y=[2, 1, 3])],layout_title_text="使用fig.show()顯示的圖形"
)
fig.show()
大多數情況下,可以省略.show()
調用,讓圖形自動顯示:
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
配置對象管理當前和可用的渲染器。顯示此對象可查看當前默認渲染器和所有可用渲染器列表。
import plotly.io as pio
pio.renderers
您看到的默認渲染器可能與此處不同,因為plotly.py
會在啟動時嘗試自動檢測合適的渲染器。可通過將可用渲染器名稱賦值給pio.renderers.default
屬性來更改默認渲染器。例如,切換到在默認瀏覽器標簽頁中打開圖形的'browser'
渲染器:
import plotly.io as pio
pio.renderers.default = "browser"
注意:默認渲染器在單次會話中持續有效,但不會跨會話保存。在IPython
內核中工作意味著默認渲染器在內核生命周期內有效,但重啟內核后不會保留。
也可通過系統環境變量設置默認渲染器。啟動時,plotly.py
會檢查名為PLOTLY_RENDERER
的環境變量。如果此變量設置為可用渲染器名稱,則將其設為默認值。
臨時覆蓋默認渲染器
可通過向show()
方法傳遞renderer
參數臨時覆蓋默認渲染器。以下示例在不更改默認渲染器的情況下使用svg
渲染器(后文介紹)顯示圖形:
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筆記本界面。
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
渲染器:
import plotly.io as pio
png_renderer = pio.renderers["png"]
png_renderer
輸出顯示png
渲染器支持三個屬性:width
、height
和scale
。可通過賦值自定義這些屬性。
以下示例自定義png
渲染器更改圖像尺寸,設為默認渲染器后顯示圖形:
import plotly.io as pio
png_renderer = pio.renderers["png"]
png_renderer.width = 500
png_renderer.height = 500pio.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()
方法傳遞關鍵字參數臨時覆蓋渲染器參數值:
import plotly.graph_objects as gofig = 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
。
參考官方Dash文檔入門,學習如何輕松設計和部署此類應用。
from dash import Dash, dcc, html, Input, Output
import plotly.graph_objects as go
import numpy as npapp = 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 sourcefig = go.Figure(data=[go.Bar(y=data)],layout_title_text="Native Plotly rendering in Dash")return figapp.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()
渲染圖形。
風險提示與免責聲明
本文內容基于公開信息研究整理,不構成任何形式的投資建議。歷史表現不應作為未來收益保證,市場存在不可預見的波動風險。投資者需結合自身財務狀況及風險承受能力獨立決策,并自行承擔交易結果。作者及發布方不對任何依據本文操作導致的損失承擔法律責任。市場有風險,投資須謹慎。