Python轮子:plotly~让数据动起来

原文链接: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")

运行结果:生成价格曲线与成交量柱状图叠加