You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于列数据设置散点图标记报错: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:27:28