绘制国家奖牌柱状图时遇TypeError: unhashable type: 'numpy.ndarray'问题
错误原因分析
plt.bar()函数的第二个参数需要传入单个数值(奖牌的数量),但你当前的goldMedals、silverMedals、bronzeMedals是筛选后的DataFrame对象(不是计数结果)。当matplotlib尝试处理这个对象时,因为其底层的numpy数组属于不可哈希类型,所以抛出TypeError: unhashable type: 'numpy.ndarray'错误。
解决方案
方式一:修改原代码,直接统计奖牌数量
把筛选DataFrame的操作改成统计数量,用.shape[0]获取筛选后的行数(即奖牌数量):
import numpy as np import matplotlib.pyplot as plt N = 3 ind = np.arange(N) width = 0.25 # 改为统计数量,而不是保留整个DataFrame goldMedals = df[(df.Medal == 'Gold')].shape[0] bar1 = plt.bar(ind, goldMedals, width, color='gold') silverMedals = df[(df.Medal == 'Silver')].shape[0] bar2 = plt.bar(ind+width, silverMedals, width, color='silver') bronzeMedals = df[(df.Medal == 'Bronze')].shape[0] bar3 = plt.bar(ind+width*2, bronzeMedals, width, color='brown') plt.xlabel("Medal") plt.ylabel('Count') plt.title("Medal Portugal") plt.xticks(ind+width,['Gold', 'Silver', 'Bronze']) plt.legend( (bar1, bar2, bar3), ('Gold', 'Silver', 'Bronze') ) plt.show()
注:修正了原代码里银色柱子颜色写错(原代码用了bronze),以及xticks里的顺序错误问题
方式二:用value_counts()更简洁统计
一次性统计所有奖牌类型的数量,代码更简洁:
import matplotlib.pyplot as plt # 统计当前国家各奖牌数量,确保三种奖牌都被统计(无则补0) medal_counts = df['Medal'].value_counts().reindex(['Gold', 'Silver', 'Bronze'], fill_value=0) # 绘制柱状图 medal_counts.plot(kind='bar', color=['gold', 'silver', 'brown']) plt.xlabel("Medal") plt.ylabel('Count') plt.title("Medal Portugal") plt.xticks(rotation=0) # 让x轴标签水平显示 plt.show()
内容的提问来源于stack exchange,提问作者André Cunha
相关产品推荐
相关产品推荐

