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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:55:10