Source code for well_schematics.schematics

import matplotlib.pyplot as plt
from matplotlib import patches as mpatches
from matplotlib import transforms as mtransforms


[docs]def draw_simple( pzone_top, pzone_bottom, casing_top=0, pzone_type="S", ax=None, tight_layout=True, depth_tick_markers=False, ): """Draw simple well schematic. Args: pzone_top (float): top of the production zone pzone_bottom (float): bottom of the production zone casing_top (float): top of the casing pzone_type (str): either "S" for screen, "SC" for slotted casing, or "OH" for open hole. ax (matplotlib.Axes): to draw in tight_layout (bool): run tight_layout() on ax.figure to rearrange things to fit. depth_tick_markers (bool): show tick markers for the vertical depth axis. Labels will always appear. The simple model used here assumes that a well consists of solid casing of one diameter from top, and then immediately below that, one type of production zone, of the same diameter. Returns: a list of the artists created. """ if ax is None: fig = plt.figure(figsize=(1, 5)) ax = fig.add_subplot(111) t = mtransforms.blended_transform_factory(ax.transAxes, ax.transData) pipe_width = 0.08 casing_bottom = pzone_top casing_height = casing_bottom - casing_top pzone_height = pzone_bottom - pzone_top hatch_density = 3 patches = [] casing_left = mpatches.Rectangle( (1 / 4, casing_top), pipe_width, casing_height, facecolor="k", transform=t ) casing_right = mpatches.Rectangle( (3 / 4 - pipe_width, casing_top), pipe_width, casing_height, facecolor="k", transform=t, ) patches += [casing_left, casing_right] if pzone_type != "OH": if pzone_type == "S": hatch = "-" * hatch_density elif pzone_type == "SC": hatch = "/" * hatch_density pzone_left = mpatches.Rectangle( (1 / 4, pzone_top), pipe_width * 0.9, pzone_height, facecolor="k", fill=False, hatch=hatch, transform=t, ) pzone_right = mpatches.Rectangle( (3 / 4 - pipe_width, pzone_top), pipe_width * 0.9, pzone_height, facecolor="k", fill=False, hatch=hatch, transform=t, ) patches += [pzone_left, pzone_right] for patch in patches: ax.add_artist(patch) ax.grid(False) for side in ["left", "right", "bottom", "top"]: ax.spines[side].set_visible(False) if not depth_tick_markers: ax.yaxis.set_ticks_position("none") ax.set_facecolor("white") ax.set_xticks([]) ax.set_xlim(0, 1) ax.set_ylim(pzone_bottom + 1, casing_top - 1) if tight_layout: ax.figure.tight_layout() return patches