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

如何用Matplotlib高效绘制地层柱状图?Rectangle方法过于繁琐

地层柱状图绘制优化方案

不用matplotlib.patches.Rectangle逐个绘制的话,推荐先合并连续的同岩性地层段,再用更简洁的批量绘制方法,以下是两种可行方案:

步骤1:预处理数据,合并连续岩性段

首先把连续相同岩性的深度段提取出来,避免重复绘制:

import numpy as np

depth = [1,2,3,4,5,6,7,8,9,10] # 地下深度(英尺)
lithotype = [4,4,4,5,5,5,6,6,6,2] # 岩性类型:4=粘土,6=砂土,2=粉土

# 提取连续岩性段:(岩性, 顶部深度, 底部深度)
groups = []
current_litho = lithotype[0]
start_idx = 0

for i in range(1, len(lithotype)):
    if lithotype[i] != current_litho:
        groups.append((current_litho, depth[start_idx]-1, depth[i-1]))
        current_litho = lithotype[i]
        start_idx = i
groups.append((current_litho, depth[start_idx]-1, depth[-1]))

# 定义岩性-颜色映射
litho_colors = {
    4: "#8B4513",  # 粘土:棕色
    5: "#D2B48C",  # 未定义岩性:黄褐色
    6: "#F5DEB3",  # 砂土:浅黄色
    2: "#C0C0C0"   # 粉土:灰色
}

方案1:使用barh绘制水平条形图

地层柱状图本质是垂直方向的堆叠条形,用barh可以快速批量绘制:

import matplotlib.pyplot as plt

plt.figure(figsize=(2, 8))
x_center = 0.5  # 柱状图的x轴中心位置
bar_width = 1   # 柱状图宽度

for litho, top, bottom in groups:
    # 绘制单个地层段:y为顶部深度,高度为地层厚度
    plt.barh(y=top, width=bar_width, height=bottom - top, 
             color=litho_colors[litho], edgecolor="black")

# 调整坐标轴:y轴反转(深度向下为正),隐藏x轴刻度
plt.ylim(max(depth), 0)
plt.xlim(0, bar_width)
plt.xticks([])
plt.ylabel("Depth (feet)")
plt.title("Stratigraphic Column")

plt.show()

方案2:使用fill_between填充区域

如果不需要条形的边框样式,用fill_between更简洁:

import matplotlib.pyplot as plt

plt.figure(figsize=(2, 8))
x_range = [0, 1]  # 柱状图的x轴范围

for litho, top, bottom in groups:
    # 填充x_range内、top到bottom之间的区域
    plt.fill_between(x_range, top, bottom, 
                     color=litho_colors[litho], edgecolor="black")

# 同样调整坐标轴
plt.ylim(max(depth), 0)
plt.xlim(0, 1)
plt.xticks([])
plt.ylabel("Depth (feet)")
plt.title("Stratigraphic Column")

plt.show()

补充:用Pandas简化分组

如果习惯用Pandas,可以用groupby快速合并连续岩性段:

import pandas as pd

df = pd.DataFrame({"depth": depth, "lithotype": lithotype})
# 生成连续岩性的组标签
df["group"] = (df["lithotype"].diff() != 0).cumsum()
# 分组计算每个段的顶部、底部深度
grouped = df.groupby("group").agg(
    lithotype=("lithotype", "first"),
    top=("depth", lambda x: x.min() - 1),
    bottom=("depth", "max")
)
# 后续绘制逻辑和上面一致,直接遍历grouped的行即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:50:39