如何用Python可视化对比两组导演影片数量与毛利数据集?
代码问题分析
- 未导入/拼写错误:代码里用
mt指代matplotlib,但没有导入import matplotlib.pyplot as plt(或别名写错),会导致找不到模块。 - 变量未定义:
x变量没有初始化,它应该是对应导演数量的索引数组(比如x = np.arange(len(导演列表))),直接使用会抛出NameError。 - 数据结构适配问题:假设
top_20_grossing_all是DataFrame,items()返回的是列名和列数据迭代器,但代码中直接将measurement作为条形高度,可能维度不匹配;同时top_20_grossing_all['director_primary']作为x轴刻度,需要和x的长度完全一致。 - 标签错误:y轴标注为"Flims Released Count"(拼写错误,应为Films),且和代码要展示的毛利、影片数量双指标不匹配。
- 图例设置不合理:
ncols=3但实际只有两组数据,会造成图例布局冗余。
可视化方案指导
你的核心需求是对比影片数量对毛利的影响和少数高票房影片的贡献,推荐两种针对性的可视化方案:
1. 分组柱状图(逐导演对比两组数据)
适合直观对比同一导演在全量/筛选后数据中的影片数量、总毛利差异,能清晰看到哪些导演依赖多影片,哪些靠少数高票房作品。
修正后的示例代码:
import matplotlib.pyplot as plt import numpy as np # 假设已准备好两组数据: # top_20_all:全量数据的Top20导演,包含director_primary, film_count, gross_profit列 # top_20_filtered:筛选后的Top20导演,结构同上且导演列表与top_20_all对齐 directors = top_20_all['director_primary'].values x = np.arange(len(directors)) # 生成导演对应的索引位置 bar_width = 0.25 # 创建上下两个子图,分别展示影片数量和总毛利 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10), layout='constrained') # 子图1:影片数量对比 bar_all_count = ax1.bar(x - bar_width/2, top_20_all['film_count'], bar_width, label='全量数据Top20') bar_filtered_count = ax1.bar(x + bar_width/2, top_20_filtered['film_count'], bar_width, label='筛选后Top20') ax1.set_ylabel('影片数量') ax1.set_title('导演影片数量对比(全量vs筛选后)') ax1.set_xticks(x, directors, rotation=45, ha='right') # 旋转标签避免重叠 ax1.legend() ax1.bar_label(bar_all_count, padding=2) ax1.bar_label(bar_filtered_count, padding=2) # 子图2:总毛利对比 bar_all_profit = ax2.bar(x - bar_width/2, top_20_all['gross_profit'], bar_width, label='全量数据Top20') bar_filtered_profit = ax2.bar(x + bar_width/2, top_20_filtered['gross_profit'], bar_width, label='筛选后Top20') ax2.set_ylabel('总毛利') ax2.set_title('导演总毛利对比(全量vs筛选后)') ax2.set_xticks(x, directors, rotation=45, ha='right') ax2.legend() ax2.bar_label(bar_all_profit, padding=2, fmt='%.2f') # 格式化毛利显示 ax2.bar_label(bar_filtered_profit, padding=2, fmt='%.2f') plt.show()
2. 散点图+趋势线(探索相关性)
能直接观察影片数量和总毛利的线性关系:如果趋势线斜率大,说明影片数量对毛利影响显著;如果存在大量离群点(影片少但毛利极高),则说明少数高票房影片的贡献更大。
示例代码:
import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(figsize=(10, 6), layout='constrained') # 绘制两组数据的散点 ax.scatter(top_20_all['film_count'], top_20_all['gross_profit'], label='全量数据Top20', s=100, alpha=0.7, color='blue') ax.scatter(top_20_filtered['film_count'], top_20_filtered['gross_profit'], label='筛选后Top20', s=100, alpha=0.7, color='orange') # 添加线性趋势线,直观展示相关性 # 全量数据趋势线 z_all = np.polyfit(top_20_all['film_count'], top_20_all['gross_profit'], 1) p_all = np.poly1d(z_all) ax.plot(top_20_all['film_count'], p_all(top_20_all['film_count']), "--", color='blue', label='全量数据趋势') # 筛选后数据趋势线 z_filtered = np.polyfit(top_20_filtered['film_count'], top_20_filtered['gross_profit'], 1) p_filtered = np.poly1d(z_filtered) ax.plot(top_20_filtered['film_count'], p_filtered(top_20_filtered['film_count']), "--", color='orange', label='筛选后数据趋势') ax.set_xlabel('影片数量') ax.set_ylabel('总毛利') ax.set_title('影片数量与总毛利的相关性对比') ax.legend() plt.show()
方案选择建议
- 如果需要逐个导演对比指标变化,选分组柱状图;
- 如果需要快速判断两者的相关性强弱,选散点图+趋势线。
内容的提问来源于stack exchange,提问作者Toni4tonight
相关产品推荐
相关产品推荐

