跳至主要内容

如何使用 Plotly 创建直方图

了解如何使用 Plotly 数据可视化库在 Python 中实现直方图。
· 12分钟 阅读

使用 AI 探索

直方图是一种常见的图形展示方式,用于将数据点按指定区间归类显示。我们通常在统计学中见到它,用来展示某类变量在特定区间内出现的数量。例如,您的数学老师可能用过直方图来可视化您班级所有同学的分数分布。

Histogram displaying the distribution of marks

图 1:展示某班级分数分布的直方图示例。

[来源:使用 Matplotlib 的直方图示例] 

它由高度不一的长条组成,外观与条形图相似,但直方图用于可视化定量数据,而条形图用于类别数据。

通常,直方图中可视化的数值数据是连续型的,意味着其可能取无限多的值。直接绘制连续变量的每个取值往往不切实际。直方图通过将多个数据点分组到合理的区间(称为“箱”或“bins”)来缓解这一问题,从而使其得以可视化。

本教程将介绍如何使用 Plotly 数据可视化库在 Python 中实现直方图。我们还将讨论如何以不同方式自定义 Plotly 直方图,以及数据可视化为何重要。

查看这个DataLab 工作簿,跟随本教程中的代码一起操作。

数据分析中数据可视化的重要性

没有哪家企业不从更好地理解自身数据中获益。数据分析的作用是帮助企业优化绩效并提升盈利能力;凡是存在数据的领域都离不开它,因为洞见通常意味着优势。

数据可视化是分析师用来呈现信息与数据的图形化表达。其目的在于将数据总结为易于理解的形式,向读者突出数据中的关键信息。

换言之,企业借助数据可视化快速识别数据中的趋势,否则没有图形辅助可能很难做到。图形表达让信息传达变得通用、快捷且高效。

Plotly 简介

Plotly 是一个用于 Python 和 R、由 JavaScript 编写的交互式开源数据可视化库。本文将聚焦于 Python 版本的 Plotly,有时简称为“plotly.py”,以区别于其 JavaScript 版本。

提示:参加 用 Python 入门 Plotly 数据可视化 或 用 R 进行 Plotly 交互式数据可视化 课程,快速上手 Plotly。

许多 Plotly 用户提到,他们最初就被该库所呈现的现代美学所“吸引”,而这些效果对讲述者来说实现起来十分容易。Plotly Python 允许用户创建美观、交互式的网页可视化,这些可视化可以:

  • 在 Jupyter 笔记本中显示,
  • 保存为独立的 HTML 文件,
  • 通过 Dash 作为纯 Python 构建的 Web 应用的一部分进行服务。

Plotly 的另一个吸引力在于其丰富的图表类型。该库支持 40 多种独特图表,覆盖统计、金融、地理、科学以及三维图表等多种用例。

由于与Kaleido(一款图像导出工具)深度集成,导出 Plotly 可视化非常容易。同时,它对非 Web 场景也有广泛支持,包括桌面编辑器(如 Spyder、PyCharm 等)以及静态文档发布(如将 Jupyter 笔记本导出为 PDF)。

安装 plotly.py 十分简单;可以通过 pip 安装:

pip install plotly>=5.11.0, <5.12.0

或使用 Conda:

conda install -c plotly plotly>=5.11.0, <5.12.0

注意:建议在虚拟环境中安装库,以便将不同项目的依赖相互隔离。您也可以直接从DataLab 工作簿开始——一款云端的 Python 与 R 数据科学 IDE。

使用 DataLab

DataLab 是一款在线集成开发环境(IDE),用户可以在其中编写代码、独立或协作分析数据,并分享数据洞见。换句话说,可以把 DataLab 看作专为数据科学打造的 Google 文档;想了解更多其工作方式,请参阅我们的文章在课堂中使用 DataLab。

在本任务中,我们需要基于数据集创建一个工作簿。幸运的是,DataCamp 提供了丰富且不断增长的有趣数据集供您分析。我们从数据集创建工作簿后,环境中会包含所有预先配置的数据,以及一段简要数据说明,便于您开箱即用。

