现有txt文件“电影信息.txt”,其中三列分别为电影名称、导演和演员表,之间用分号分隔(同一个电影可能会有多个演员,每个演员姓名之间使用逗号分隔;同一部电影也可能有多个导演,多个导演之间用逗号分隔), 使用openpyxl和matplotlab实现电影数据分析任务:导演作品统计及可视化 对电影数据中的导演信息进行统计并生成柱状图,具体要求如下: 1. 在“电影信息统计.xlsx”文件中新增一个名为“导演作品统计”的sheet,统计每个导演执导的电影数量和执导电影列表。 2. 第一列填写导演姓名,第二列填写导演执导电影数量,第三列填写导演执导电影列表。如果同一导演中有多部电影,则多部电影之间以逗号(,)分隔。 3. 绘制横向柱状图,以电影数量为横坐标,以导演姓名为纵坐标。纵坐标从上到下按电影数量降序排列。 4. 在每个柱状图顶部标注出与其合作最多的演员姓名,若有多个演员,则演员名称以逗号(,)分隔。
时间: 2024-02-22 18:00:25 浏览: 82
好的,根据您的要求,我会进行编写代码。但在开始之前,我需要先确认一下您的电影信息.txt文件格式是否如下所示:
```
电影名称;导演;演员表
绿皮书;彼得·法雷里;维果·莫腾森,马赫沙拉·阿里
泰坦尼克号;詹姆斯·卡梅隆;莱昂纳多·迪卡普里奥,凯特·温丝莱特
...
```
另外,您需要安装openpyxl和matplotlib库,您可以通过以下命令进行安装:
```
pip install openpyxl matplotlib
```
确认文件格式和库已经安装后,可以将以下代码保存为.py文件并运行。
```python
from openpyxl import Workbook, load_workbook
import matplotlib.pyplot as plt
# 读取电影信息文件
with open('电影信息.txt', 'r', encoding='utf-8') as f:
movies = [line.strip().split(';') for line in f.readlines()]
# 统计导演作品数量和列表
directors = {}
for movie in movies:
movie_directors = movie[1].split(',')
for director in movie_directors:
if director not in directors:
directors[director] = {'count': 1, 'movies': [movie[0]]}
else:
directors[director]['count'] += 1
directors[director]['movies'].append(movie[0])
# 写入导演作品统计表格
wb = load_workbook('电影信息统计.xlsx')
ws = wb.create_sheet(title='导演作品统计')
ws.append(['导演姓名', '执导电影数量', '执导电影列表'])
for director, info in sorted(directors.items(), key=lambda x: x[1]['count'], reverse=True):
ws.append([director, info['count'], ','.join(info['movies'])])
wb.save('电影信息统计.xlsx')
# 绘制柱状图
counts = [info['count'] for director, info in sorted(directors.items(), key=lambda x: x[1]['count'], reverse=True)]
directors = [director for director, info in sorted(directors.items(), key=lambda x: x[1]['count'], reverse=True)]
plt.barh(directors, counts)
plt.xlabel('执导电影数量')
plt.ylabel('导演姓名')
plt.title('导演作品统计')
plt.tight_layout()
# 标注演员信息
rects = plt.gca().patches
for i, rect in enumerate(rects):
director = directors[i]
info = directors[director]
top_actor = max([(actor, movie_count) for actor, movie_count in actor_counts.items() if actor in movies and director in movies[actor]['directors']], key=lambda x: x[1])[0]
plt.text(rect.get_width() + 0.5, rect.get_y() + rect.get_height() / 2, top_actor, ha='left', va='center')
plt.show()
```
代码中,首先读取电影信息文件,然后统计每个导演执导的电影数量和执导电影列表,并将结果写入导演作品统计表格中。接着,使用matplotlib库绘制横向柱状图,并在每个柱状图顶部标注与其合作最多的演员姓名。最后,通过plt.show()显示柱状图。
阅读全文