求助:使用plt.scatter绘制分类变量空心散点图失败
解决Matplotlib散点图facecolors='none'不生效的问题
嘿,我太懂你这种明明按参数设置了却出不来预期效果的挫败感了!你想基于gender分类,用ChildrenHeight和ParentHeight画带不同边缘色的空心圆散点图,但代码里设了facecolors='none'还是实心圆,问题出在**c=y参数会覆盖你的填充色设置**上。
咱们来拆解下原因:当你用c=y来让散点颜色对应分类变量时,Matplotlib默认会把这个颜色同时应用到点的填充色和边缘色上,这时候你单独设置的facecolors='none'就被覆盖了,自然还是实心圆。
给你几个靠谱的解决办法,任选其一都能搞定:
方法1:改用edgecolors指定分类颜色
直接把颜色映射从c换成edgecolors,同时保留facecolors='none',这样边缘色会跟着gender分类走,填充色完全透明:
plt.scatter(X[:, 0], X[:, 1], edgecolors=y, marker='o', facecolors='none', cmap=plt.cm.Set1)
这个方法最直接,也完全符合你“不同边缘色空心圆”的需求。
方法2:用单数facecolor配合linewidths
如果你更习惯用c=y参数,可以把facecolors='none'换成单数的facecolor='none'(注意是单数形式!),同时加个linewidths参数让边缘更清晰,避免细线条看起来像实心:
plt.scatter(X[:, 0], X[:, 1], c=y, marker='o', facecolor='none', cmap=plt.cm.Set1, linewidths=1.5)
在Matplotlib里,单数形式的facecolor比复数facecolors优先级更高,能覆盖c参数带来的填充色设置。
额外小提示
如果你的Matplotlib版本比较旧(比如2.x及以下),参数行为可能和新版本有差异,建议升级到3.x以上的版本,能减少不少这类奇怪的兼容性问题。
试试上面的方法,你就能得到按gender区分边缘色的空心圆散点图啦!
内容的提问来源于stack exchange,提问作者Qing
相关产品推荐
相关产品推荐

