在数据分析领域,数据可视化是一种将复杂数据以直观图表形式展示的方法,能够帮助我们快速发现数据中的规律和趋势。本文将通过一个基于 Pyecharts 的电影数据可视化实战案例,展示如何分析电影类型与评分的关系,并通过多种图表形式呈现分析结果。
一、实验背景与目的
随着电影产业的蓬勃发展,电影数据的分析对于电影制作、发行以及观众选择都有着重要的意义。通过数据可视化,我们可以直观地了解不同类型电影的评分情况、历年电影产量的变化趋势等信息。本次实验旨在:
-
掌握使用Python的Pyecharts库进行数据可视化的基本方法。
-
分析电影数据集,探索电影类型与评分、时间之间的关系。
-
通过图表展示2000年以来评分前十的电影排名及电影类型分布。
二、实验环境与工具
-
硬件环境:AMD Ryzen 7 6800H with Radeon Graphics 3.20 GHz
-
软件环境:VScode
-
主要工具:
-
Pyecharts:基于ECharts的Python可视化库,支持动态交互图表。
-
Pandas:用于数据清洗、分组聚合(如按类型计算平均评分)。
-
三、实验内容与实现
(一)数据准备
本次实验使用的电影数据集包含电影名称、评分、上映时间、类型等信息。数据集的结构如下表所示:
(二)可视化任务实现
1. 电影类型与评分的双轴图表
任务描述:绘制电影类型与评分的双轴图表(柱状图+折线图),展示每种电影类型的平均评分以及该类型的电影数量。
实现过程:
-
读取电影数据集,提取电影类型和评分信息。
-
对电影类型进行拆分(因一部电影可能属于多个类型),并计算每种类型的平均评分和出现次数。
-
使用柱状图(评分)和折线图(电影类型次数)的双轴图表展示数据。
代码实现:
def category_rate():
st.header("电影数据集分析")
st.subheader("电影类型与评分的关系")
data = pd.read_csv("C:/Users/J/Downloads/数据可视化实战/movie.csv", encoding="utf-8", usecols=[4, 8])
data_split = data['category'].str.split('/', expand=True, n=7)
data_line = data_split.stack()
data_reindex = data_line.reset_index(level=1, drop=True).rename('new_category')
data_recategory = data.drop(['category'], axis=1).join(data_reindex)
data_recategory = data_recategory.fillna("类型的数据缺失")
data_rate = data_recategory.groupby('new_category').rate.mean()
data_recategory = data_recategory.join(pd.concat([data_rate], axis=1, keys=['Average_rate']), on='new_category')
data_count_category = data_recategory.groupby('new_category').new_category.count()
data_recategory = data_recategory.join(pd.concat([data_count_category], axis=1, keys=['Count_category']), on='new_category')
data_recategory = data_recategory.drop_duplicates(subset='new_category', keep='last').sort_values(by='Average_rate', ascending=False)
category = data_recategory['new_category'].values.tolist()
rate = data_recategory['Average_rate'].values.tolist()
count_category = data_recategory['Count_category'].values.tolist()
bar = (
Bar(init_opts=opts.InitOpts(width="800px", height="600px", theme=ThemeType.DARK))
.add_xaxis(xaxis_data=category)
.add_yaxis(
series_name="评分",
y_axis=rate,
label_opts=opts.LabelOpts(is_show=False),
)
.extend_axis(
yaxis=opts.AxisOpts(
name="电影类型次数",
type_="value",
min_=0,
max_=2500,
interval=100,
axislabel_opts=opts.LabelOpts(formatter="{value}"),
)
)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(
is_show=True, trigger="axis", axis_pointer_type="cross"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
),
yaxis_opts=opts.AxisOpts(
name="评分值",
type_="value",
min_=6,
max_=9,
interval=0.3,
axislabel_opts=opts.LabelOpts(formatter="{value}"),
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="电影类型-评分"),
datazoom_opts=opts.DataZoomOpts(),
visualmap_opts=opts.VisualMapOpts(min_=6, max_=9),
)
)
line = (
Line()
.add_xaxis(xaxis_data=category)
.add_yaxis(
series_name="电影类型次数",
yaxis_index=1,
y_axis=count_category,
label_opts=opts.LabelOpts(is_show=False),
)
)
html = bar.overlap(line).render_embed()
st.components.v1.html(html, width=900, height=700, scrolling=False)

运行结果:
评分分布:从柱状图中可以看出,战争、歌舞、音乐、家庭等类型的电影评分较高,接近8分,而动作、武侠等类型的电影评分相对较低,接近7分。这表明观众对某些类型的电影有更高的评价。
类型次数:折线图显示了每种电影类型的出现次数。例如,剧情类电影的出现次数最高,接近2500次,而武侠类电影的出现次数较少,接近800次。这表明剧情类电影在市场上更受欢迎,而武侠类电影相对较少。
2. 2000年以来评分前十的电影排名表格
任务描述:筛选2000年以来的电影数据,按评分排序并提取前10名,生成包含名次、电影名、评分和时间的表格。
代码实现:
def Table_category_rate() -> Table:
data = pd.read_csv("C:/Users/J/Downloads/数据可视化实战/movie.csv", encoding="utf-8", usecols=[2, 4, 11])
data = data[data['showtime'] >= 2000]
data = data.sort_values('rate', ascending=False)
data = data[:10]
rank = data.columns.tolist()
rank.insert(rank.index('title'), 'rank')
data = data.reindex(columns=rank)
data['rank'] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data = data.values.tolist()
table = Table()
headers = ["名次", "电影名", "评分", "时间"]
rows = data
table.add(headers, rows)
table.set_global_opts(title_opts=ComponentTitleOpts(title="2000年以来评分前十的电影排名"))
return table
运行结果:

