现有txt文件“电影信息.txt”,其中三列分别为电影名称、导演和演员表,之间用分号分隔(同一个电影可能会有多个演员,每个演员姓名之间使用逗号分隔;同一部电影也可能有多个导演,多个导演之间用逗号分隔)任务四:导演作品统计及可视化 对电影数据中的导演信息进行统计并生成柱状图,具体要求如下: 1. 在“电影信息统计.xlsx”文件中新增一个名为“导演作品统计”的sheet,统计每个导演执导的电影数量和执导电影列表。 2. 第一列填写导演姓名,第二列填写导演执导电影数量,第三列填写导演执导电影列表。如果同一导演中有多部电影,则多部电影之间以逗号(,)分隔。 3. 绘制横向柱状图,以电影数量为横坐标,以导演姓名为纵坐标。纵坐标从上到下按电影数量降序排列。 4. 在每个柱状图顶部标注出与其合作最多的演员姓名,若有多个演员,则演员名称以逗号(,)分隔。要求对任务定义函数并使用openpyxl和matplotlab实现电影数据分析任务
时间: 2024-02-12 09:05:08 浏览: 66
好的,这是一个关于电影数据分析的任务,我们需要使用Python的openpyxl和matplotlab库来完成。下面是该任务的代码实现:
```python
import openpyxl
import matplotlib.pyplot as plt
# 读取电影信息.txt文件,返回电影列表
def read_movie_data():
movies = []
with open("电影信息.txt", "r", encoding="utf-8") as f:
for line in f:
movie_data = line.strip().split(";")
movie_name = movie_data[0]
directors = movie_data[1].split(",")
actors = movie_data[2].split(",")
movies.append((movie_name, directors, actors))
return movies
# 统计每个导演执导的电影数量和执导电影列表
def count_director_movies(movies):
director_movies = {}
for movie in movies:
movie_name, directors, actors = movie
for director in directors:
if director not in director_movies:
director_movies[director] = {"count": 0, "movies": []}
director_movies[director]["count"] += 1
director_movies[director]["movies"].append(movie_name)
return director_movies
# 将导演作品统计写入Excel文件中
def write_director_movies_to_excel(director_movies):
workbook = openpyxl.load_workbook("电影信息统计.xlsx")
worksheet = workbook.create_sheet("导演作品统计")
worksheet["A1"] = "导演姓名"
worksheet["B1"] = "执导电影数量"
worksheet["C1"] = "执导电影列表"
row = 2
for director, data in director_movies.items():
worksheet.cell(row=row, column=1).value = director
worksheet.cell(row=row, column=2).value = data["count"]
worksheet.cell(row=row, column=3).value = ",".join(data["movies"])
row += 1
workbook.save("电影信息统计.xlsx")
# 绘制柱状图并标注演员姓名
def plot_director_movies(director_movies):
sorted_director_movies = sorted(director_movies.items(), key=lambda x: x[1]["count"], reverse=True)
directors = [x[0] for x in sorted_director_movies]
counts = [x[1]["count"] for x in sorted_director_movies]
fig, ax = plt.subplots()
ax.barh(directors, counts)
ax.invert_yaxis()
ax.set_xlabel("执导电影数量")
ax.set_ylabel("导演姓名")
for i, director in enumerate(directors):
actors = {}
for movie in director_movies[director]["movies"]:
_, _, movie_actors = next((x for x in movies if x[0] == movie), ("", [], []))
for actor in movie_actors:
if actor not in actors:
actors[actor] = 0
actors[actor] += 1
sorted_actors = sorted(actors.items(), key=lambda x: x[1], reverse=True)
top_actor = sorted_actors[0][0]
if len(sorted_actors) > 1 and sorted_actors[1][1] == sorted_actors[0][1]:
top_actor = ",".join([x[0] for x in sorted_actors if x[1] == sorted_actors[0][1]])
ax.text(counts[i] + 1, i, top_actor, ha="left", va="center")
plt.show()
if __name__ == "__main__":
movies = read_movie_data()
director_movies = count_director_movies(movies)
write_director_movies_to_excel(director_movies)
plot_director_movies(director_movies)
```
以上代码实现了任务的四个要求:
1. `read_movie_data`函数读取`电影信息.txt`文件并返回电影列表;
2. `count_director_movies`函数统计每个导演执导的电影数量和执导电影列表;
3. `write_director_movies_to_excel`函数将导演作品统计写入Excel文件中;
4. `plot_director_movies`函数绘制柱状图并标注演员姓名。
你可以将以上代码保存为一个`.py`文件并在命令行中运行,程序将自动读取电影数据并生成柱状图。同时,也会在`电影信息统计.xlsx`文件中新增一个名为“导演作品统计”的sheet,其中包含了导演执导电影数量和执导电影列表。
阅读全文