1. 从“点”开始,讲一个数据故事
如果你也和我一样,曾经对着Excel里密密麻麻的数字发愁,试图从一堆表格里找出点规律,那你一定懂数据可视化的魅力。它就像给你的数据戴上了一副“透视眼镜”,那些隐藏在数字背后的关系、趋势和异常,瞬间变得一目了然。而在众多可视化工具里,散点图绝对是我的心头好。它简单、直接,两个坐标轴一摆,数据点一撒,关系就出来了。
但很多时候,现实世界的数据关系没那么单纯。比如,你想分析一家餐厅的营业情况,光看“总账单”和“小费”的关系够吗?你可能还想知道:周末和工作日的消费模式一样吗?男性和女性的消费习惯有差异吗?吸烟区和无烟区的顾客给小费更大方吗?你看,问题一下子就变成了四五个维度。这时候,传统的二维散点图就有点力不从心了,你难道要画五张图来对比吗?
别急,这就是我们今天要解锁的新姿势:用 Seaborn 库里的 sns.scatterplot 来绘制多维散点图。它厉害在哪?简单说,就是在一张图里,不仅能通过横轴(X)、纵轴(Y)展示两个核心变量,还能通过点的颜色(hue)、点的大小(size) 甚至点的形状(style),把第三、第四、第五个变量也巧妙地“塞”进去。一张图,讲一个包含五六个角色的复杂故事,而且颜值还超高,这就是专业数据分析师的“作弊”技巧。
我刚开始用的时候,也觉得参数好多,有点懵。但实际踩过几次坑、做过几个项目后,我发现它其实非常“小白友好”。只要你掌握了那几个核心参数的“组合拳”,就能轻松应对大部分复杂数据的可视化需求。这篇文章,我就把我这十年摸爬滚打总结的实战经验,掰开揉碎了讲给你听。我们不谈空泛的理论,直接上代码、看效果、讲场景,保证你看完就能上手,让你做的图表在汇报时脱颖而出。
2. 五分钟上手:你的第一个多维散点图
理论说再多,不如动手画一张。我们直接用 Seaborn 自带的一个经典数据集 tips(小费数据集)来开刀。这个数据集记录了一家餐厅的消费情况,包含总账单、小费、顾客性别、是否吸烟、星期几、用餐时间、用餐人数等信息,非常适合我们做多维度的探索。
首先,把环境和数据准备好。我强烈建议你在 Jupyter Notebook 或 VS Code 这类交互式环境里跟着操作,效果立竿见影。
# 导入必要的库
import seaborn as sns
import matplotlib.pyplot as plt
# 设置一下图表样式,让图更好看(这一步不是必须,但推荐)
sns.set_theme(style="whitegrid")
# 加载小费数据集
tips = sns.load_dataset("tips")
# 瞅一眼数据长啥样
print(tips.head())
运行这几行代码,你会看到一个表格。数据很干净,每一行代表一笔消费记录。我们的目标是,用一张图,尽可能多地揭示这些列之间的关系。
2.1 基础二维图:账单和小费的关系
万事开头简,我们先看最核心的两个数值关系:总账单 (total_bill) 和 小费 (tip)。直觉上,账单越高,小费应该越多,是不是这样呢?
# 绘制最基础的二维散点图
sns.scatterplot(data=tips, x="total_bill", y="tip")
plt.title('总账单 vs. 小费')
plt.show()
就这么一行核心代码!data 指定用哪个数据集,x 和 y 指定分别把哪一列放到横轴和纵轴。一张散点图瞬间生成。你可以看到,点的大致趋势是向右上方走的,说明我们的直觉基本正确:账单高的,小费倾向于也给得多。但也能明显看到,有些账单很高的,小费却给得很“抠门”,这些点可能就是值得深入分析的“异常点”。
2.2 引入第三个维度:星期几的影响
现在,我们加入第三个变量:星期几 (day)。我想知道,不同星期几的消费模式有没有不同。这时候,hue(色调)参数就派上用场了。
# 用颜色区分星期几
sns.scatterplot(data=tips, x="total_bill", y="tip", hue='day')
plt.title('总账单 vs. 小费 (按星期几分色)')
plt.show()
看,魔法发生了!原本黑色的点,现在被自动分成了四种颜色(比如蓝色代表周四,橙色代表周五等)。图例也自动生成了。现在你能一眼看出,周六、周日(周末)的数据点似乎更多,而且高账单的消费也多集中在周末。这就是颜色维度带来的信息增量:它不仅展示了关系,还进行了分类。
我在这里踩过一个小坑:当你的 hue 变量是字符串或分类类型时,Seaborn 会自动分配一组区分度明显的颜色。但如果你觉得默认的颜色顺序(按数据出现顺序)不符合你的习惯,比如你想让周末的颜色更醒目,可以用 hue_order 参数手动指定顺序。
# 手动指定颜色分类的顺序
sns.scatterplot(data=tips, x="total_bill", y="tip", hue='day',
hue_order=['Sun', 'Sat', 'Fri', 'Thur']) # 把周末


332

被折叠的 条评论
为什么被折叠?



