Python使用Plotly制作交互式圖表的操作指南
引言
Plotly是一款用來(lái)做數(shù)據(jù)分析和可視化的在線平臺(tái),功能真的是非常強(qiáng)大,它主要有以下特點(diǎn):
- 圖形多樣化:在線繪制多種圖形,比如柱狀圖、餅圖、直方圖、餅圖、氣泡圖、?;鶊D、股票圖、旭日?qǐng)D、聯(lián)合分布圖、地圖等
- 在線可編輯:Plotly中有在線編輯的平臺(tái),可以將生成的圖形保存到該平臺(tái),并進(jìn)行分享
- 開源免費(fèi):Plotly的所有資源都是開源免費(fèi)的,用戶可直接使用,還可以直接和R、python、MATLAB等軟件或者語(yǔ)言無(wú)縫對(duì)接
- 圖形動(dòng)態(tài)化:Plotly生成的圖形全部是動(dòng)態(tài)化;Plotly的繪圖最好在Jupyter notebook中進(jìn)行,能夠很好地顯示動(dòng)態(tài)效果
- 顏色絢麗:在使用Plotly繪制圖形的時(shí)候,我們可以進(jìn)行圖形顏色的設(shè)置,Plotly提供了豐富的顏色面板供選擇
- 代碼量少:Plotly繪圖,尤其是Plotly的高級(jí)封裝Plotly_Express,代碼量非常少;一行代碼就能實(shí)現(xiàn)多種功能且精美的圖形
- 內(nèi)置豐富數(shù)據(jù)集:在Plotly中內(nèi)置7個(gè)不同類型的數(shù)據(jù)集,方便讀者直接使用內(nèi)置數(shù)據(jù)進(jìn)行學(xué)習(xí)、使用
- 文檔健全:Plotly官方提供了豐富的文檔資料和案例可免費(fèi)學(xué)習(xí),能夠快速的上手
- 附錄:在官網(wǎng)中展示了Plotly能夠繪制的部分圖形:https://plotly.com/python/
本文將以Plotly為主介紹python中制作交互式圖表的典型用法和高級(jí)技巧。
核心概念
1. 圖表部件編程(updatemenus/sliders)
通過(guò) updatemenus 和 sliders 實(shí)現(xiàn)動(dòng)態(tài)交互功能,例如切換數(shù)據(jù)視圖或調(diào)整參數(shù)。
import plotly.graph_objects as go
fig = go.Figure()
# 添加多條折線
fig.add_trace(go.Scatter(y=[2, 1, 3], name="Line 1"))
fig.add_trace(go.Scatter(y=[3, 2, 1], name="Line 2"))
# 配置 updatemenus
fig.update_layout(
updatemenus=[
dict(
type="buttons",
direction="right",
buttons=[
dict(label="Show All", method="update", args=[{"visible": [True, True]}]),
dict(label="Show Line 1", method="update", args=[{"visible": [True, False]}]),
dict(label="Show Line 2", method="update", args=[{"visible": [False, True]}]),
],
)
]
)
fig.show()
效果:按鈕組允許用戶切換顯示不同的折線。

2. WebGL加速的大數(shù)據(jù)渲染
Plotly 支持 WebGL 渲染,適合處理大規(guī)模數(shù)據(jù)集。
import plotly.express as px import numpy as np # 模擬大數(shù)據(jù) np.random.seed(42) x = np.random.rand(100_000) y = np.random.rand(100_000) # 使用 WebGL 加速的散點(diǎn)圖 fig = px.scatter(x=x, y=y, render_mode='webgl', title="WebGL Accelerated Scatter Plot") fig.show()
效果:即使數(shù)據(jù)量達(dá)到 10 萬(wàn)點(diǎn),圖表依然流暢。

3. Dash回調(diào)鏈設(shè)計(jì)模式
Dash 是 Plotly 的框架,用于構(gòu)建交互式儀表盤。通過(guò)回調(diào)鏈實(shí)現(xiàn)復(fù)雜交互邏輯。
from dash import Dash, dcc, html, Input, Output
app = Dash(__name__)
app.layout = html.Div([
dcc.Input(id="input", value="Hello Plotly!", type="text"),
html.Div(id="output")
])
@app.callback(Output("output", "children"), [Input("input", "value")])
def update_output(value):
return f"You entered: {value}"
if __name__ == "__main__":
app.run_server(debug=True)
效果:輸入框內(nèi)容實(shí)時(shí)更新到輸出區(qū)域。
4. 圖表主題與模板系統(tǒng)
Plotly 提供豐富的主題和模板,可快速定制圖表風(fēng)格。
import plotly.express as px
df = px.data.gapminder().query("continent=='Oceania'")
fig = px.line(df, x="year", y="lifeExp", color="country", template="plotly_dark")
fig.show()
效果:深色主題的折線圖,適合夜間模式。