使用 DataCamp 数据集创建工作簿的步骤如下:

  • 在 DataLab 应用中,从侧边栏选择“Datasets”。
  • 选择您感兴趣的数据集。此时会弹出对话框,提供所选数据集的预览,包括数据字典与数据来源链接、可选语言(Python 或 R),以及其他用户基于该数据集创建的发布内容概览。
  • 选择Create workbook。

create a DataCamp Workspace

图 2:演示从数据集创建工作簿步骤的 GIF。

注意:查看 使用奥运数据创建 Plotly 直方图,跟随代码一起操作。

我们将使用 DataCamp 内部数据集中提供的 Olympics Data。根据其说明,这是一个关于现代奥运会的历史数据集,覆盖从 1896 年雅典到 2016 年里约。每一行对应一位参加奥运项目的运动员(共 271116 条记录)以及其所获奖牌(如有)。

列包含以下内容:

Column

Explanation

id

每位运动员的唯一编号

name

运动员姓名

sex

M 或 F

age

运动员年龄

height

单位:厘米

weight

单位:千克

team

队伍名称

noc

国家(地区)奥委会 3

games

年份与赛季

year

整数

season

夏季或冬季

city

主办城市

sport

运动项目

event

具体赛事

medal

金、银、铜,或 NA

基于上述理解,我们可以期望用以下列来构建直方图:age、height、weight 和 year。因为直方图是用连续的数值型数据构建的——它用来表示数值数据的分布,将数据分箱后展示每个箱的计数。

我们将使用 age 列来创建直方图。

创建 Plotly 直方图

使用 Plotly 在 Python 中创建直方图非常简单;我们可以使用Plotly Express,它是一个易用的高级接口……

import plotly.express as px

# Create a histogram
fig = px.histogram(olympic_data.age, x="age",
                  title="Distribution of Athletes age")
fig.show()

Histogram created using Plotly Express图 3:使用 Plotly Express 创建的直方图

我们也可以选择使用 Graph Objects。

import plotly.graph_objects as go

fig = go.Figure(data=[go.Histogram(x=olympic_data.age)])

# add the title
fig.update_layout(title=dict(text="Distribution of Athletes age"))
fig.show()

histogram created using Plotly Graph Objects图 4:使用 Plotly Graph Objects 创建的直方图。

Plotly 的 express 函数在内部会调用 graph_objects 并返回一个值。因此,Plotly Express 非常有用,因为它能让用户通过更少的代码行绘制出原本使用 graph_objects 需要更多代码才能完成的可视化。

“plotly.express 模块(通常以 px 导入)包含可一次性创建完整图形的函数,被称为 Plotly Express 或 PX。Plotly Express 是 Plotly 库的内置部分,也是创建大多数常见图形的推荐起点。每个 Plotly Express 函数都在内部使用 graph objects,并返回一个 plotly.graph_objects.Figure 实例。”

来源:Plotly Express in Python。

尽管建议以 Plotly express 作为入门方式,但为了获得更高的灵活性,我们将使用 graph_objects 来自定义直方图的外观。

自定义 Plotly 直方图的外观

目前,我们的直方图还比较朴素。让我们通过更改标题字体并添加坐标轴标签来优化一下。

# Create histogram
fig = go.Figure(data=[go.Histogram(x=olympic_data.age)])

fig.update_layout(
    # Set the global font
    font = {
        "family":"Times new Roman",
        "size":16
    },
    # Update title font
    title = {
        "text": "Distribution of Athletes age",
        "y": 0.9, # Sets the y position with respect to `yref`
        "x": 0.5, # Sets the x position of title with respect to `xref`
        "xanchor":"center", # Sets the title's horizontal alignment with respect to its x position
        "yanchor": "top", # Sets the title's vertical alignment with respect to its y position. "      
        "font": { # Only configures font for title
            "family":"Arial",
            "size":20,
            "color": "red"
        }
    }
)

# Add X and Y labels
fig.update_xaxes(title_text="Age")
fig.update_yaxes(title_text="Number of Athletes")

# Display plot
fig.show()

Plotly histogram with an updated title图 5:更新了标题并添加坐标轴标签的 Plotly 直方图。

添加这些元素后,直方图信息量更足了。

接下来,调整每个箱的大小。

