Python matplotlib绘制第二张直方图叠加第一张数据问题求解
问题原因
- matplotlib默认会复用当前活跃的画布对象,绘制完第一张评分直方图后没有清空画布,直接绘制第二张年份直方图时,新的直方图会直接叠加在原有画布的内容上,最终导致
years.png里同时出现了两次统计的结果。
修复方案
方案1:绘制完第一张图后清空画布
在plt.savefig('ratings.png')后面加一行plt.clf()清空当前画布的所有内容,再绘制第二张图即可,修改后的核心代码段:
rate_hist = plt.hist(ratings, bins=10) plt.title('Ratings') plt.xlabel('Ratings') plt.ylabel('Movies count') plt.savefig('ratings.png') plt.clf() # 新增:清空当前画布 year_hist = plt.hist(years, bins=50) plt.title('Years') plt.xlabel('Years') plt.xticks(rotation=90, fontsize=4) plt.ylabel('Movies count') plt.savefig('years.png')
方案2:每次绘图前创建独立画布
在绘制每张图前都调用plt.figure()创建独立的新画布,从根源上避免内容叠加,修改后的核心代码段:
# 绘制评分直方图 plt.figure() # 新建第一张独立画布 rate_hist = plt.hist(ratings, bins=10) plt.title('Ratings') plt.xlabel('Ratings') plt.ylabel('Movies count') plt.savefig('ratings.png') # 绘制年份直方图 plt.figure() # 新建第二张独立画布 year_hist = plt.hist(years, bins=50) plt.title('Years') plt.xlabel('Years') plt.xticks(rotation=90, fontsize=4) plt.ylabel('Movies count') plt.savefig('years.png')
额外优化建议
- 原代码中
years.sort()放在循环体内,每次新增年份都做一次全量排序,效率很低,可以把这行移到循环结束之后,只排序一次即可。 - 读取年份的时候可以转成int类型,避免直方图排序时按照字符串排序出现逻辑错误。
内容的提问来源于stack exchange,提问作者Tatiana
相关产品推荐
相关产品推荐

