如何在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
相关产品推荐
相关产品推荐

