You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Pandas中为ToothGrowth分组数据设置特定区间绘制直方图

在Python Pandas中为ToothGrowth数据集分组绘制指定区间的直方图

问题背景

我有R语言中的标准数据集ToothGrowth,已经编写了如下R代码,根据不同给药方式绘制了两幅豚鼠牙齿生长长度的直方图:

vctooth <- ToothGrowth[1:30, c(3,1)]
ojtooth <- ToothGrowth[31:60, c(3,1)]

hist(vctooth$len, main = 'Length of tooth growth in Guinea Pigs
                          Delivery method: ascorbic acid',
                  xlab = "Length of Growth",
                  ylab="Frequency",
                  ylim=c(0,10),)
hist(ojtooth$len, main = 'Length of tooth growth in Guinea Pigs
                          Delivery method: orange juice',
                  xlab = "Length of Growth",
                  ylab="Frequency",
                  ylim=c(0,10),)

现在想知道如何在Python Pandas中为vctooth和ojtooth设置特定区间并绘制直方图,以下是ToothGrowth数据集:

"len","supp","dose"
4.2,"VC",0.5
11.5,"VC",0.5
7.3,"VC",0.5
5.8,"VC",0.5
6.4,"VC",0.5
10,"VC",0.5
11.2,"VC",0.5
11.2,"VC",0.5
5.2,"VC",0.5
7,"VC",0.5
16.5,"VC",1
16.5,"VC",1
15.2,"VC",1
17.3,"VC",1
22.5,"VC",1
17.3,"VC",1
13.6,"VC",1
14.5,"VC",1
18.8,"VC",1
15.5,"VC",1
23.6,"VC",2
18.5,"VC",2
33.9,"VC",2
25.5,"VC",2
26.4,"VC",2
32.5,"VC",2
26.7,"VC",2
21.5,"VC",2
23.3,"VC",2
29.5,"VC",2
15.2,"OJ",0.5
21.5,"OJ",0.5
17.6,"OJ",0.5
9.7,"OJ",0.5
14.5,"OJ",0.5
10,"OJ",0.5
8.2,"OJ",0.5
9.4,"OJ",0.5
16.5,"OJ",0.5
9.7,"OJ",0.5
19.7,"OJ",1
23.3,"OJ",1
23.6,"OJ",1
26.4,"OJ",1
20,"OJ",1
25.2,"OJ",1
25.8,"OJ",1
21.2,"OJ",1
14.5,"OJ",1
27.3,"OJ",1
25.5,"OJ",2
26.4,"OJ",2
22.4,"OJ",2
24.5,"OJ",2
24.8,"OJ",2
30.9,"OJ",2
26.4,"OJ",2
27.3,"OJ",2
29.4,"OJ",2
23,"OJ",2

预期输出效果:
预期直方图效果


解决方案

可以通过pandas加载数据,按给药方式分组,结合matplotlib绘制指定区间的直方图,步骤如下:

1. 导入所需库

import pandas as pd
import matplotlib.pyplot as plt

2. 加载数据集

可以直接读取本地CSV文件,或通过字符串加载给定数据:

# 从字符串加载数据集
data_str = """
"len","supp","dose"
4.2,"VC",0.5
11.5,"VC",0.5
7.3,"VC",0.5
5.8,"VC",0.5
6.4,"VC",0.5
10,"VC",0.5
11.2,"VC",0.5
11.2,"VC",0.5
5.2,"VC",0.5
7,"VC",0.5
16.5,"VC",1
16.5,"VC",1
15.2,"VC",1
17.3,"VC",1
22.5,"VC",1
17.3,"VC",1
13.6,"VC",1
14.5,"VC",1
18.8,"VC",1
15.5,"VC",1
23.6,"VC",2
18.5,"VC",2
33.9,"VC",2
25.5,"VC",2
26.4,"VC",2
32.5,"VC",2
26.7,"VC",2
21.5,"VC",2
23.3,"VC",2
29.5,"VC",2
15.2,"OJ",0.5
21.5,"OJ",0.5
17.6,"OJ",0.5
9.7,"OJ",0.5
14.5,"OJ",0.5
10,"OJ",0.5
8.2,"OJ",0.5
9.4,"OJ",0.5
16.5,"OJ",0.5
9.7,"OJ",0.5
19.7,"OJ",1
23.3,"OJ",1
23.6,"OJ",1
26.4,"OJ",1
20,"OJ",1
25.2,"OJ",1
25.8,"OJ",1
21.2,"OJ",1
14.5,"OJ",1
27.3,"OJ",1
25.5,"OJ",2
26.4,"OJ",2
22.4,"OJ",2
24.5,"OJ",2
24.8,"OJ",2
30.9,"OJ",2
26.4,"OJ",2
27.3,"OJ",2
29.4,"OJ",2
23,"OJ",2
"""
df = pd.read_csv(pd.io.common.StringIO(data_str))

3. 分组并绘制指定区间的直方图

先自定义直方图区间,再分别绘制两组数据的直方图:

# 定义直方图区间,可根据需求调整
bins = [0, 5, 10, 15, 20, 25, 30, 35]

# 按给药方式筛选数据
vctooth = df[df['supp'] == 'VC']['len']
ojtooth = df[df['supp'] == 'OJ']['len']

# 创建并排子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 绘制维生素C组直方图
ax1.hist(vctooth, bins=bins, edgecolor='black')
ax1.set_title('豚鼠牙齿生长长度\n给药方式:维生素C')
ax1.set_xlabel('生长长度')
ax1.set_ylabel('频数')
ax1.set_ylim(0, 10)

# 绘制橙汁组直方图
ax2.hist(ojtooth, bins=bins, edgecolor='black')
ax2.set_title('豚鼠牙齿生长长度\n给药方式:橙汁')
ax2.set_xlabel('生长长度')
ax2.set_ylabel('频数')
ax2.set_ylim(0, 10)

# 调整布局避免重叠
plt.tight_layout()
plt.show()

关键说明

  • bins参数用于自定义直方图的区间范围,可根据需求修改区间的数量和边界;
  • 通过df[df['supp'] == 'VC']筛选数据比按行索引更可靠,避免数据顺序变化导致错误;
  • 设置ylim(0,10)和R代码保持一致,确保纵轴范围匹配预期效果。

内容的提问来源于stack exchange,提问作者cinnamond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:51:20