条形图与直方图
使用 ax.bar() 可视化分类计数,使用 ax.hist() 展示数据分布,并调整区间数量和边缘颜色。
条形图与直方图 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。
条形图和直方图
条形图用于展示分类数据:每个类别对应一个条形,条形高度与数值成正比。它回答的是“每个类别有多少?”。直方图用于展示连续数值变量的分布:数据会被分到多个区间中,条形高度表示每个区间中的计数或频率。它回答的是“这些数值如何分布?”。二者分别使用 ax.bar() 和 ax.hist()。
使用 ax.bar() 绘制垂直条形图
ax.bar(x, height) 会绘制垂直条形图,其中 x 是类别位置(或标签)的序列,height 是条形的数值。主要参数包括:width(默认值为 0.8,用于控制条形相对于间隔的宽度)、color、edgecolor 和 align('center' 或 'edge')。该方法返回一个 Rectangle artist 对象列表。
import matplotlib.pyplot as plt
import numpy as np
categories = ['East', 'West', 'North', 'South']
values = [420, 380, 310, 290]
fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)
ax.set_title('Regional Revenue')
ax.set_xlabel('Region')
ax.set_ylabel('Revenue (USD)')
# plt.show()
plt.close()自定义条形外观
进行一些自定义设置,可以显著提高条形图的可读性:为所有条形使用一种强调色(或使用颜色数组区分每个条形),使用 ax.bar_label() 在每个条形上方添加数值标签,控制条形宽度以留出适当空隙,并设置 ax.set_ylim(0, max * 1.15),为最高条形上方的标签留出空间。
fig, ax = plt.subplots(figsize=(7, 4))
bars = ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)
# Add value labels above bars
ax.bar_label(bars, fmt='%d', padding=3, fontsize=10)
# Give space above bars for labels
ax.set_ylim(0, max(values) * 1.15)
ax.set_title('Regional Revenue')
plt.tight_layout()
plt.close()使用 ax.barh() 绘制水平条形图
使用 ax.barh(y, width) 绘制水平条形图。当类别标签较长(从左到右阅读更自然)或类别较多(水平条形排列更紧凑)时,通常优先使用水平条形图。所有相同的自定义参数都适用:height 控制条形厚度,ax.barh_label()(或 ax.bar_label())添加文本标签。
import pandas as pd
df = pd.DataFrame({'region': categories, 'revenue': values})
df_sorted = df.sort_values('revenue')
fig, ax = plt.subplots(figsize=(7, 4))
ax.barh(df_sorted['region'], df_sorted['revenue'],
color='steelblue', edgecolor='white', height=0.5)
ax.set_title('Revenue by Region (Sorted)')
ax.set_xlabel('Revenue (USD)')
plt.tight_layout()
plt.close()分组条形图
要并排比较多个组,可以手动偏移条形位置来创建分组条形图。先计算每个组的中心位置,然后为每个子组减去或加上固定偏移量。条形总宽度加上组间间隔必须等于 1.0,才能避免条形相互重叠。设置 ax.set_xticks() 可以将刻度标签置于分组条形的中间。
products = ['A', 'B', 'C']
q1 = [80, 120, 95]
q2 = [90, 110, 105]
x = np.arange(len(products))
width = 0.35
fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(x - width/2, q1, width, label='Q1', color='steelblue')
ax.bar(x + width/2, q2, width, label='Q2', color='coral')
ax.set_xticks(x)
ax.set_xticklabels(products)
ax.legend()
ax.set_title('Q1 vs Q2 Sales by Product')
plt.close()堆叠条形图
堆叠条形图展示总量由多个子组构成的情况。第二组条形从第一组条形的末端开始绘制,这通过 bottom 参数实现。后续每一层的 bottom 都是前面所有层的累积总和。堆叠条形图适合同时展示总量及各组成部分的贡献。
q1_arr = np.array(q1)
q2_arr = np.array(q2)
fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(products, q1_arr, label='Q1', color='steelblue')
ax.bar(products, q2_arr, bottom=q1_arr, label='Q2', color='coral')
ax.legend()
ax.set_title('Stacked Q1 + Q2 Sales by Product')
ax.set_ylabel('Total Sales')
plt.close()使用 ax.hist() 绘制直方图
ax.hist(data, bins) 会创建直方图。bins 参数控制将数据划分为多少个等间距区间(默认值为 10)。您也可以传入分箱边界列表,以使用不等间距的区间。主要参数包括:density=True 将直方图归一化为概率密度,edgecolor 在条形之间添加边框,color 和 alpha 控制外观。
np.random.seed(42)
data = np.random.randn(500) # 500 samples from standard normal
fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(data, bins=30, color='steelblue', edgecolor='white', alpha=0.7)
ax.set_title('Distribution of Values')
ax.set_xlabel('Value')
ax.set_ylabel('Count')
plt.close()选择分箱数量
分箱数量会显著影响直方图的外观。分箱太少会隐藏数据结构;分箱太多则会产生嘈杂的尖峰。常见的经验法则包括 Sturges 法则(≈ log2(n) + 1)、Scott 法则和 Freedman-Diaconis 法则。Matplotlib 支持将这些规则写成字符串:bins='auto'、bins='scott'、bins='fd'。进行探索性分析时,可以手动尝试几个数值;制作演示内容时,应选择最能传达数据形状的分箱数量。
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, b in zip(axes, [5, 30, 'auto']):
ax.hist(data, bins=b, edgecolor='white', color='steelblue', alpha=0.7)
ax.set_title(f'bins={b}')
ax.set_xlabel('Value')
plt.tight_layout()
plt.close()用于比较的重叠直方图
要在同一坐标轴上比较两个分布,请使用不同的数据和颜色调用两次 ax.hist()。为两者都设置 alpha=0.5,以便清楚显示重叠部分。添加标签并调用 ax.legend()。当样本数量不同时,使用 density=True 可将两个直方图标准化到同一尺度,从而直接比较它们的形状。
group_a = np.random.randn(300)
group_b = np.random.randn(300) + 1.5 # shifted right
fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(group_a, bins=25, alpha=0.5, color='steelblue', label='Group A', density=True)
ax.hist(group_b, bins=25, alpha=0.5, color='coral', label='Group B', density=True)
ax.legend()
ax.set_title('Distribution Comparison')
plt.close()绘制 Pandas Series 和 DataFrames
.plot.bar() 和 .plot.hist() 都可作为 DataFrame/Series 的方法使用,并会自动生成 Matplotlib 图形。它们接受 ax 参数,可将图形绘制到现有的 Axes 上。这是根据分组后的 Pandas 数据创建条形图的最快方法:先计算 groupby 聚合结果,再对结果调用 .plot.bar(),最后自定义返回的 Axes。
import pandas as pd
import numpy as np
df_sales = pd.DataFrame({
'region': ['East', 'West', 'North', 'South'],
'revenue': [420, 380, 310, 290]
}).set_index('region')
fig, ax = plt.subplots(figsize=(7, 4))
df_sales['revenue'].plot.bar(ax=ax, color='steelblue', rot=0)
ax.set_title('Revenue by Region')
plt.tight_layout()
plt.close()选择条形图还是直方图
选择条形图还是直方图取决于数据类型。当 x 轴表示彼此独立且无序的类别(例如产品名称、地区和用户群组),并且条形表示每个类别的聚合值时,应使用条形图。当 x 轴是连续数值变量,并且您希望展示数值在某个范围内的分布情况时,应使用直方图。混淆两者是常见的可视化错误,会误导读者对数据类型的理解。
# Bar chart: categorical x-axis (product names)
products = ['Widget', 'Gadget', 'Doohickey']
revenue = [500, 300, 200]
fig, ax = plt.subplots(figsize=(5, 3))
ax.bar(products, revenue, color='steelblue')
ax.set_title('Revenue per Product (Bar Chart)')
plt.close()
# Histogram: continuous x-axis (order sizes)
order_sizes = np.random.exponential(scale=50, size=300)
fig, ax = plt.subplots(figsize=(5, 3))
ax.hist(order_sizes, bins=20, color='coral', edgecolor='white')
ax.set_title('Distribution of Order Sizes (Histogram)')
plt.close()快速检查
请测试您对本课条形图和直方图的理解。
课程回顾
在本课中,您学习了:ax.bar() 创建垂直条形图,ax.barh() 创建水平条形图;bottom 用于创建堆叠条形图;ax.hist() 创建直方图,其分箱数量由 bins 控制;而 density=True 会将直方图标准化,以便公平比较。接下来,我们将添加坐标轴标签、标题,并保存达到出版质量的图形。
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「条形图与直方图」课时是免费的吗?
是的 — 「条形图与直方图」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。
「条形图与直方图」这节课中我会学到什么?
使用 ax.bar() 可视化分类计数,使用 ax.hist() 展示数据分布,并调整区间数量和边缘颜色。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Pandas & NumPy Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「条形图与直方图」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?
能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 图形与坐标轴架构
- 折线图与散点图
- 条形图与直方图
- 标签、标题与保存图形