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()
关键修正说明
- 层厚还原:直接使用
row['bottom'] - row['top']获取真实层厚,不再添加额外偏移值 - 起始位置校准:用
row['mbsl'] + row['top']作为bottom参数,确保每个岩心从对应海底深度开始堆叠 - 图例优化:通过
seen_labels集合避免重复添加相同岩性的图例 - 保留数据间隙:基于原始
top和bottom值绘图,数据中存在的间隙会自然保留
模拟数据效果验证
以你提供的模拟数据为例:
- Core 1 会从21.24m(mbsl)起始,依次堆叠厚度为0.01m的黄色、绿色层
- Core 2 会从17.92m(mbsl)起始,堆叠相同结构的层
- 所有层的厚度保持原始数据的真实值,起始位置准确匹配各自的海底深度
内容的提问来源于stack exchange,提问作者Liraell
相关产品推荐
相关产品推荐

