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

Matplotlib中基于列值偏移岩心堆叠柱状图底部(仅起始段)

修正地质岩心堆叠柱状图的起始偏移与层厚问题

问题分析

你的核心问题出在两处错误:

  • 错误地给height添加额外的0.9,人为扭曲了真实层厚
  • bottom参数误用了层的底部深度,而非层的顶部深度,导致柱子堆叠位置逻辑混乱

正确的逻辑应该是:

  • 沉积物层的顶部深度(mbsl)= 海底深度(mbsl) + 层相对于海底的顶部深度(top)
  • 真实层厚 = 层的底部相对深度(bottom) - 层的顶部相对深度(top)
  • 柱状图的bottom参数应设为层的顶部深度(mbsl),height设为真实层厚,适配倒置y轴的深度表示(从上到下数值增大)

修正后代码

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 假设数据已加载到df中,按CoreID分组
grouped = df.groupby('CoreID')

fig, ax = plt.subplots(figsize=(5, 7))
# 跟踪已添加的图例,避免重复
seen_labels = set()

for coreID, group in grouped:
    for index, row in group.iterrows():
        # 计算层的顶部深度(mbsl):海底深度 + 层相对顶部深度
        layer_top_mbsl = row['mbsl'] + row['top']
        # 计算真实层厚
        layer_thickness = row['bottom'] - row['top']
        # 绘制柱子:bottom为层顶部深度,height为真实层厚
        bar = ax.bar(x=coreID, height=layer_thickness, 
                     bottom=layer_top_mbsl, 
                     color=row['color'], edgecolor=row['color'])
        
        # 处理重复图例
        if row['Lith'] not in seen_labels:
            ax.legend([bar], [row['Lith']], loc='upper right')
            seen_labels.add(row['Lith'])

plt.xlabel('Core ID')
plt.ylabel('Depth (mbsl)')
plt.title('Fence Diagram')
plt.xticks(df['CoreID'].unique())
# 倒置y轴,符合地质深度的常规表示
plt.gca().invert_yaxis()

plt.tight_layout()
plt.show()

关键修正说明

  1. 层厚还原:直接使用row['bottom'] - row['top']获取真实层厚,不再添加额外偏移值
  2. 起始位置校准:用row['mbsl'] + row['top']作为bottom参数,确保每个岩心从对应海底深度开始堆叠
  3. 图例优化:通过seen_labels集合避免重复添加相同岩性的图例
  4. 保留数据间隙:基于原始top和bottom值绘图,数据中存在的间隙会自然保留

模拟数据效果验证

以你提供的模拟数据为例:

  • Core 1 会从21.24m(mbsl)起始,依次堆叠厚度为0.01m的黄色、绿色层
  • Core 2 会从17.92m(mbsl)起始,堆叠相同结构的层
  • 所有层的厚度保持原始数据的真实值,起始位置准确匹配各自的海底深度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:37:33