基于列数据设置散点图标记报错:TypeError: unhashable type: 'Series'
问题原因与解决方案
报错原因
plt.scatter()的参数支持逻辑存在差异:
c(颜色)和s(大小)参数允许传入序列(比如Pandas Series),为每个数据点单独设置属性;- 但
marker(标记样式)参数仅接受单个标记字符串(如'o'、'*'),无法直接传入Series。你把整个Series传给marker时,函数会尝试将其当作单个标记处理,而Series是不可哈希的类型,因此触发TypeError: unhashable type: 'Series'。
修复方案
方案一:分组单独绘制(适合两类标记的场景)
将数据按has_guests分组,分别调用scatter设置对应标记,逻辑直观:
import matplotlib.pyplot as plt # 保留原有颜色、大小的处理代码 office.loc[office['scaled_ratings'] < 0.25, 'mcolor'] = 'red' office.loc[(office['scaled_ratings'] >= 0.25) & (office['scaled_ratings'] < 0.50), 'mcolor'] = 'orange' office.loc[(office['scaled_ratings'] >= 0.50) & (office['scaled_ratings'] < 0.75), 'mcolor'] = 'lightgreen' office.loc[office['scaled_ratings'] >= 0.75, 'mcolor'] = 'darkgreen' office.loc[office['has_guests']== False, 'size'] = 25 office.loc[office['has_guests']== True, 'size'] = 250 # 分两组绘制 # 无嘉宾的剧集 no_guest_data = office[office['has_guests'] == False] plt.scatter(no_guest_data['episode_number'], no_guest_data['viewership_mil'], c=no_guest_data['mcolor'], s=no_guest_data['size'], marker='o') # 有嘉宾的剧集 has_guest_data = office[office['has_guests'] == True] plt.scatter(has_guest_data['episode_number'], has_guest_data['viewership_mil'], c=has_guest_data['mcolor'], s=has_guest_data['size'], marker='*') # 添加标签(可选) plt.xlabel('Episode Number') plt.ylabel('Viewership (Millions)') plt.show()
方案二:按标记分组遍历(支持多类标记扩展)
如果后续需要更多标记类型,可直接按已生成的marker列分组循环绘制:
import matplotlib.pyplot as plt # 保留原有颜色、大小、标记列的处理代码 office.loc[office['scaled_ratings'] < 0.25, 'mcolor'] = 'red' office.loc[(office['scaled_ratings'] >= 0.25) & (office['scaled_ratings'] < 0.50), 'mcolor'] = 'orange' office.loc[(office['scaled_ratings'] >= 0.50) & (office['scaled_ratings'] < 0.75), 'mcolor'] = 'lightgreen' office.loc[office['scaled_ratings'] >= 0.75, 'mcolor'] = 'darkgreen' office.loc[office['has_guests']== False, 'size'] = 25 office.loc[office['has_guests']== True, 'size'] = 250 office.loc[office['has_guests']== True, 'marker'] = '*' office.loc[office['has_guests']== False,'marker'] = 'o' # 按标记分组绘制 for marker_style, group_data in office.groupby('marker'): plt.scatter(group_data['episode_number'], group_data['viewership_mil'], c=group_data['mcolor'], s=group_data['size'], marker=marker_style) # 添加标签(可选) plt.xlabel('Episode Number') plt.ylabel('Viewership (Millions)') plt.show()
内容的提问来源于stack exchange,提问作者julian lagier
相关产品推荐
相关产品推荐

