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
相关产品推荐
相关产品推荐