- 排名第一的是《灿烂人生》(9.3分,2003年),其次是《机器人总动员》(9.3分,2008年)。
结论:高评分电影多为剧情、动画类,且分布在不同年份。
3. 2010-2015年电影类型产量动态图
任务描述:按年份分组,统计每年电影类型的产量,提取每年产量前五的类型,生成横向柱状图,并使用Timeline组件实现时间轴切换效果。
代码实现:
def Timeline_category_showtime() -> Timeline:
tl = Timeline()
for i in range(2010, 2016):
data = pd.read_csv("C:/Users/J/Downloads/数据可视化实战/movie.csv", encoding="utf-8", usecols=[8, 11])
data = data[data['showtime'] >= 2010]
data_split = data['category'].str.split('/', expand=True, n=7)
data_line = data_split.stack()
data_reindex = data_line.reset_index(level=1, drop=True).rename('new_category')
data_recategory = data.drop(['category'], axis=1).join(data_reindex)
data_recategory = data_recategory[data_recategory['showtime'] == i]
data_count_showtime = data_recategory.groupby('new_category').new_category.count()
data_recategory = data_recategory.join(pd.concat([data_count_showtime], axis=1, keys=['count']), on='new_category')
data_recategory = data_recategory.drop_duplicates(subset='new_category', keep='last').sort_values(by='count', ascending=False)
data_recategory = data_recategory[:5].sort_values(by='count', ascending=True)
category = data_recategory['new_category'].values.tolist()
count = data_recategory['count'].values.tolist()
bar = (
Bar()
.add_xaxis(category)
.add_yaxis("{}年".format(i), count, label_opts=opts.LabelOpts(position="right"))
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts("{}年电影类型产量前五".format(i))
)
)
tl.add(bar, "{}年".format(i))
return tl
运行结果:

- 2013年:剧情、动作、喜剧、爱情、惊悚类型产量较高。
结论:剧情类型始终占据主导地位,动作和喜剧类型也较受欢迎。
4. 电影平均评分前五的类型的漏斗图
任务描述:计算每种类型的平均评分,提取评分最高的前五种类型,使用漏斗图展示类型与评分的关系。
代码实现:
def category_rate():
# 省略部分代码
data_recategory = data_recategory.sort_values('Average_rate', ascending=False)[:5]
category_rank = data_recategory['new_category']
y = [1, 2, 3, 4, 5]
c = (
Funnel()
.add(
"类型-名次:",
[list(z) for z in zip(category_rank, y)],
sort_="ascending",
label_opts=opts.LabelOpts(position="inside"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="电影平均评分前五的类型"))
)
html = c.render_embed()
st.components.v1.html(html, width=900, height=700, scrolling=False)
运行结果:

- 平均评分前五的电影类型依次为"黑色电影"、"荒诞"、"动画"、"儿童"和"类型的数据缺失"。
结论:小众或特定类型(如"黑色电影")更易获得高分。
四、实验总结
特性/图表类型 | 双轴图表 | 漏斗图 | 动态柱状图 |
---|---|---|---|
定义 | 一种在同一图表中使用两个垂直轴(Y轴)来展示两组数据的图表,通常用于比较不同量级或单位的数据。 | 一种用于展示数据在各个阶段的转化率流失或情况的图表,通常呈现为上宽下窄的形状,类似漏斗。 | 一种通过动态效果展示数据随时间变化或趋势的柱状图,可以实时更新数据或展示历史变化。 |
适用场景 | 比较不同量级的数据(如销售额与利润率) | 展示销售流程中的转化率(如潜在客户到成交客户) | 展示数据随时间的变化趋势(如月度销售额) |
优点 | 节省空间,同时展示两组数据 | 直观展示数据的转化和流失情况 | 动态展示数据变化,增强视觉效果 |
缺点 | 可能导致图表过于复杂,难以理解 | 只能展示单向的转化过程,无法反映回流等情况 | 动态可能效果分散注意力,影响对数据的准确解读 |
常见数据类型 | 数值型数据(如金额、数量) | 流程数据(如销售流程的各阶段人数) | 时间序列数据(如月按、按年统计的数据) |
(一)技术收获
-
掌握了Pyecharts的多图表联动和动态交互设计。
-
学会使用Pandas处理多值字段(如拆分电影类型)。
(二)扩展思考
-
可引入情感分析,探究评分与用户评论情感倾向的关系。
-
尝试用热力图展示类型与年份的交叉分布。
五、未来展望
本次实验通过Pyecharts和Pandas完成了对电影数据集的可视化分析,不仅掌握了数据可视化的技术,还对电影数据进行了深入的探索和分析。通过实验,我深刻体会到数据可视化在数据分析中的重要性,它能够帮助我们更直观地发现数据中的规律和趋势。未来,我将继续学习更多数据可视化工具和方法,提升数据分析能力,为解决实际问题提供更有力的支持。