import plotly.express as px
# Create a histogram
fig = px.histogram(olympic_data.age, x="age",
title="Distribution of Athletes age")
fig.show()技术支持
图 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()技术支持
# 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()技术支持
图 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)])技术支持
# 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)])技术支持
# 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)])技术支持
在教程前面我们提到,可以基于 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 dataframefor 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()技术支持
直方图是一种常见的图形展示方式,用于将数据点按指定区间归类显示。我们通常在统计学中见到它,用来展示某类变量在特定区间内出现的数量。例如,您的数学老师可能用过直方图来可视化您班级所有同学的分数分布。
图 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 允许用户创建美观、交互式的网页可视化,这些可视化可以:
Plotly 的另一个吸引力在于其丰富的图表类型。该库支持 40 多种独特图表,覆盖统计、金融、地理、科学以及三维图表等多种用例。
由于与Kaleido(一款图像导出工具)深度集成,导出 Plotly 可视化非常容易。同时,它对非 Web 场景也有广泛支持,包括桌面编辑器(如 Spyder、PyCharm 等)以及静态文档发布(如将 Jupyter 笔记本导出为 PDF)。
安装 plotly.py 十分简单;可以通过 pip 安装:
或使用 Conda:
注意:建议在虚拟环境中安装库,以便将不同项目的依赖相互隔离。您也可以直接从DataLab 工作簿开始——一款云端的 Python 与 R 数据科学 IDE。
使用 DataLab
DataLab 是一款在线集成开发环境(IDE),用户可以在其中编写代码、独立或协作分析数据,并分享数据洞见。换句话说,可以把 DataLab 看作专为数据科学打造的 Google 文档;想了解更多其工作方式,请参阅我们的文章在课堂中使用 DataLab。
在本任务中,我们需要基于数据集创建一个工作簿。幸运的是,DataCamp 提供了丰富且不断增长的有趣数据集供您分析。我们从数据集创建工作簿后,环境中会包含所有预先配置的数据,以及一段简要数据说明,便于您开箱即用。
使用 DataCamp 数据集创建工作簿的步骤如下:
图 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,它是一个易用的高级接口……
我们也可以选择使用 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 直方图的外观
目前,我们的直方图还比较朴素。让我们通过更改标题字体并添加坐标轴标签来优化一下。
添加这些元素后,直方图信息量更足了。
接下来,调整每个箱的大小。
在上述代码中,我们将
go.Histogram实例中的xbins参数设置为一个go.histogram.Xbins实例,并在其中定义所需的箱宽。同样可以使用具有兼容属性的dict对象来完成这一步。最后,将箱体颜色改为橙色,让可视化更醒目一些。
好得多了。
在上面的代码中,我们将
go.Histogram实例中的marker参数设置为一个go.histogram.Marker实例,并在其中定义了所需颜色。当然,我们还可以为 Plotly 直方图进行更多自定义,例如添加悬停文本。
启用悬停文本
在当前直方图中,当您将鼠标悬停在某个柱子上时,会显示该柱所代表内容的文本——见图 8。
图 8:当前在直方图上悬停时显示的文本。
这并不够直观。进行数据可视化时,我们希望图表尽量做到自解释——甚至包括悬停文本。因此,让我们更新悬停在箱体上时显示的信息。
现在,将鼠标悬停在箱体上显示的文本信息量更大,使可视化更易于解读。我们通过更新
go.Histogram实例中的hovertemplate参数实现了这一点。添加筛选选项
在教程前面我们提到,可以基于 age、height、weight 和 year 这些特征构建直方图。没必要为每个特征单独画一个图。
我们可以构建一个直方图,并添加筛选按钮,让您在可视化中切换显示不同特征。
代码如下所示。
就是这样;别忘了查看使用奥运数据创建 Plotly 直方图工作簿,动手体验本教程中构建的内容。
总结
您现在已经掌握了如何在 Plotly Python 中创建直方图;本教程涵盖了:
如果您希望进一步了解如何创建直方图或使用 Plotly,请查看以下链接: