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")

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

6)动画图表

动态展示数据变化过程

# juzicode.com/VX公众号:juzicode
import plotly.express as px

df = px.data.gapminder()
print(df)
fig = px.scatter(df, x="gdpPercap", y="lifeExp", 
                size="pop", color="continent",
                animation_frame="year", range_x=[100,100000], 
                range_y=[25,90])
fig.write_image('6.PNG')
fig.write_html('6.html')

运行结果:生成带时间滑块的动态气泡图

7)仪表盘控件

交互式参数调节界面

# juzicode.com/VX公众号:juzicode
import plotly.express as px

# ---------- 加载数据集 ----------
df = px.data.iris()  # 使用 Plotly 内置的鸢尾花数据集

# ---------- 绘制分面散点图 ----------
fig = px.scatter(
    df, 
    x="sepal_width", 
    y="sepal_length",
    facet_col="species",          # 按物种分面
    title="鸢尾花萼片尺寸分布"
)

# ---------- 添加交互按钮(线性回归) ----------
fig.update_layout(
    updatemenus=[
        dict(
            type="buttons",
            buttons=[
                dict(label="线性回归",
                    method="update",
                    args=[{"shapes": [dict(type="line", xref="paper",     yref="paper")]},  # 占位参数(需完善)
                        {"title": "添加线性回归线"}
                    ]
                )
            ]
        )
    ]
)

# ---------- 保存结果 ----------
fig.write_image('7.PNG')
fig.write_html('7.html')

运行结果:生成带回归线切换按钮的散点图

8)主题定制

应用预定义主题样式

# juzicode.com/VX公众号:juzicode
import plotly.express as px
import plotly.io as pio
pio.templates.default = "plotly_dark"

df = px.data.iris()
fig = px.scatter_matrix(df, dimensions=df.columns[:4], color="species")
fig.write_image('8.PNG')
fig.write_html('8.html')

运行效果:全局切换为暗黑主题

总结

Plotly核心优势:

  • 企业级交互式可视化解决方案
  • 支持复杂3D和地理可视化
  • 支持Jupyter Notebook内嵌展示

注意事项:

  • 大数据集需使用WebGL加速
  • 离线使用需配置本地资源
  • 移动端适配需特殊处理

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注