基于Pandas DataFrame绘制染色体len_PIs值的重叠/非重叠直方图
解决Pandas DataFrame的两个直方图绘制需求
我来帮你一步步搞定这两个直方图绘制任务,直接上可运行的代码和清晰解释,让你快速落地!
1. 从(列、行)对的列表值绘制直方图
假设你有一个Pandas DataFrame,还有一个包含(列名,行索引)元组的列表,需要提取这些位置的数值来绘制直方图。咱们先构造一个示例场景,再写代码:
步骤示例
import pandas as pd import matplotlib.pyplot as plt # 构造示例DataFrame df = pd.DataFrame({ 'A': [10, 20, 30, 40], 'B': [15, 25, 35, 45], 'C': [5, 15, 25, 35] }, index=['row1', 'row2', 'row3', 'row4']) # 定义(列、行)对的列表 coords = [('A', 'row2'), ('B', 'row3'), ('C', 'row1'), ('A', 'row4'), ('B', 'row2')] # 提取对应位置的数值 values = [df.loc[row, col] for col, row in coords] # 绘制直方图 plt.figure(figsize=(8, 5)) plt.hist(values, bins=5, edgecolor='black', alpha=0.7) plt.title('Histogram of Values from (Column, Row) Pairs') plt.xlabel('Value') plt.ylabel('Frequency') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
关键说明
- 用
df.loc[row, col]精准定位DataFrame中的单元格值,注意顺序是行在前,列在后(如果你的元组是(列,行)的话,要对应调整) bins参数可以根据数据分布调整,让直方图展示更合理edgecolor和alpha是为了让直方图更美观,便于区分柱形
2. 按chrom分组绘制len_PIs的重叠/非重叠直方图
假设你的DataFrame包含chrom(染色体编号)和len_PIs(目标数值列),需要针对每个chrom的len_PIs值,分别绘制重叠式(同一画布不同颜色)和非重叠式(子图分开)的直方图。
先构造示例数据
import seaborn as sns import numpy as np # 构造示例DataFrame:模拟3条染色体的len_PIs数据 np.random.seed(42) df = pd.DataFrame({ 'chrom': np.repeat(['chr1', 'chr2', 'chr3'], 100), 'len_PIs': np.concatenate([ np.random.normal(50, 10, 100), np.random.normal(70, 12, 100), np.random.normal(60, 8, 100) ]) })
2.1 重叠式直方图(同一图展示所有chrom)
plt.figure(figsize=(10, 6)) # 遍历每个chrom,绘制直方图并设置不同颜色 for chrom, group in df.groupby('chrom'): plt.hist(group['len_PIs'], bins=15, edgecolor='black', alpha=0.5, label=chrom) plt.title('Overlapping Histogram of len_PIs by Chromosome') plt.xlabel('len_PIs Value') plt.ylabel('Frequency') plt.legend(title='Chromosome') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
2.2 非重叠式直方图(子图分开展示)
# 获取唯一的chrom列表 chroms = df['chrom'].unique() n_chroms = len(chroms) # 创建子图布局:比如1行n列,或者根据数量调整 fig, axes = plt.subplots(1, n_chroms, figsize=(15, 5), sharey=True) # 遍历每个chrom和对应的子图 for ax, chrom in zip(axes, chroms): group = df[df['chrom'] == chrom] ax.hist(group['len_PIs'], bins=15, edgecolor='black', alpha=0.7) ax.set_title(f'Chromosome {chrom}') ax.set_xlabel('len_PIs Value') if ax == axes[0]: ax.set_ylabel('Frequency') plt.tight_layout() plt.show()
关键说明
- 用
groupby('chrom')可以快速按染色体分组处理数据 - 重叠式用
alpha设置透明度,避免柱形完全遮挡 - 非重叠式用
sharey=True让子图共享y轴刻度,便于对比不同染色体的频率分布 - 如果染色体数量多,可以调整子图布局(比如2行多列),只需要修改
subplots的参数即可
内容的提问来源于stack exchange,提问作者everestial
相关产品推荐
相关产品推荐

