学习笔记:使用 pandas 和 Seaborn 绘制柱状图
前言
今天在使用 pandas
对数据进行处理并在 Python 中绘制可视化图表时,遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结,以便之后的项目中可以快速上手和排错。
一、设置 Matplotlib 字体
在 Python 中,Matplotlib 绘图时默认使用的英文字体不支持中文,如果直接渲染中文,往往会显示成方块或乱码。为了解决这个问题,我们可以通过修改 rcParams
来设置一个支持中文的字体,例如 SimHei
(黑体)或 Microsoft YaHei
。
下面是一段简单的函数,用于快速切换中文字体:
python
def set_chinese_font(font_name='SimHei'):
"""
设置Matplotlib的中文字体。
:param font_name: 字体名称,默认使用'SimHei'。
其他常见中文字体如'Microsoft YaHei'。
"""
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [font_name] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
注意 :如果系统中没有安装对应字体,设置可能不会生效。可以自行在系统(如 Windows 的
C:\Windows\Fonts
)安装相应的字体文件。
二、Seaborn 与 Matplotlib 主题的冲突
很多时候,我们还会喜欢使用 Seaborn 自带的主题来让图表看起来更美观,例如:
python
import seaborn as sns
sns.set(style="whitegrid")
然而,一些版本的 Seaborn 可能会覆盖你在 Matplotlib 中设置的字体;或者你在不同地方多次调用不同的主题,也可能引发冲突。常见解决方法是要么只使用 Seaborn 的主题而不手动改字体,要么先调用 Seaborn 的主题再调用中文字体,让中文字体占最终优先级。
例如,如果你想保留白色网格风格,但又希望用黑体显示中文,可以这样写:
python
import seaborn as sns
sns.set(style="whitegrid")
# 然后设置中文字体
set_chinese_font('SimHei')
如果两者仍然冲突,建议去掉其中一个或尝试删除 Matplotlib 缓存,让它重新扫描系统字体。
三、Seaborn barplot
的工作原理
在使用 Seaborn
绘制柱状图时,常见用法是:
python
import seaborn as sns
bar_plot = sns.barplot(
x='学院',
y='人数',
data=college_counts,
palette='viridis'
)
不需要 再手动把 bar_plot
"放进" Matplotlib,因为 Seaborn 会自动在当前的 Matplotlib Figure 中生成 Axes,返回给我们的是一个已经绑定到该 Figure 的对象。因此,只要最后 plt.show()
或 plt.savefig()
,就能看到或保存这张图表。
1. 同一个坐标多个柱状(同一个 x 有多个柱子)
当我们想要在同一个 x 值下显示多个柱子(例如,同一个学院下,分别统计"参保"和"未参保"人数),可以使用 hue
参数:
python
bar_plot = sns.barplot(
x='学院',
y='人数',
data=grouped_df,
hue='2025年参保情况', # 在同一个学院里区分参保和未参保
palette='viridis',
dodge=True, # True:并排放置;False:重叠放置
legend=True # 是否显示图例
)
关键参数说明
-
x='学院'
: 横轴分组依据。每个学院在 x 轴上有一个刻度。 -
hue='2025年参保情况'
: 同一个学院如何再细分颜色。因为grouped_df
里有一列 "2025年参保情况" (参保
/未参保
),Seaborn 就会在同一个 x 刻度下绘制两根柱子并用不同的颜色。 -
dodge=True
: 当同一个 x 有多个柱子时,并排显示。如果改成False
,则会把这些柱子重叠绘制。dodge意味躲避,= true时
= false时
-
legend=True
: 是否显示图例。因为我们有hue
,所以图例可以帮我们标识不同颜色所对应的"参保" / "未参保"。
2. 如何得到 grouped_df
通常,我们会有一个 DataFrame 包含诸如"学院"、"2025年参保情况"、"姓名"等列。要得到分组后的每组人数,可以这样:
python
grouped_df = df.groupby(['学院', '2025年参保情况']).size().reset_index(name='人数')
groupby(['学院', '2025年参保情况'])
:先按"学院"和"参保情况"分组.size()
:求出每个分组内行数,即人数.reset_index(name='人数')
:把分组索引转换为普通列,并将这个计数列重命名为"人数"
然后 grouped_df
就可以拿来给 Seaborn 的 barplot
使用了。
四、总结
-
字体设置与 Seaborn 主题冲突:
- 要么只用一方;
- 要么先
sns.set(...)
,再set_chinese_font(...)
。
-
Seaborn barplot 与 Matplotlib
- Seaborn 自动把数据绘制到当前图中,不需要显式地"放进" Matplotlib;
- 只需
plt.show()
或plt.savefig()
查看或保存结果。
-
一个横坐标多个柱状图
- 通过设置
hue='...'
参数,告诉 Seaborn 在同一 x 类别下再细分颜色。 dodge=True
为并排,不会重叠;dodge=False
则重叠显示。
- 通过设置
-
分组汇总
- 借助
groupby()
+size()
(或count()
、sum()
等)做聚合,再用reset_index
转换成列形式,是一条非常重要的分析路径。
- 借助
通过这些技巧,我们就可以轻松地使用 pandas
+ Seaborn
绘制各种各样的统计图表,展示数据中的分类情况、分布情况以及关系,满足日常数据分析与可视化需求。
延伸阅读
- Seaborn 官方文档: https://seaborn.pydata.org/
- Matplotlib 字体管理: https://matplotlib.org/stable/tutorials/text/text_props.html
- pandas 文档: https://pandas.pydata.org/docs/
至此,今天的学习心得就整理完毕啦! 希望这篇笔记能帮你更快掌握在 Python 中处理中文显示、使用 Seaborn 绘制柱状图,以及在同一个坐标轴上并排展示多个柱子的技巧。祝你在数据可视化之路上更进一步!