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

Python多色散点图无法显示颜色图例的解决求助

嘿,我来帮你搞定散点图图例不显示的问题!

你遇到的核心问题是:直接把颜色列表传给scatter的c参数时,Matplotlib没办法把这些颜色和对应的body-style类别关联起来,所以调用ax.legend()时找不到对应的标签信息,自然就出不来图例啦。

给你两种简单的解决方案,选一个你觉得顺手的就行:

方案1:分车型类别单独绘制散点(最直观)

这种方法会给每个车型单独创建一个散点系列,每个系列对应一个标签,Matplotlib就能自动生成正确的图例了。而且代码修改起来也很简单:

import matplotlib.pyplot as plt

# 把内置关键字dict换成自定义变量名,避免冲突
style_color_map = {'convertible':'red' , 'hatchback':'blue' , 'sedan':'purple' , 'wagon':'yellow' , 'hardtop':'green'}
wtf["colour column"] = wtf["body-style"].map(style_color_map)
wtf["comp_ratio_size"] = df['compression-ratio'].apply(lambda x : x*x)

fig = plt.figure(figsize=(8,8),dpi=75)
ax = fig.gca()

# 循环每个车型,单独绘制散点并指定标签
for body_style, color in style_color_map.items():
    # 筛选当前车型的数据
    subset_data = wtf[wtf['body-style'] == body_style]
    # 绘制散点,注意调整x/y轴顺序(你要horsepower为X,engine-size为Y)
    ax.scatter(subset_data['horsepower'], subset_data['engine-size'],
               c=color,
               s=subset_data['comp_ratio_size'],
               alpha=0.4,
               label=body_style)

# 设置正确的轴标签
ax.set_xlabel('Horsepower')
ax.set_ylabel("Engine Size")
# 现在调用legend就能正常显示啦
ax.legend()
plt.show()

方案2:手动创建图例条目

如果不想分多次绘制,也可以手动给每个车型创建图例标记,然后传给legend函数:

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

style_color_map = {'convertible':'red' , 'hatchback':'blue' , 'sedan':'purple' , 'wagon':'yellow' , 'hardtop':'green'}
wtf["colour column"] = wtf["body-style"].map(style_color_map)
wtf["comp_ratio_size"] = df['compression-ratio'].apply(lambda x : x*x)

fig = plt.figure(figsize=(8,8),dpi=75)
ax = fig.gca()

# 一次性绘制所有散点,注意调整x/y轴顺序
ax.scatter(wtf['horsepower'], wtf['engine-size'],
           c=wtf["colour column"],
           s=wtf['comp_ratio_size'],
           alpha=0.4)

ax.set_xlabel('Horsepower')
ax.set_ylabel("Engine Size")

# 手动创建每个车型的图例标记
legend_handles = [
    Line2D([0], [0], marker='o', color='w', markerfacecolor=color, markersize=10, label=style)
    for style, color in style_color_map.items()
]
# 把自定义的handles传给legend
ax.legend(handles=legend_handles)

plt.show()

另外提个小细节:你原来的代码里scatter的x/y参数顺序和你说的需求反啦——你要horsepower做X轴、engine-size做Y轴,但原来的代码里第一个参数是engine-size,第二个是horsepower,上面的解决方案里已经帮你调整过来了哦。

内容的提问来源于stack exchange,提问作者Maaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:49