【Python】使用Plotly库创建交互式可视化图表:折线图、散点图、柱状图及3D图实战指南

Plotly 是一个功能强大的 Python 库,用于创建交互式、可视化的图表,适用于数据分析、科学计算和仪表板开发。它支持多种图表类型(如折线图、散点图、柱状图、3D 图等),并生成可在浏览器中交互的 HTML 图表。Plotly 的子模块 plotly.express 提供了简洁的高层次 API,适合快速绘图,而 plotly.graph_objects 则提供更精细的控制。Plotly 图表可以导出为静态图像、嵌入 Web 应用,或与 DashStreamlit 集成。

以下是对 Plotly 库的详细介绍,包括其功能、用法和实际应用。


1. Plotly 库的作用

  • 交互式可视化:生成支持缩放、悬停、点击等交互的图表。
  • 多平台支持:图表可在 Jupyter Notebook、Web 浏览器、VS Code 中显示。
  • 丰富图表类型:支持 2D、3D、地理、统计、财务等多种图表。
  • 易于集成:与 Pandas、NumPy、Streamlit、Dash 等库无缝协作。
  • 导出与共享:支持导出为 PNG、PDF、HTML,或通过 Plotly Chart Studio 分享。

  • 2. 安装与环境要求

  • Python 版本:支持 Python 3.6+(推荐 3.8+)。
  • 依赖
  • numpy:数值计算。
  • pandas:数据处理。
  • tenacity:重试逻辑。
  • 安装命令
    pip install plotly
    
  • Jupyter 支持(可选):
    pip install jupyterlab
    jupyter labextension install jupyterlab-plotly
    
  • 导出静态图像(需安装 kaleido):
    pip install kaleido
    
  • 验证安装
    import plotly
    print(plotly.__version__)  # 示例输出: 5.24.1
    

  • 3. 核心功能与用法

    Plotly 提供两个主要接口:plotly.express(高层次,快速绘图)和 plotly.graph_objects(低层次,精细控制)。以下是主要功能和示例。

    3.1 Plotly Express(快速绘图)

    plotly.express 提供简洁的 API,适合快速生成常见图表。

    import plotly.express as px
    import pandas as pd
    
    # 示例数据
    df = pd.DataFrame({
        "x": [1, 2, 3, 4],
        "y": [10, 15, 13, 17],
        "category": ["A", "B", "A", "B"]
    })
    
    # 折线图
    fig = px.line(df, x="x", y="y", color="category", title="Line Chart")
    fig.show()
    

    说明

  • px.line:绘制折线图,color 指定分组。
  • fig.show():在浏览器或 Jupyter 中显示交互式图表。
  • 散点图

    fig = px.scatter(df, x="x", y="y", color="category", size="y", title="Scatter Plot")
    fig.show()
    

    柱状图

    fig = px.bar(df, x="x", y="y", color="category", title="Bar Chart")
    fig.show()
    
    3.2 Graph Objects(精细控制)

    plotly.graph_objects 提供更灵活的配置,适合复杂图表。

    import plotly.graph_objects as go
    
    # 创建图表
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=df["x"], y=df["y"], mode="lines+markers", name="Data"))
    fig.update_layout(
        title="Custom Line Chart",
        xaxis_title="X Axis",
        yaxis_title="Y Axis",
        template="plotly_dark"
    )
    fig.show()
    

    说明

  • go.Scatter:添加折线/散点轨迹。
  • update_layout:设置标题、轴标签、主题等。
  • 3.3 3D 图表

    支持 3D 散点图、表面图等。

    import plotly.express as px
    import numpy as np
    
    # 示例数据
    z = np.random.rand(10, 10)
    fig = px.imshow(z, title="Heatmap")
    fig.show()
    
    # 3D 散点图
    df = px.data.iris()
    fig = px.scatter_3d(df, x="sepal_length", y="sepal_width", z="petal_length", color="species")
    fig.show()
    

    说明

  • px.imshow:绘制热图。
  • px.scatter_3d:绘制 3D 散点图。
  • 3.4 地理图表

    支持地图和地理数据可视化。

    import plotly.express as px
    
    # 示例数据
    df = px.data.gapminder().query("year == 2007")
    fig = px.scatter_geo(
        df,
        locations="iso_alpha",
        size="pop",
        color="continent",
        hover_name="country",
        title="World Population"
    )
    fig.show()
    

    说明

  • px.scatter_geo:绘制全球散点图,locations 使用 ISO 国家代码。
  • 3.5 交互功能

    Plotly 图表支持以下交互:

  • 缩放:拖动或滚轮调整视图。
  • 悬停:显示数据点详情。
  • 点击:触发事件(需 JavaScript 或 Dash 集成)。
  • 下载:点击图表工具栏的相机图标保存 PNG。
  • fig = px.line(df, x="x", y="y")
    fig.update_traces(hovertemplate="X: %{x}<br>Y: %{y}")
    fig.show()
    

    说明

  • hovertemplate:自定义悬停提示。
  • 3.6 导出与保存

    将图表保存为文件或嵌入 HTML。

    # 保存为 PNG
    fig.write_image("chart.png")
    
    # 保存为 HTML
    fig.write_html("chart.html")
    
    # 保存为 JSON
    fig.write_json("chart.json")
    

    说明

  • write_image 需安装 kaleido
  • write_html 生成独立 HTML 文件,可嵌入网站。

  • 4. 性能与特点

  • 高效性:基于 JavaScript 的 WebGL 渲染,适合大数据可视化。
  • 交互性:支持动态交互,无需额外配置。
  • 跨平台:图表可在本地、云端、Jupyter 中一致显示。
  • 局限性
  • 大型数据集(>10万点)可能导致渲染缓慢,需降采样。
  • 复杂 3D 图表对浏览器性能要求较高。
  • 主题支持:内置主题(如 plotlyplotly_darkseaborn)。

  • 5. 实际应用场景

  • 数据分析:探索性数据分析(EDA),展示趋势和分布。
  • 仪表板:与 Streamlit 或 Dash 集成,构建交互式仪表板。
  • 科学研究:可视化实验数据(如物理、生物学)。
  • 商业报告:生成动态报告,嵌入 PowerPoint 或网页。
  • 机器学习:展示模型性能(如 ROC 曲线、混淆矩阵)。
  • 示例(Streamlit 集成)

    import streamlit as st
    import plotly.express as px
    import pandas as pd
    
    st.title("Interactive Plotly Dashboard")
    
    # 数据
    df = pd.DataFrame({
        "x": range(10),
        "y": [2, 4, 1, 5, 3, 6, 2, 7, 4, 8]
    })
    
    # 交互控件
    chart_type = st.selectbox("Chart Type", ["Line", "Scatter"])
    if chart_type == "Line":
        fig = px.line(df, x="x", y="y")
    else:
        fig = px.scatter(df, x="x", y="y")
    st.plotly_chart(fig)
    

    说明

  • 用户选择图表类型,动态更新 Plotly 图表。

  • 6. 部署与共享

  • 本地运行
  • fig.show() 在浏览器显示图表。
  • Jupyter Notebook
    import plotly.io as pio
    pio.renderers.default = "notebook"
    fig.show()
    
  • Dash 集成
    from dash import Dash, dcc, html
    app = Dash(__name__)
    app.layout = html.Div([dcc.Graph(figure=fig)])
    app.run_server(debug=True)
    
  • Chart Studio(云共享):
    import plotly.io as pio
    pio.write_to_plotly(fig, filename="my-chart")
    
  • 需注册 Plotly 账户并设置 API 密钥:
    import plotly
    plotly.tools.set_credentials_file(username="your_username", api_key="your_api_key")
    

  • 7. 注意事项

  • 性能
  • 大数据集建议使用 plotly.expressrender_mode="webgl"
    fig = px.scatter(df, x="x", y="y", render_mode="webgl")
    
  • 避免在循环中频繁调用 fig.show()
  • 兼容性
  • 确保 plotly 和可视化库(如 pandas)版本兼容。
  • 最新版本(截至 2025,5.24.1)支持更多功能。
  • 浏览器支持
  • 某些 3D 图表在旧浏览器可能渲染不佳。
  • 导出问题
  • 静态图像导出需 kaleido,可能因字体或系统配置报错。
  • 学习曲线
  • plotly.express 简单易学,graph_objects 需熟悉对象结构。

  • 8. 综合示例

    以下是一个综合示例,展示多种图表类型和交互功能:

    import streamlit as st
    import plotly.express as px
    import plotly.graph_objects as go
    import pandas as pd
    
    st.title("Plotly Visualization Dashboard")
    
    # 示例数据
    df = px.data.gapminder().query("year == 2007")
    
    # 选择图表类型
    chart_type = st.selectbox("Select Chart Type", ["Scatter", "Bar", "Geo"])
    
    if chart_type == "Scatter":
        fig = px.scatter(
            df,
            x="gdpPercap",
            y="lifeExp",
            size="pop",
            color="continent",
            hover_name="country",
            log_x=True,
            title="GDP vs Life Expectancy"
        )
    elif chart_type == "Bar":
        fig = px.bar(
            df,
            x="continent",
            y="pop",
            color="continent",
            title="Population by Continent"
        )
    else:
        fig = px.scatter_geo(
            df,
            locations="iso_alpha",
            size="pop",
            color="continent",
            hover_name="country",
            title="World Population Map"
        )
    
    # 自定义布局
    fig.update_layout(
        template="plotly_dark",
        xaxis_title="X Axis",
        yaxis_title="Y Axis"
    )
    
    # 显示图表
    st.plotly_chart(fig)
    
    # 保存选项
    if st.button("Save as PNG"):
        fig.write_image("chart.png")
        st.write("Chart saved as chart.png")
    

    说明

  • 用户选择图表类型(散点图、柱状图、地理图)。
  • 图表使用暗主题,支持悬停和缩放。
  • 提供保存为 PNG 的功能。

  • 9. 资源与文档

  • 官方文档:https://plotly.com/python/
  • GitHub 仓库:https://github.com/plotly/plotly.py
  • PyPI 页面:https://pypi.org/project/plotly/
  • Plotly Express 教程:https://plotly.com/python/plotly-express/
  • Dash 文档:https://dash.plotly.com/
  • 社区论坛:https://community.plotly.com/
  • 作者:彬彬侠

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python】使用Plotly库创建交互式可视化图表:折线图、散点图、柱状图及3D图实战指南

    发表回复