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

发布于:2024-12-21 ⋅ 阅读:(13) ⋅ 点赞:(0)

引言

在数据科学、分析和机器学习领域,数据可视化是一项至关重要的技能。它不仅帮助我们快速理解数据,还能清晰地传达复杂的信息,从而提升决策效率。在众多 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 包管理工具进行安装:

pip install plotly

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

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 中,创建折线图非常简单。以下是一个基础的折线图的示例:

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. 条形图

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

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. 饼图

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

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 散点图用于展示三维数据,适用于具有多个变量的数据集:

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. 快速柱状图
    柱状图适合展示不同类别之间的数值比较,以下是一个简单的柱状图示例:
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. 快速折线图
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. 快速散点图
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 可以将多个图表组织在一个布局中。它非常适合展示多维数据,并允许用户在同一界面上展示多个相关的图表。

示例:创建多子图

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() 方法可以修改图表的标题、坐标轴标签等:

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

改变坐标轴样式

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

修改颜色和样式

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

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

5.2 自定义颜色和样式

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

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

修改图例

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

5.3 添加注释和文本

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

5.4 图表背景和网格线

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 示例:创建一个简单的交互式图表

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 应用中实时更新图表数据。例如,基于用户输入或定时更新图表内容。下面是一个简单的例子,展示如何根据按钮点击动态更新图表。

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 也允许图表与用户的交互进行深度集成,比如根据用户选择的范围动态筛选数据。

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

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. 导出为静态图像
fig.write_image("fig1.png")  # 导出为 PNG 格式
fig.write_image("fig1.svg")  # 导出为 SVG 格式
  1. 导出为 HTML 文件
fig.write_html("fig1.html")  # 导出为 HTML 文件,可以嵌入网页中
  1. 直接分享在线图表

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

import plotly.plotly as py
py.plot(fig, filename="my-plot")

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

总结

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

参考文献



网站公告

今日签到

点亮在社区的每一天
去签到