原文链接:http://www.juzicode.com/python-module-plotly
Plotly 是基于JavaScript的高级可视化库,提供50+种交互式图表类型,支持Web、Jupyter Notebook及Dash应用开发,适用于科研可视化、商业智能和实时数据监控场景。
应用场景
- 交互式数据探索分析
- 金融时间序列可视化
- 3D科学模型渲染
- 机器学习结果可视化
- 实时数据仪表盘开发
- 学术论文动态图表
安装与导入
pip install plotly
写图片文件需要额外安装kaleido
pip install kaleido
import plotly.express as px
import plotly.graph_objects as go
使用方法
1)散点图矩阵
从plotly内置的数据源中获取iris数据,生成多维数据快速探索分析。
# juzicode.com/VX公众号:juzicode
import plotly.express as px
import plotly.graph_objects as go
df = px.data.iris()
fig = px.scatter_matrix(df, dimensions=df.columns[:4], color="species")
print(type(fig))
print(dir(fig))
#fig.show()
fig.write_image('1.PNG')
fig.write_html('1.html')
fig.write_json('1.json')
运行结果:生成鸢尾花数据集的多维散点矩阵

2)动态折线图
先用numpy随机生成数据,再用Scatter()方法实现带悬停标签的时间序列可视化。
# juzicode.com/VX公众号:juzicode
import plotly.graph_objects as go
import numpy as np
x = np.arange(0, 10, 0.1)
fig = go.Figure(data=go.Scatter(x=x, y=np.sin(x), mode='lines+markers'))
fig.update_layout(title='动态正弦波')
fig.write_image('2.PNG')
fig.write_html('2.html')
fig.write_json('2.json')
运行结果:生成带数据点的可缩放正弦曲线

3)3D曲面图
用Surface()方法实现数学函数的三维可视化。
# juzicode.com/VX公众号:juzicode
import plotly.graph_objects as go
import numpy as np
x = np.linspace(-5,5,100)
y = np.linspace(-5,5,100)
X, Y = np.meshgrid(x,y)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = go.Figure(data=[go.Surface(z=Z)])
fig.write_image('3.PNG')
fig.write_html('3.html')
运行结果:生成可旋转的3D正弦曲面

4)地理热力图
人均gdp在地图上显示。
# juzicode.com/VX公众号:juzicode
import plotly.express as px
df = px.data.gapminder().query("year==2007")
fig = px.choropleth(
df,
locations="iso_alpha",
color="gdpPercap",
hover_name="country",
projection="natural earth",
scope="world", # 使用内置低精度地图
locationmode="ISO-3" # 明确指定 ISO 编码模式
)
fig.write_image('4b.PNG')
fig.write_html('4b.html')
运行结果:生成可交互的世界地图GDP分布

5)组合图表
用numpy省级股票价格和成交量数据,再生成双轴股票数据分析图。
# juzicode.com/VX公众号:juzicode
import pandas as pd
import numpy as np
import plotly.graph_objects as go
# ---------- 生成示例数据 ----------
dates = pd.date_range(start="2025-01-01", periods=30, freq="D")
df = pd.DataFrame({
"date": dates,
"price": np.random.normal(100, 10, 30).cumsum(),
"volume": np.random.randint(50, 200, 30)
})
# ---------- 绘制双轴图 ----------
fig = go.Figure()
# 添加价格折线图(左侧Y轴)
fig.add_trace(
go.Scatter(x=df.date, y=df.price, name="价格")
)
# 添加成交量柱状图(右侧Y轴)
fig.add_trace(
go.Bar(x=df.date, y=df.volume, name="成交量", yaxis="y2")
)
# 配置右侧Y轴
fig.update_layout(
title="价格与成交量趋势图",
xaxis=dict(title="日期"),
yaxis=dict(title="价格", side="left"),
yaxis2=dict(
title="成交量",
overlaying="y",
side="right",
showgrid=False # 右侧Y轴不显示网格线
),
legend=dict(x=0.1, y=1.1) # 调整图例位置
)
# 保存图片和HTML文件
fig.write_image("5.png")
fig.write_html("5.html")
运行结果:生成价格曲线与成交量柱状图叠加