實(shí)戰(zhàn)案例
1. 實(shí)時(shí)疫情數(shù)據(jù)儀表盤開發(fā)
結(jié)合 Dash 和 Plotly 構(gòu)建實(shí)時(shí)疫情數(shù)據(jù)儀表盤。
from dash import Dash, dcc, html, Input, Output
import plotly.express as px
import pandas as pd
# 模擬疫情數(shù)據(jù)
data = {
"date": pd.date_range(start="2020-01-01", periods=100),
"cases": [i**2 for i in range(100)],
"deaths": [i * 5 for i in range(100)]
}
df = pd.DataFrame(data)
app = Dash(__name__)
app.layout = html.Div([
dcc.Graph(id="graph"),
dcc.Slider(
id="year-slider",
min=0,
max=len(df) - 1,
value=0,
marks={i: str(df["date"][i].date()) for i in range(0, len(df), 10)},
step=None
)
])
@app.callback(Output("graph", "figure"), [Input("year-slider", "value")])
def update_graph(selected_index):
filtered_df = df.iloc[:selected_index + 1]
fig = px.line(filtered_df, x="date", y=["cases", "deaths"], title="Covid-19 Cases Over Time")
return fig
if __name__ == "__main__":
app.run_server(debug=True)
效果:滑塊控制時(shí)間軸,動(dòng)態(tài)展示疫情數(shù)據(jù)變化。

2. 3D體素可視化與機(jī)器學(xué)習(xí)特征空間展示
使用 Plotly 繪制 3D 體素圖,展示機(jī)器學(xué)習(xí)特征空間。
import plotly.graph_objects as go
import numpy as np
# 創(chuàng)建 3D 體素?cái)?shù)據(jù)
x, y, z = np.indices((8, 8, 8))
cube1 = (x < 3) & (y < 3) & (z < 3)
cube2 = (x >= 5) & (y >= 5) & (z >= 5)
voxelarray = cube1 | cube2
colors = np.empty(voxelarray.shape, dtype=object)
colors[cube1] = 'blue'
colors[cube2] = 'red'
# 繪制 3D 體素圖
fig = go.Figure(data=go.Volume(
x=x.flatten(),
y=y.flatten(),
z=z.flatten(),
value=voxelarray.flatten(),
colorscale=["blue", "red"],
opacity=0.2,
surface_count=17
))
fig.show()
效果:3D 空間中兩個(gè)立方體的體素可視化。

擴(kuò)展思考
1. Plotly與Three.js的深度集成
Plotly 的底層基于 WebGL,可以與 Three.js 深度集成,用于更復(fù)雜的 3D 可視化場(chǎng)景。
// 示例:Three.js 與 Plotly 結(jié)合的偽代碼 // 在 Three.js 場(chǎng)景中嵌入 Plotly 圖表
2. 圖表交互行為的A/B測(cè)試設(shè)計(jì)
通過(guò) A/B 測(cè)試優(yōu)化圖表交互行為,提升用戶體驗(yàn)。
# 示例:記錄用戶點(diǎn)擊行為
from dash import Dash, dcc, html
import dash_bootstrap_components as dbc
app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = html.Div([
dcc.Graph(id="graph", figure=px.bar(x=[1, 2, 3], y=[3, 2, 1])),
html.Button("Option A", id="button-a"),
html.Button("Option B", id="button-b"),
html.Div(id="output")
])
@app.callback(Output("output", "children"), [Input("button-a", "n_clicks"), Input("button-b", "n_clicks")])
def update_output(clicks_a, clicks_b):
return f"Option A clicks: {clicks_a or 0}, Option B clicks: {clicks_b or 0}"
if __name__ == "__main__":
app.run_server(debug=True)
效果:記錄用戶對(duì)不同選項(xiàng)的偏好。
通過(guò)掌握這些核心概念和實(shí)戰(zhàn)案例,您將能夠創(chuàng)建出功能強(qiáng)大、交互性強(qiáng)的數(shù)據(jù)可視化作品。
以上就是Python使用Plotly制作交互式圖表的操作指南的詳細(xì)內(nèi)容,更多關(guān)于Python Plotly交互式圖表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch和tensorflow計(jì)算Flops和params的詳細(xì)過(guò)程
這篇文章主要介紹了pytorch和tensorflow計(jì)算Flops和params,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
有關(guān)wxpython pyqt內(nèi)存占用問(wèn)題分析
一直覺得wxpython占用內(nèi)存比較多,在工作中寫的一些小程序應(yīng)用,一對(duì)比其它的小程序,發(fā)現(xiàn)內(nèi)存相差確實(shí)有點(diǎn)大2014-06-06
python發(fā)送HTTP請(qǐng)求的方法小結(jié)
這篇文章主要介紹了python發(fā)送HTTP請(qǐng)求的方法,實(shí)例總結(jié)了GET、HEAD與POST方式發(fā)送http請(qǐng)求的相關(guān)技巧,需要的朋友可以參考下2015-07-07
python list中append()與extend()用法分享
列表是以類的形式實(shí)現(xiàn)的?!皠?chuàng)建”列表實(shí)際上是將一個(gè)類實(shí)例化。因此,列表有多種方法可以操作2013-03-03
查看已經(jīng)安裝的python版本和相關(guān)路徑信息的三種方法
Python是一門計(jì)算機(jī)程序編程語(yǔ)言,更是一種面向?qū)ο蟮膭?dòng)態(tài)類型語(yǔ)言,隨著版本的不斷更新和語(yǔ)言新功能的添加,越來(lái)越多被用于獨(dú)立的、大型項(xiàng)目的開發(fā),那么如何查看已安裝Python版本和路徑呢?我們通過(guò)這篇文章來(lái)了解一下2025-03-03
Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解
這篇文章主要介紹了Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

