【Python】【数据分析】深入探索 Python 数据可视化:Plotly 绘图库全面解析

这里写目录标题

  • 引言
  • [一、Plotly 概述](#一、Plotly 概述)
  • [二、安装 Plotly](#二、安装 Plotly)
  • [三、Plotly 的结构与功能模块](#三、Plotly 的结构与功能模块)
    • [3.1 Plotly Graph Objects](#3.1 Plotly Graph Objects)
    • [3.2 Plotly Express](#3.2 Plotly Express)
    • [3.3 Plotly Subplots](#3.3 Plotly Subplots)
  • [四、Plotly 图表类型](#四、Plotly 图表类型)
  • [五、Plotly 图表自定义与美化](#五、Plotly 图表自定义与美化)
    • [5.1 自定义图表标题和坐标轴](#5.1 自定义图表标题和坐标轴)
    • [5.2 自定义颜色和样式](#5.2 自定义颜色和样式)
    • [5.3 添加注释和文本](#5.3 添加注释和文本)
    • [5.4 图表背景和网格线](#5.4 图表背景和网格线)
  • [六、Plotly 与 Dash 集成](#六、Plotly 与 Dash 集成)
  • 七、高级功能与技巧
    • [7.1 动态更新图表](#7.1 动态更新图表)
    • [7.2 数据筛选和交互](#7.2 数据筛选和交互)
    • [7.3 图表导出与分享](#7.3 图表导出与分享)
  • 总结
  • 参考文献

引言

在数据科学、分析和机器学习领域,数据可视化是一项至关重要的技能。它不仅帮助我们快速理解数据,还能清晰地传达复杂的信息,从而提升决策效率。在众多 Python 绘图库中,Plotly 以其强大的交互式图表功能脱颖而出,成为数据可视化领域的热门工具。

Plotly 是一个强大的 Python 库,用于创建交互式图表。它支持从简单的折线图到复杂的 3D 图形以及地图的多种图表类型。与传统的静态图表库(如 Matplotlib)不同,Plotly 提供了图形交互性和动态更新功能,极大地增强了数据可视化的效果和用户体验。

本文将详细介绍如何使用 Plotly 创建不同类型的图表,并通过丰富的示例帮助你理解如何将 Plotly 应用于实际项目中。我们将介绍 Plotly 的基础安装、基本图表类型、常见定制方法、与 Dash 的结合使用以及如何将图表导出和分享。整理优化

一、Plotly 概述

Plotly 是一个开源的图表库,提供了交互式的数据可视化功能。它支持多种类型的图表,能够创建非常丰富的图形,包括线图、柱状图、散点图、3D 图、地图等。

Plotly 是一个开源的可视化库,提供了多种丰富的图表类型,包括基本图表(如折线图、条形图、饼图)以及更复杂的图表(如散点图、热图、3D 图、地图)。它的主要特点是图表不仅支持交互式操作,还具备高质量的输出,适合在网页和报告中展示。

Plotly 的主要特点

  • 交互式图表:用户可以通过鼠标缩放、平移、悬停查看数值等交互方式与图表进行操作。
  • 广泛的图表类型支持:Plotly 支持折线图、柱状图、饼图、散点图、热图、箱线图等,适用于多种数据展示需求。
  • 高度定制化:用户可以控制图表的每一个细节,包含颜色、样式、字体、图例等。
  • 导出与集成:图表可以导出为高质量的 PNG、JPEG、SVG 等格式,或者嵌入到 Web 应用中,甚至与 Dash 集成,开发交互式仪表盘。
  • 与 Jupyter Notebook 的兼容性:能够与 Jupyter Notebook 集成,支持交互式展示和分析。

二、安装 Plotly

使用 Plotly 之前,首先需要在 Python 环境中安装它。可以使用 pip 包管理工具进行安装:

bash 复制代码
pip install plotly

安装成功后,可以通过以下代码检查 Plotly 是否正确安装:

python 复制代码
import plotly
print(plotly.__version__)

这将输出 Plotly 的版本号,确保库已成功安装。

三、Plotly 的结构与功能模块

Plotly 是一个由多个模块组成的强大工具,每个模块具有不同的功能,适用于不同的使用场景。主要模块包括:

  • plotly.graph_objects:底层模块,允许用户手动创建各种图形,并精确控制图表的外观。
  • plotly.express:高层接口,简化图表创建流程,适用于快速生成常见类型的图表。
  • plotly.subplots:用于创建包含多个子图的布局,便于将多个图表组合在同一页面中。
  • plotly.io:用于输入输出操作,例如将图表保存为图像文件或导出为 HTML。
  • Dash:基于 Plotly 的 Web 应用框架,用于构建交互式数据仪表盘。

这些模块结合使用,可以帮助用户高效地进行数据可视化和创建交互式应用。

3.1 Plotly Graph Objects

plotly.graph_objs 是一个较低级别的接口,提供更多的灵活性。你可以通过配置图表的每个细节来完全控制图表的样式和外观。

下面是经过更正和补充后的完整示例,确保了格式一致性并修正了重复的标题编号:

  1. 折线图

Plotly 中,创建折线图非常简单。以下是一个基础的折线图的示例:

python 复制代码
import plotly.graph_objects as go

# 创建图表对象
fig = go.Figure()

# 添加折线图数据
fig.add_trace(go.Scatter(
    x=[1, 2, 3, 4],  # X轴数据
    y=[10, 11, 12, 13],  # Y轴数据
    mode='lines+markers',  # 显示折线和标记点
    name='示例线'
))

# 设置标题和轴标签
fig.update_layout(
    title='基础折线图',
    xaxis_title='X 轴',
    yaxis_title='Y 轴'
)

# 展示图表
fig.show()

解释

  • go.Figure():用于创建一个空的图表对象。
  • go.Scatter():是用来绘制散点图或折线图的函数。
  • mode='lines+markers':表示绘制折线并标出每个点。
  • fig.update_layout():用于设置图表的标题、坐标轴标签等。

输出图像

  1. 条形图

条形图常用于表示不同类别之间的数量比较。以下是创建条形图的代码:

python 复制代码
import plotly.graph_objects as go

# 创建条形图
fig = go.Figure(go.Bar(
    x=["A", "B", "C", "D"],  # 类别
    y=[10, 20, 30, 40]  # 各类别对应的数值
))

# 设置标题和轴标签
fig.update_layout(
    title='条形图示例',
    xaxis_title='类别',
    yaxis_title='值'
)

# 展示图表
fig.show()

解释

  • go.Bar():用于创建条形图。
  • xy:定义条形图的分类变量和对应的数值。

输出图像

  1. 饼图

饼图适合展示各部分占整体的比例,以下是一个简单的饼图示例:

python 复制代码
import plotly.graph_objects as go

# 创建饼图
fig = go.Figure(go.Pie(
    labels=["A", "B", "C", "D"],  # 标签
    values=[10, 20, 30, 40]  # 各部分占比
))

# 设置标题
fig.update_layout(
    title='饼图示例'
)

# 展示图表
fig.show()

解释

  • go.Pie():用于创建饼图。
  • labelsvalues:指定饼图的各个部分的标签和对应的值。

输出图像

  1. 3D 散点图

3D 散点图用于展示三维数据,适用于具有多个变量的数据集:

python 复制代码
import plotly.graph_objects as go

# 创建3D散点图
fig = go.Figure(go.Scatter3d(
    x=[1, 2, 3, 4],
    y=[10, 11, 12, 13],
    z=[100, 200, 300, 400],
    mode='markers',
    marker=dict(size=12, color='red')
))

# 设置图表标题和轴标签
fig.update_layout(
    title='3D 散点图示例',
    scene=dict(
        xaxis_title='X 轴',
        yaxis_title='Y 轴',
        zaxis_title='Z 轴'
    )
)

# 展示图表
fig.show()

解释

  • go.Scatter3d():用于创建 3D 散点图。
  • x, y, z:分别代表 3D 散点图的三个坐标轴的数据。
  • mode='markers':表示绘制点标记。
  • scene:用于设置 3D 散点图的坐标轴标签。

输出图像

3.2 Plotly Express

Plotly Express 是 Plotly 提供的一个高层 API,旨在简化图表的创建过程。它适用于常见的图表类型,用户只需几行代码即可绘制出复杂的图表。

  1. 快速柱状图
    柱状图适合展示不同类别之间的数值比较,以下是一个简单的柱状图示例:
python 复制代码
import plotly.graph_objs as go
import plotly.express as px

# 使用 Plotly 提供的 Gapminder 数据集
df = px.data.gapminder()

# 创建柱状图
data = [go.Bar(
    x=df[df['continent'] == 'Asia']['country'],
    y=df[df['continent'] == 'Asia']['pop']
)]

layout = go.Layout(
    title="Population of Asian Countries",
    xaxis=dict(title="Country"),
    yaxis=dict(title="Population")
)

fig = go.Figure(data=data, layout=layout)
fig.show()

解释

  • go.Bar():使用 go.Bar() 创建柱状图。
  • xaxisyaxis:设置坐标轴标题。
  • go.Layout():调整图表的布局和外观。

输出图像

  1. 快速折线图
python 复制代码
import plotly.express as px

# 使用 Plotly 提供的内置数据集
df = px.data.iris()

# 使用 Plotly Express 创建一个折线图
df = px.data.gapminder()  # 从 Plotly 提供的示例数据中获取数据
fig = px.line(df, x="year", y="gdpPercap", color="continent", line_group="country", title="GDP per Capita over Time")
fig.show()
  • px.line():用于创建折线图。这里的数据来源是 gapminder 数据集。
  • color="continent":根据不同的大陆设置不同的颜色。

输出图像

  1. 快速散点图
python 复制代码
import plotly.express as px

# 使用 Plotly 提供的内置数据集
df = px.data.iris()

# 使用 Plotly Express 创建一个散点图
fig = px.scatter(df, x="gdpPercap", y="lifeExp", color="continent", size="pop", hover_name="country", log_x=True, title="GDP vs Life Expectancy")
fig.show()
  • px.scatter():用于创建散点图,展示国家的 GDP寿命 之间的关系。
  • log_x=True:将 x 轴的标度设置为对数尺度。

输出图像

3.3 Plotly Subplots

plotly.subplots 可以将多个图表组织在一个布局中。它非常适合展示多维数据,并允许用户在同一界面上展示多个相关的图表。

示例:创建多子图

python 复制代码
from plotly.subplots import make_subplots
import plotly.graph_objs as go

# 创建一个 2x2 的子图布局
fig = make_subplots(rows=2, cols=2, subplot_titles=("Scatter Plot", "Bar Chart"))

# 添加子图数据
fig.add_trace(go.Scatter(x=[1, 2, 3, 4],

# 添加第一个子图(左上)
fig.add_trace(go.Scatter(x=[1, 2, 3, 4], y=[10, 11, 12, 13], mode='lines+markers'), row=1, col=1)

# 添加第二个子图(右上)
fig.add_trace(go.Bar(x=["A", "B", "C", "D"], y=[10, 20, 30, 40]), row=1, col=2)

# 添加第三个子图(左下)
fig.add_trace(go.Pie(labels=["A", "B", "C", "D"], values=[10, 20, 30, 40]), row=2, col=1)

# 添加第四个子图(右下)
fig.add_trace(go.Scatter3d(x=[1, 2, 3, 4], y=[10, 11, 12, 13], z=[100, 200, 300, 400], mode='markers'), row=2, col=2)

fig.update_layout(
	title_text="Multiple Subplots Example",
	title="多个子图示例",
    height=600,  # 设置图表高度
    showlegend=False  # 隐藏图例)
fig.show()

解释

  • make_subplots(rows=1, cols=2):用于创建多个子图,可以设置行数(rows)和列数(cols)以及每个子图的位置。
  • fig.add_trace():向指定的子图中添加数据。
  • rowcol:参数指定了每个 trace(数据系列)所在的子图位置。

输出图像

四、Plotly 图表类型

Plotly 支持多种图表类型,每种类型都有其独特的使用场景。以下是常见的图表类型及其适用场景:

图表类型 适用场景 示例代码
散点图 (Scatter) 显示变量之间的关系 go.Scatter()
折线图 (Line) 时间序列数据的趋势展示 go.Scatter(mode='lines')
柱状图 (Bar) 显示类别数据的分布 go.Bar()
饼图 (Pie) 显示组成部分的比例 go.Pie()
热图 (Heatmap) 显示数据的密度分布 go.Heatmap()
箱线图 (Box) 显示数据的分布和离群值 go.Box()
3D 散点图 (3D Scatter) 显示三维数据的关系 go.Scatter3d()

五、Plotly 图表自定义与美化

Plotly 提供了强大的自定义功能,允许用户定制图表的布局、样式、颜色、坐标轴等。以下是一些常见的自定义功能:

5.1 自定义图表标题和坐标轴

使用 update_layout() 方法可以修改图表的标题、坐标轴标签等:

python 复制代码
fig.update_layout(
    title="Customized Plot",  # 图表标题
    xaxis_title="X Axis Label",  # X 轴标题
    yaxis_title="Y Axis Label"  # Y 轴标题
)

改变坐标轴样式

python 复制代码
fig.update_layout(
    xaxis=dict(title='自定义 X 轴', tickangle=45),  # 自定义 X 轴标题和标签角度
    yaxis=dict(title='自定义 Y 轴', gridcolor='lightgray')  # 自定义 Y 轴标题和网格线颜色
)
  • title:自定义坐标轴标题。
  • tickangle:调整坐标轴标签的角度。
  • gridcolor:设置网格线的颜色。

修改颜色和样式

可以通过 update_traces() 方法修改数据点的颜色、大小和边框样式:

python 复制代码
fig.update_traces(marker=dict(color='blue', size=10, line=dict(width=2, color='DarkSlateGrey')))
  • marker:定制数据点的颜色、大小等样式。
  • line:控制数据点边框的样式。

5.2 自定义颜色和样式

使用 update_traces() 方法进一步设置图表的颜色、标记样式等:

python 复制代码
fig.update_traces(marker=dict(color='rgb(255, 0, 0)', size=12, line=dict(width=2, color='DarkSlateGrey')))

修改图例

python 复制代码
fig.update_layout(
    showlegend=True,  # 显示图例
    legend=dict(x=0.5, y=1.15, orientation='h')  # 定制图例位置和方向
)
  • showlegend:控制是否显示图例。
  • legend:定制图例的位置 (xy) 和方向 (orientation),例如 h 表示水平排列。

5.3 添加注释和文本

python 复制代码
fig.add_annotation(
    x=2, y=10,
    text="这是一个注释",  # 注释文本
    showarrow=True,  # 显示箭头
    arrowhead=7,  # 设置箭头的样式
    ax=0, ay=-40  # 设置箭头起始位置
)
  • add_annotation():在图表中添加注释或文本,并可定制箭头样式。

5.4 图表背景和网格线

python 复制代码
fig.update_layout(
    plot_bgcolor='lightyellow',  # 设置图表背景颜色
    paper_bgcolor='lightgray',   # 设置纸张背景颜色
    xaxis=dict(showgrid=True, gridcolor='lightblue')  # 设置 X 轴网格线颜色
)
  • plot_bgcolor:设置图表的背景颜色。
  • paper_bgcolor:设置图表的纸张背景颜色。
  • showgrid:控制是否显示网格线,gridcolor 设置网格线的颜色。

通过这些自定义功能,你可以精确控制 Plotly 图表的外观,使其符合特定的设计要求,从而创建更加专业和美观的可视化。

六、Plotly 与 Dash 集成

Dash 是由 Plotly 官方开发的 Web 框架,允许用户通过 Python 创建交互式数据仪表盘,无需深入了解 JavaScript。基于 Flask 和 React.js,Dash 能无缝集成 Plotly 图表,支持快速开发动态 Web 应用。它不仅适用于静态图表展示,还能与 Plotly 配合,打造完整的 Web 数据应用,简化了开发流程,免去对 HTML 和 JavaScript 的依赖。

Dash 示例:创建一个简单的交互式图表

python 复制代码
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.express as px

# 初始化 Dash 应用
app = dash.Dash()

# 使用 Plotly 提供的内置数据集
df = px.data.iris()

# 设置应用的布局
app.layout = html.Div([
    html.H1("Iris Dataset Visualization"),
    dcc.Graph(
        id='scatter-plot',
        figure=px.scatter(df, x="sepal_width", y="sepal_length", color="species")
    )
])

# 运行 Dash 应用
if __name__ == '__main__':
    app.run_server(debug=True)

运行此代码后,会在浏览器中启动一个本地 Web 服务器,并显示一个交互式的可视化图表,展示 Iris 数据集的散点图。这里创建了一个简单的 Dash 应用,将一个交互式的散点图嵌入其中。图表会根据 Iris 数据集的 sepal_widthsepal_length 两个变量来展示不同鸢尾花品种的分布。

解释

  • html.Div() 是用来创建 HTML 元素的容器,dcc.Graph() 用于显示 Plotly 图表。
  • dash.Dash() 用于创建一个 Dash 应用实例。
  • dcc.Graph(figure=fig) 用于将 Plotly 图表嵌入到 Dash 应用中。
  • html.Div() 用于组织布局的容器。

输出图像

通过 Dash,你可以轻松地将 Plotly 图表集成到交互式 Web 应用中,支持与用户的交互。

七、高级功能与技巧

7.1 动态更新图表

Plotly 允许图表动态更新,可以在 Web 应用中实时更新图表数据。例如,基于用户输入或定时更新图表内容。下面是一个简单的例子,展示如何根据按钮点击动态更新图表。

python 复制代码
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import numpy as np

app = dash.Dash()

# 初始数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 布局设置
app.layout = html.Div([
    html.Button("Update Graph", id="update-button", n_clicks=0),
    dcc.Graph(id="live-graph"),
])

# 动态更新图表
@app.callback(
    Output("live-graph", "figure"),
    Input("update-button", "n_clicks")
)
def update_graph(n_clicks):
    if n_clicks % 2 == 0:
        y = np.sin(x)
    else:
        y = np.cos(x)
        
    return {
        'data': [go.Scatter(x=x, y=y, mode='lines')],
        'layout': go.Layout(title="Sine and Cosine Waves")
    }

if __name__ == '__main__':
    app.run_server(debug=True)

解释

  • @app.callback() 是 Dash 的回调函数,用于根据组件的输入动态更新图表的输出。在此示例中,点击按钮后图表会在正弦波和余弦波之间切换。

输出图像

7.2 数据筛选和交互

Plotly 也允许图表与用户的交互进行深度集成,比如根据用户选择的范围动态筛选数据。

例如,可以为图表添加一个滑块,允许用户选择某个数据的范围,并更新图表内容。

python 复制代码
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.express as px

app = dash.Dash()

# 加载数据
df = px.data.gapminder()

# 布局设置
app.layout = html.Div([
    html.H1("Gapminder Data"),
    dcc.Graph(id='graph'),
    dcc.Slider(
        id='year-slider',
        min=df['year'].min(),
        max=df['year'].max(),
        step=5,
        marks={year: str(year) for year in range(1950, 2021, 5)},
        value=df['year'].max()
    )
])

# 回调更新图表
@app.callback(
    Output('graph', 'figure'),
    Input('year-slider', 'value')
)
def update_graph(selected_year):
    filtered_df = df[df['year'] == selected_year]
    fig = px.scatter(filtered_df, x="gdpPercap", y="lifeExp", color="continent", size="pop", 
                     hover_name="country", log_x=True, size_max=60, title=f"Year {selected_year}")
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

解释

  • 使用 dcc.Slider() 创建了一个滑块组件,用户可以选择不同的年份。
  • @app.callback() 函数根据用户选择的年份筛选 gapminder 数据,并重新生成图表。

输出图像

7.3 图表导出与分享

Plotly 允许将图表导出为各种高质量的图片或矢量格式(如 PNG、SVG)并在网页中分享。以下是几种常见的导出方法:

  1. 导出为静态图像
python 复制代码
fig.write_image("fig1.png")  # 导出为 PNG 格式
fig.write_image("fig1.svg")  # 导出为 SVG 格式
  1. 导出为 HTML 文件
python 复制代码
fig.write_html("fig1.html")  # 导出为 HTML 文件,可以嵌入网页中
  1. 直接分享在线图表

Plotly 允许将图表上传到 Plotly 服务器上,以便生成共享链接。你需要在 Plotly 上注册账户,然后使用 plotly.plot 上传图表:

python 复制代码
import plotly.plotly as py
py.plot(fig, filename="my-plot")

这样,你将获得一个共享链接,可以直接在浏览器中查看。

总结

通过本文的介绍,我们深入了解了 Plotly 的使用方法、图表类型、数据交互及与 Dash 集成的高级功能。作为一个强大的绘图库,Plotly 不仅能够快速生成美观、互动的图表,还与 Dash 等库无缝集成,提供丰富的交互式可视化功能。无论是简单的统计图表、复杂的 3D 图形,还是交互式地图,Plotly 都能为数据可视化、分析报告以及 Web 应用开发提供完整的解决方案。

参考文献


相关推荐
YangYang9YangYan4 小时前
2026出纳岗位学习数据分析的价值
学习·数据挖掘·数据分析
吃好睡好便好4 小时前
在Matlab中绘制马鞍函数曲面图
开发语言·人工智能·学习·算法·matlab·信息可视化
wa的一声哭了4 小时前
Mit6.s081 Interrupts and device driver(中断和设备驱动)
linux·服务器·arm开发·数据库·python·gpt·算法
测试员周周4 小时前
【Appium 系列】第01节-Appium 是什么 — 移动端自动化的行业标准
开发语言·人工智能·python·功能测试·appium·自动化·测试用例
前端小超人rui4 小时前
Jupyter 介绍
ide·python·jupyter
码界筑梦坊4 小时前
117-基于Python的印度犯罪数据可视化分析系统
开发语言·python·mysql·信息可视化·毕业设计·echarts·fastapi
您^_^4 小时前
Python CosyVoice项目遭遇 Windows TxF WinError 6714 的深度排查与修复指南
windows·python·winerror 6714
城数派4 小时前
1958-2024年全球4km分辨率逐月土壤湿度栅格数据
数据库·arcgis·信息可视化·excel
Gerardisite4 小时前
企业微信智能客服开发实战:API自动回复指南
java·开发语言·python·机器人·企业微信
毋语天4 小时前
Claude Code 完整安装与配置指南(含 CC-Switch 多供应商切换工具)
后端·python·ai编程