# Create histogram
fig = go.Figure(data = [
    go.Histogram(
        x = olympic_data.age,
        xbins=go.histogram.XBins(size=5) # Change the bin size to 5
    )
  ]
)

Plotly histogram with bin size equal to 5图 6:箱宽为 5 的 Plotly 直方图。

在上述代码中,我们将 go.Histogram 实例中的 xbins 参数设置为一个 go.histogram.Xbins 实例,并在其中定义所需的箱宽。同样可以使用具有兼容属性的 dict 对象来完成这一步。

最后,将箱体颜色改为橙色,让可视化更醒目一些。

# Create histogram
fig = go.Figure(data = [
    go.Histogram(
        x = olympic_data.age,
        xbins=go.histogram.XBins(size=5), # Change the bin size
        marker=go.histogram.Marker(color="orange") # Change the color
    )
  ]
)

Plotly histogram with orange bins图 7:橙色箱体的 Plotly 直方图。

好得多了。

在上面的代码中,我们将 go.Histogram 实例中的 marker 参数设置为一个 go.histogram.Marker 实例,并在其中定义了所需颜色。

当然,我们还可以为 Plotly 直方图进行更多自定义,例如添加悬停文本。

启用悬停文本

在当前直方图中,当您将鼠标悬停在某个柱子上时,会显示该柱所代表内容的文本——见图 8。

current hover text

图 8:当前在直方图上悬停时显示的文本。

这并不够直观。进行数据可视化时,我们希望图表尽量做到自解释——甚至包括悬停文本。因此,让我们更新悬停在箱体上时显示的信息。

# Create histogram
fig = go.Figure(data = [
    go.Histogram(
        x = olympic_data.age,
        xbins=go.histogram.XBins(size=5), # Change the bin size
        marker=go.histogram.Marker(color="orange"), # Change the color
        hovertemplate="<br>".join([
            "Age Range: %{x}",
            "Number of Athletes: %{y}"]) # Make hover text more informative
    )
  ]
)

updated hover text图 9:更新后的悬停文本信息。

现在,将鼠标悬停在箱体上显示的文本信息量更大,使可视化更易于解读。我们通过更新 go.Histogram 实例中的 hovertemplate 参数实现了这一点。

添加筛选选项

在教程前面我们提到,可以基于 age、height、weight 和 year 这些特征构建直方图。没必要为每个特征单独画一个图。

我们可以构建一个直方图,并添加筛选按钮,让您在可视化中切换显示不同特征。

代码如下所示。

"""
Starter code provided by vestland on StackOverflow
Link: https://bit.ly/3ipqOMo
"""
# continuous features
continuous_vars = ["age", "height", "weight", "year"]

# plotly
fig = go.Figure()

# set up ONE trace
fig.add_trace(
    go.Histogram(x = olympic_data.age,
                xbins=go.histogram.XBins(size=5), # Change the bin size
                marker=go.histogram.Marker(color="orange"), # Change the color
            )
)

buttons = []

# button with one option for each dataframe
for col in continuous_vars:
    buttons.append(dict(method='restyle',
                        label=col,
                        visible=True,
                        args=[{"x":[olympic_data[col]],
                              "type":'histogram', [0]],
                        )
                  )

# some adjustments to the updatemenus
updatemenu = []
your_menu = dict()
updatemenu.append(your_menu)

updatemenu[0]['buttons'] = buttons
updatemenu[0]['direction'] = 'down'
updatemenu[0]['showactive'] = True

# add dropdown menus to the figure
fig.update_layout(showlegend=False, updatemenus=updatemenu)
fig.show()

histogram with filters applied图 10:带有筛选功能的直方图,用户可在一张可视化中切换不同特征。

就是这样;别忘了查看使用奥运数据创建 Plotly 直方图工作簿,动手体验本教程中构建的内容。

总结

您现在已经掌握了如何在 Plotly Python 中创建直方图;本教程涵盖了:

  • 直方图是什么以及其工作原理
  • 数据分析中数据可视化的重要性
  • 如何开始使用 DataLab
  • 如何在 Plotly 中创建直方图
  • 自定义直方图的不同方式
  • 如何应用筛选

如果您希望进一步了解如何创建直方图或使用 Plotly,请查看以下链接:

主题