Python Dash 小白教程:手把手教你做 IMDB 数据仪表盘
基于Python语言Dash库的IMDB数据分析及可视化互动数据样板教程
1. 背景介绍
Dash是一款用于构建Web应用的Python低代码框架。它建立在Plotly.js、React和Flask之上,可以将现代UI元素(如下拉框、滑块、图形等)直接与Python代码绑定,轻松实现数据的动态展示。通过Dash,用户可以快速创建出具备交互功能的可视化应用。
Dash的代码是声明式和反应式的,能够灵活地构建包含各种交互元素的复杂应用。丰富的Dash组件库允许制作多种类型的图表,包括统计图表、地图、三维动画等,并将它们集成到统一的Dashboard中。此外,Dash还可以应用于自然语言处理、对象检测和预测分析等AI领域,功能远超传统BI工具。
2. Dash常用组件介绍
在Dash中,组件是构建仪表盘的基本单元。Dash提供了许多基础UI组件和核心组件,帮助我们快速创建交互式Web应用。在接下来的教程中,我们将用到其中的一些常用组件。以下是部分常用组件的简单介绍:
2.1 基础UI组件(Dash HTML Components)
• html.Div:容器组件,用于包含和组织其他组件,类似HTML中的<div>标签。
• html.H1 – html.H6:标题标签,从一级标题到六级标题,用于显示不同级别的标题。
• html.P:段落组件,用于显示文本内容。
• html.Img:图片组件,可以在应用中展示图像。
• html.A:超链接组件,用于创建链接。
• html.Button:按钮组件,可用于交互,如提交数据或触发回调。
• html.Label:标签组件,常用于标注其他表单元素(如输入框或选择框)。
2.2 核心组件(Dash Core Components)
• dcc.Graph:图表组件,支持Plotly的多种图表类型,如折线图、散点图、柱状图、饼图等,是数据可视化的主要组件。
• dcc.Dropdown:下拉选择框,支持单选或多选,常用于数据筛选。
• dcc.Input:输入框组件,允许用户输入文本或数值。
• dcc.Slider:滑块组件,用于选择一个范围内的数值,适合范围数据选择。
• dcc.RangeSlider:范围滑块组件,可以选择一个连续区间(如评分的起始和结束值)。
• dcc.Checklist:复选框列表,允许用户进行多选操作。
• dcc.RadioItems:单选按钮组,用于在多个选项中进行单选。
• dcc.Tabs 和 dcc.Tab:选项卡组件,可在页面中切换不同内容视图。
• dcc.DatePickerSingle 和 dcc.DatePickerRange:日期选择器,分别用于选择单个日期或日期范围。
• dcc.Upload:文件上传组件,允许用户上传文件,适用于数据输入或更新。
以上是部分Dash中常用的组件,后续我们将在教程中使用其中一些组件来搭建一个简单的IMDB电影数据仪表盘。
3. 数据介绍
在本教程中,我们将使用一个IMDB电影数据集,数据集包含关于电影的多种信息,如电影类型、评分、收入等。通过分析这些数据,我们将创建动态的可视化展示,帮助用户更好地理解电影数据的特点。
• 数据来源:IMDB Movie Dataset
4. 环境说明
• Python版本:3.12.4
• IDE:Jupyter Notebook
5. 正式教程
接下来,我们将正式进入保姆级教程!!!
5.1 安装DASH
在正式开始创建仪表盘之前,我们需要安装Dash库。Dash库依赖于dash、plotly和pandas等包,通过以下简单的步骤,你可以完成安装。
# pip 是 Python 的包管理工具,类似于应用商店,用来安装和管理 Python 包(库)
# 通过 pip,我们可以从 Python 的官方包仓库(PyPI)中下载和安装各种 Python 包
# install 是 pip 的一个命令,用于安装后面指定的 Python 包
# 当我们输入 pip install 时,pip 会自动查找并安装指定的包
# dash 是我们要安装的具体包的名字
# 我们在这一步安装 Dash 后,就可以在 Python 项目中使用它
!pip install dash
安装 Dash(使用国内镜像源)
如果你在安装过程中遇到网络连接问题,可以使用国内的镜像源来加速下载。以下是通过百度镜像源安装Dash的命令:
# 使用百度镜像源安装 Dash
!pip install dash -i https://mirror.baidu.com/pypi/simple
Hello Dash
在正式开始之前,我们可以先运行一个简单的“Hello Dash”程序,来确认Dash已经正确安装,并能在你的电脑上正常运行,输入以下代码并运行:
# 从 Dash 库中导入 Dash 和 html 模块
# Dash 是一个用于构建 web 应用的 Python 框架,适合构建交互式数据可视化网页应用
# html 模块包含了可以生成 HTML 元素的类,比如 <div>、<h1>、<p> 等
from dash import Dash, html
# 创建一个 Dash 应用的实例,并命名为 app
# 这个实例是我们整个应用的核心,所有的页面布局和交互逻辑都会依赖于这个实例
app = Dash()
# 定义应用的页面布局(layout),它指定了页面的内容和结构
# layout 是应用的主要内容部分,用于描述用户将看到的页面布局
app.layout = [
# 使用 html.Div 创建一个 HTML 的 <div> 容器
# <div> 是一种通用的 HTML 容器元素,用来包裹其他元素或文本
# children 参数指定 <div> 中的内容,这里放置的是一个简单的字符串 'Hello Dash'
# 这样浏览器加载页面时,会在网页上显示 "Hello Dash"
html.Div(children='Hello Dash')
]
# 这段代码用于启动应用的服务器,监听本地的请求并在浏览器中显示页面
# 当我们直接运行这个 Python 脚本时,这段代码会被执行
if __name__ == '__main__':
# 启动应用的服务器,debug=True 表示开启调试模式
# debug=True 的作用是帮助我们快速发现错误
# 在调试模式下,如果代码有问题,浏览器会显示错误信息,便于我们找到错误原因
app.run(debug=True)
在 Jupyter Notebook 中:如果你在Jupyter Notebook中运行这段代码,应用会直接嵌入在Notebook中显示,无需打开浏览器新窗口。
在其他编辑器中(如VS Code、PyCharm):运行后,会在控制台输出一个网址,点击后即可查看。
出现以上画面则表明dash安装成功!
5.2 安装 pandas 库
pandas 是 Python 的一个数据分析库,专门用于处理表格和结构化数据。它能帮助我们轻松地读取、清洗和操作数据。
在 pandas 中,主要使用两种数据结构:
• DataFrame:用于存储表格数据,类似于电子表格或数据库表。
• Series:用于存储一列数据。
pandas 可以从多种数据源(如 CSV 文件、Excel 表)加载数据,并支持各种数据操作,如筛选、分组和统计分析。在本教程中,我们将使用 pandas 读取和处理 IMDB 数据,为后续的可视化分析做准备
如果还没有安装pandas库,可以使用以下命令进行安装:
!pip install pandas
5.3 读取数据
首先,我们需要从Kaggle下载IMDB数据集。可以在Kaggle网站上搜索并下载IMDB电影数据集,Kaggle是一个数据科学平台,提供了大量公开数据集供大家使用。数据集下载页面可以在Kaggle网站上找到。
Find Open Datasets and Machine Learning Projects | Kaggle
下载数据后,我们将使用pandas库读取数据并进行一些初步的数据处理。
# 导入 dash 库,这是我们之前安装的一个 Python 库
# 每次在代码中使用 dash 库之前,必须通过 import 语句导入它
# 通过导入,Python 才能识别并使用 dash 提供的各种功能和模块
import dash
# 导入 pandas 库并命名为 pd
import pandas as pd
# 使用 pandas 的 read_csv 函数读取名为 'imdb_movie_dataset.csv' 的 CSV 文件,并将其加载为 DataFrame
# DataFrame 是一种二维数据结构,可以理解为带有行列标签的表格,非常适合处理和分析结构化数据
df = pd.read_csv('imdb_movie_dataset.csv')
# 删除 DataFrame 中的 'Rank' 列
# drop 方法用于删除指定的行或列,'Rank' 是我们要删除的列名
# axis=1 表示删除的是列而非行,inplace=True 表示直接在原 DataFrame 上进行修改
df.drop('Rank', axis=1, inplace=True)
# 删除 DataFrame 中的 'Metascore' 列
# 这里的操作与上一步相同,删除的是 'Metascore' 列
df.drop('Metascore', axis=1, inplace=True)
# 将 'Revenue (Millions)' 列的数据类型转换为数值类型
# 通过 pd.to_numeric 函数,将列 'Revenue (Millions)' 中的字符串转换为数值
# errors='coerce' 表示如果遇到无法转换为数值的数据,将其设置为 NaN(空值),这有助于处理缺失或无效数据
df['Revenue (Millions)'] = pd.to_numeric(df['Revenue (Millions)'], errors='coerce')
5.4 绘图
接下来,我们将尝试绘制一个简单的图表,展示每一年发布的电影数量变化趋势。这可以帮助我们了解不同时期电影产出的变化情况。
统计每年的电影数量
首先,我们需要统计每一年的电影数量,并将统计结果按年份升序排列。
# 将 'Year' 列的数据类型转换为整数类型(int)
# 这里的目的是确保 'Year' 列中的年份数据是整数格式,便于后续的排序和分组操作
df['Year'] = df['Year'].astype(int)
# 使用 value_counts() 函数统计每一年的电影数量
# value_counts() 会计算 'Year' 列中每个年份出现的次数,得到每一年的电影数量
# sort_index() 函数对统计结果按年份顺序进行排序
# 结果是一个按年份排序的 Series,其中索引是年份,值是该年上映的电影数量
year_counts = df['Year'].value_counts().sort_index()
安装并使用 matplotlib 绘制折线图
matplotlib 是一个强大的数据可视化库,提供了丰富的图表类型(如折线图、柱状图、散点图等),并允许用户对图表进行高度自定义。它的绘图风格灵活,非常适合需要细节控制的场合。
在本教程中,我们将使用 matplotlib 绘制各年电影数量的折线图,并在折线上标注每年的数据点,以便更直观地查看具体的数值。
安装 matplotlib, 用咱之前介绍的相同方法安装
!pip install matplotlib
然后,用matplotlib绘制折线图,同时把数据标注在折线上
# 导入 matplotlib 库中的 pyplot 模块,并将其命名为 plt
# matplotlib 是一个用于数据可视化的 Python 库,而 pyplot 是其中一个模块,提供了很多绘图函数
import matplotlib.pyplot as plt
# 使用 plt.plot() 函数绘制折线图
# year_counts.index 是 x 轴的年份,year_counts.values 是 y 轴每年电影的数量
plt.plot(year_counts.index, year_counts.values)
# 设置 x 轴标签为 'Year',表示年份
plt.xlabel('Year')
# 设置 y 轴标签为 'Number of Movies',表示电影数量
plt.ylabel('Number of Movies')
# 设置图表标题为 'Yearly Variation in Number of Movies',帮助理解图表的主题
plt.title('Yearly Variation in Number of Movies')
# 使用 for 循环遍历 year_counts.index 和 year_counts.values,将每个点的 y 值标注在图上
# zip 函数将两个列表(年份和电影数量)合并在一起,便于同时遍历
for x, y in zip(year_counts.index, year_counts.values):
# 使用 plt.text() 在折线图上的每个数据点处添加文本
# x 和 y 分别是当前数据点的 x 和 y 坐标,str(y) 是显示的文本内容,即电影数量
# ha='center' 表示文本水平居中,va='bottom' 表示文本在数据点上方
plt.text(x, y, str(y), ha='center', va='bottom')
# 显示图表
plt.show()
运行代码,我们可以得到如下图像:
但如何将图像放置到页面,使用户可以通过网页查看生成的图像呢?
这时,我们就要用到今天的主角——Dash!
在前面,我们已经尝试过在Dash页面布局中添加文字。这次,我们将把绘制的折线图添加到Dash应用中,供用户查看。具体步骤如下:
# 安装 dash-bootstrap-components 库
# dash-bootstrap-components 是一个为 Dash 框架提供 Bootstrap 组件的库
# 这些组件帮助我们更方便地创建美观且响应式的 Dash 应用界面
!pip install dash-bootstrap-components
首先,我们使用 plotly.express 库绘制一个折线图,将数据和标题设置为“每年电影数量变化趋势”:
# 导入 plotly.express 库,并将其重命名为 px
# plotly.express 是 Plotly 中一个简化绘图库,用于快速创建交互式图表,比如折线图、条形图等
import plotly.express as px
# 导入 dash-bootstrap-components 库,并重命名为 dbc
# 这个库提供了基于 Bootstrap 的组件,可以帮助我们快速创建布局和响应式界面
import dash_bootstrap_components as dbc
# 从 dash 库导入 dcc 和 html 模块
# dcc 模块包含 Dash Core Components,提供图表、滑块等组件
# html 模块包含 HTML 元素,用于构建页面布局,比如标题、段落等
from dash import dcc, html
# 使用 plotly.express 绘制折线图
# year_counts 是一个包含每年电影数量的数据,title 参数用于设置图表标题
# fig 是绘制的图表对象,后面会在 Dash 应用中展示
fig = px.line(year_counts, title='Trend of Movie Counts by Year')
接下来,我们创建一个 Dash 应用实例:
# 创建一个 Dash 应用的实例,命名为 app
# 这个实例是整个应用的核心,管理应用的布局和交互逻辑
app = dash.Dash()
设置页面布局,大标题H1为每年电影数量变化趋势,然后用dash_core_components去创建一个组件Graph,将先前画好的图传入:
# 定义应用的布局,使用 Bootstrap 组件创建响应式布局
# dbc.Container 创建一个容器,用于包含页面内容
app.layout = dbc.Container([
# 添加一个一级标题(<h1>)显示在页面顶部
html.H1("Trend of Movie Counts by Year"),
# 使用 dcc.Graph 组件在页面中展示图表
# figure 参数指定显示的图表对象,这里是我们创建的 fig 折线图
dcc.Graph(figure=fig)
])
最后,运行 Dash 应用。
# 只有在直接运行此脚本时才启动应用服务器
# 如果此文件被导入到其他文件中,服务器不会启动
if __name__ == '__main__':
# 启动应用的服务器,debug=True 表示开启调试模式
# 在调试模式下,如果代码有错误,浏览器会显示详细的错误信息
app.run_server(debug=True)
PS:如果标题是中文,可能会出现编码错误,导致中文显示为白色方框或乱码。为避免此类问题,我们可以在代码开头添加以下两行代码,以确保中文能够正确显示:
import matplotlib.pyplot as plt
# 设置字体为 SimHei,用于支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False
5.5 第一个仪表盘的制作
接下来,我们将尝试制作一个简单的仪表盘,展示“前十名作品最多的导演”。通过这个仪表盘,我们可以直观地看到哪些导演的作品数量最多。
首先,我们需要统计数据集中每位导演的作品数量。然后,将统计结果按降序排列,取出前十名,作为我们绘图所需的数据。
# 统计 DataFrame 中 'Director' 列中每个导演的出现次数
# value_counts() 函数会计算 'Director' 列中每个导演的出现次数,得到每个导演执导的电影数量
# sort_values(ascending=False) 按照电影数量降序排列,便于找到最受欢迎的导演
director_counts = df['Director'].value_counts().sort_values(ascending=False)
# 获取电影数量最多的前 10 位导演
# head(10) 函数返回排序后的前 10 个值,即电影数量最多的前 10 位导演
top10_directors = director_counts.head(10)
接着进行图表的绘制:
# 使用 plotly.express 绘制柱状图,以展示前 10 位导演的电影数量
# top10_directors 是包含前 10 位导演及其电影数量的 Series
# title 参数用于设置图表的标题
fig1 = px.bar(top10_directors, title='Movie Counts of the Top 10 Directors')
# 使用 plotly.express 绘制饼图,以展示前 10 位导演的电影数量
# names 参数指定图表的标签(这里是导演的名字),对应 top10_directors 的索引
# values 参数指定图表的值(这里是电影数量),对应 top10_directors 的值
# title 参数设置图表的标题
fig2 = px.pie(top10_directors, names=top10_directors.index, values=top10_directors.values, title='Movie Counts of the Top 10 Directors')
# 使用 plotly.express 绘制折线图,以展示前 10 位导演的电影数量
# top10_directors 是包含前 10 位导演及其电影数量的 Series
# title 参数用于设置图表的标题
fig3 = px.line(top10_directors, title='Movie Counts of the Top 10 Directors')
随后,创建 Dash 应用,并将三张图表添加进页面:
# 创建一个 Dash 应用的实例,并命名为 app
# 这个实例是整个应用的核心,管理应用的布局和交互逻辑
app = dash.Dash()
# 定义应用的布局,使用 Bootstrap 容器布局以保持响应式和美观
# dbc.Container 创建一个容器,用于包含页面内容
app.layout = dbc.Container([
# 添加一个一级标题(<h1>),显示在页面顶部,表明图表的主题
html.H1("Movie Counts of the Top 10 Directors"),
# 使用 dcc.Graph 组件在页面中展示柱状图
# figure 参数指定显示的图表对象,这里是 fig1 柱状图
dcc.Graph(figure=fig1),
# 使用 dcc.Graph 组件在页面中展示饼图
# figure 参数指定显示的图表对象,这里是 fig2 饼图
dcc.Graph(figure=fig2),
# 使用 dcc.Graph 组件在页面中展示折线图
# figure 参数指定显示的图表对象,这里是 fig3 折线图
dcc.Graph(figure=fig3)
])
最后,运行应用,并查看结果。
# 检查当前脚本是否是作为主程序运行
# 当 Python 解释器运行一个脚本时,它会设置一个特殊变量 __name__,表示脚本的名称
# 如果当前脚本是被直接运行的(而不是被导入到其他脚本中),__name__ 的值将是 '__main__'
if __name__ == '__main__':
# 启动 Dash 应用的服务器
# app.run_server() 启动一个本地服务器,使应用可以在浏览器中访问
# debug=True 表示开启调试模式。在调试模式下,如果代码出错,浏览器会显示详细的错误信息,帮助开发者快速定位问题
app.run_server(debug=True)
经过上述步骤,我们完成了一个简单的基础仪表盘,效果如下所示:
至此,我们已经成功制作了一个基础的仪表盘!本篇内容主要介绍了Dash的基础知识及简单图表的绘制方法,并通过一个实例演示了如何构建一个基础仪表盘。下一个教程将会教大家如何制作更加高级的、且可互动的仪表盘。
由于我自己学习 Python 的时间不长,整个教程也是在摸索中完成的。如果其中有任何不对的地方,或者有遗漏的内容,欢迎大家批评指正并提出宝贵的建议!希望这个教程能对你的学习有所帮助,也期待与你一起进步!
作者:2401_89019216