创建参考 y 值的垂直堆叠条形图(岩性/地层柱)

2023-12-09

我想制作一个堆积条形图,其中:

y axis : md litho
x axis : litho

数据:

enter image description here

我已经尝试使用我修改过的代码来实现它另一个问题在堆栈溢出上。

path = pd.ExcelFile('F:\Backup\JN\Litologi\lito.xlsx')
data = pd.read_excel(path)
lito = data['litho']
d2 = {'ABT': 1, 'AT': 2, 'BAT': 3, 'BTT':4, 'GT':5, 'NC':6, 'TT':7}
litocode = lito.map(d2)

ccc = ['firebrick','red', 'peru', 'salmon', 'maroon', 'ghostwhite','pink']
cmap_facies = colors.ListedColormap(ccc[0:len(ccc)], 'indexed')

cluster = np.repeat(np.expand_dims(litocode.values, 1), 1, 1)
print(cluster)
f, ax = plt.subplots(nrows=1, ncols=1, figsize=(1,5))

depth = data['md litho']

ax.imshow(cluster, interpolation='none', aspect='auto', cmap=cmap_facies, 
vmin=1, vmax=7, extent=[0,7 ,np.max(depth),np.min(depth)])

plt.tick_params(bottom=False, labelbottom=False)

hands = []
for k, col in zip(d2.keys(), ccc):
    hands.append(mpatches.Patch(color=col, label=k))
plt.legend(handles=hands, loc=(1.05, 0.5), fontsize=12)

上面的代码产生了下图。但我注意到,根据光刻列中的数据数量,y 轴被均匀地 (0 - 442) 分为 7 个数据簇,但没有考虑 y 值 (md 光刻)。

enter image description here

所以问题是:如何使图形看起来像上面那样,但具有这种间隔,其中每个间隔都被特定颜色阻挡/填充:

Interval = key (color)
0-31 = NC (ghostwhite)
31-49 = AT (red)
49-67 = BTT (salmon)
67-406 = NC (ghostwhite)
406-427 = ABT (firebrick)
427-442 = BAT (peru)

每当我在 Excel 中有数据时,如下所示,

enter image description here

与文件中具有最长行的其他列(本例中为 mbt 数据组)相比,光刻数据组(md、elev、litho)更短或更少,它显示:

ValueError: x and y arguments to pcolormesh cannot have non-finite values or be of type numpy.ma.core.MaskedArray with masked values

我认为脚本以某种方式读取了光刻数据组的整列,直到 mbt 数据组后面的最大行,即使它什么也没有。

我可以做什么来解决这个问题? 我已经尝试将数据移动到其他列,但它不起作用。 我还尝试使用我读入的脚本来屏蔽这些值pcolormesh 缺少值?但它仍然不起作用。

Z=well['litho'][:-1].map(lithcode).to_numpy().reshape(-1, 1)
Zm = ma.array(Z,mask=np.isnan(Z))
cl.pcolormesh([0, 1], well['elev litho'], Zm, cmap=cmap, vmin=1, vmax=len(colors))
    

A pcolormesh是一个矩形网格,其中可以将各个高度分配给行(和列)。第一个参数为pcolormesh是 x 轴上的网格边界,第二个是 y 轴上的网格边界。这样的网格需要比值多一行和一列,因此 x 方向 2 个,y 方向 7 个1x6 mesh.

这些值需要存储在矩阵中(第三个参数)。要创建矩阵,需要执行以下步骤:

  • df['litho']是字符串列表
  • [:-1]获取除最后一个元素之外的所有元素
  • .map(d2)将字符串映射到数字
  • .to_numpy()将 pandas 系列转换为 numpy 数组
  • .reshape(-1, 1)将一维数组转换为二维数组,其中行数等于一维数组的长度 (-1意思是:使一维和二维数组具有相同数量的元素所需的数量)且列数为1

注意vmin and vmax需要显式设置,因为并非所有可能的值都存在于矩阵中。

对于图形大小,使用更容易面向对象的接口, using fig and ax代替plt.. fig, ax = plt.subplots(...)允许设置大小,还可以创建多个子图。

除了图形尺寸之外,还可以设置“ax”(内部图)的纵横比。在下面的示例中,纵横比为0.01使用,这意味着 y 轴上的 442 个单位将占用与 x 轴上 1 个单位的 100 倍相同的像素数。

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.patches import Patch
import pandas as pd

df = pd.DataFrame({'md litho': [0, 31, 49, 67, 406, 427, 442],
                   'litho': ['NC', 'AT', 'BTT', 'NC', 'ABT', 'BAT', 'NC']})

d2 = {'ABT': 1, 'AT': 2, 'BAT': 3, 'BTT': 4, 'GT': 5, 'NC': 6, 'TT': 7}
colors = ['firebrick', 'red', 'peru', 'salmon', 'maroon', 'ghostwhite', 'pink']
cmap = ListedColormap(colors)

fig, ax = plt.subplots(figsize=(6, 4))
ax.pcolormesh([0, 1], df['md litho'], df['litho'][:-1].map(d2).to_numpy().reshape(-1, 1),
              cmap=cmap, vmin=1, vmax=len(colors))
ax.set_xticks([])  # hide ticks on the x-axis
ax.set_yticks(df['md litho'])  # optionally set the y-ticks to indicate the row borders
ax.set_aspect(0.01)
hands = [Patch(color=col, label=k) for k, col in zip(d2.keys(), colors)]
ax.legend(handles=hands, bbox_to_anchor=(1.03, 1.02), loc='upper left', fontsize=12, facecolor='lightgrey')
plt.tight_layout()  # this fits the legend and the labels nicely into the figure
plt.show()

resulting plot

PS: Use ax.invert_yaxis()顶部为零。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建参考 y 值的垂直堆叠条形图(岩性/地层柱) 的相关文章

随机推荐

  • Tkinter 和多线程

    我使用以下代码来检查 Tkinter 是否与多线程一起工作 但是下面的代码不起作用 Gui一运行就没有响应 谁能解释一下为什么它不起作用 from threading import Thread import tkinter as tk w
  • HashMap 应该是未排序的,但仍然根据键排序

    根据这些 http docs oracle com javase 6 docs api java util HashMap html HashMap LinkedHashMap 和 TreeMap 的区别 java初学者 如何在哈希图中对键
  • Pygame 显示无响应

    因此 我尝试为使用精灵进行 X 和 Y 运动的基本 2D Python 游戏创建基础 然而 尽管这里的代码试图screen fill and screen blit playerX 50 playerY 50 player pygame i
  • 帆蓝图生命周期

    我需要向结果添加一些额外的数据find蓝图 我找到了这个解决方案 module exports find function req res return sails hooks blueprints middleware find req
  • 在 Visual Studio 中引用 system.management.automation.dll

    我开始研究 PowerShell 模型和管理单元开发 我注意到的第一件事是引用 System management automation dll 然而 在 Visual Studio 中 NET 选项卡没有该程序集 也无法浏览到 C win
  • 如何刷新Google地图中的坐标?

    我可以在点击刷新按钮时刷新谷歌地图 但它显示的是旧坐标 在某些区域 它显示矩形图像 其中有十字图像 错误在哪里或者我必须对其进行哪些修改 这是我的代码 public class GmapActivity extends MapActivit
  • Julia:为什么共享内存多线程没有给我带来加速?

    我想在 Julia 中使用共享内存多线程 正如 Threads threads 宏所做的那样 我可以使用 ccall jl threading run 来执行此操作 虽然我的代码现在并行运行 但我没有获得预期的加速 以下代码旨在作为我正在采
  • 是否可以保证使用 @PostConstruct 注解的方法先于同一 bean 中使用 @Scheduled 的方法执行?

    假设我正在定义一个缓存 bean 它将在应用程序启动时初始化 并以固定的时间间隔刷新 如下所示 Component public class Cache PostConstruct public void initializeCache S
  • 如何检查没有。使用 MYSQLI_STMT_PREPARE 和 MYSQLI_FETCH_ARRAY 时返回的行数?

    我以为我可以用MYSQLI STMT NUM ROWS and MYSQLI STMT STORE RESULT检查是否有 返回的行数 参见注释行 1 2 3 但在下面的上下文中似乎并非如此 此代码确实有效 没有注释行 但我试图添加额外的检
  • python 按周或月分割 pandas 数据框,并根据这些 sp 对数据进行分组

    DateOccurred CostCentre TimeDifference 03 09 2012 2073 28138 03 09 2012 6078 34844 03 09 2012 8273 31215 03 09 2012 8367
  • Pandas 在读取 CSV 之前忽略前几行

    我正在使用 Pandas 库和 Python 我有一个 Excel 文件 在 Excel 工作表的顶部有一些标题信息 我不需要这些信息来提取数据 但是 标题信息可能需要更长的行 因此无法预测它有多长 所以 我的数据提取应该从 ID 的地方开
  • 从基础模块调用动态特征代码

    我试图实现一个动态功能 从我的基本模块中我应该调用该功能中的一些方法 但它只能从该功能中调用基本方法 有什么方法可以使功能代码从基本模块访问 我了解未安装功能时会发生什么 我已经使用默认的谷歌文档实现了它 所以我没有不同的代码或实现 今天没
  • 在r中使用read_csv导入多个csv文件

    我有一个包含多个 csv 文件名称的向量 library readr data lt c categories csv customers csv employees csv employee territories csv order d
  • InternalsVisibleTo 属性不起作用

    我正在尝试使用InternalsVisibleToassembly 属性 使 NET 类库中的内部类对我的单元测试项目可见 由于某种原因 我不断收到一条错误消息 MyClassName 由于其保护级别而无法访问 两个程序集都已签名 并且我在
  • 将表单结果从联系表单 7 导出到 PDF (fPDF)

    我正在尝试将用户在 WordPress 中的联系表单 7 中输入的值通过 fpdf 导出为 PDF 这就是我所设置的 我可以生成 PDF 但没有从表单动态生成的值 函数 php add action wpcf7 before send ma
  • 角度 $setPristine() 不起作用

    我正在尝试使用 Angular 的内置表单函数 特别是setPristine 清除用户提交时的表单 我的控制器可以访问 scope newForm 我的形式 及其所有方法 但正在运行 scope newForm setPristine 没有
  • Stringify C 预处理器

    这是我的第一篇文章 所以如果我太含糊或提供了每个人都会直观地假设的信息 请告诉我 我对写作很陌生C我只是想更好地了解预处理 我正在编写一个简单的程序 可以使用直接从控制台接收参数gcc Wall std c99 DSEED argument
  • 如何在 JFreechart 中获取点的菱形形状

    我需要在 JFreechart 中的时间序列上获得 A 菱形形状 但我无法做到这一点 有人可以指导应该在下面的代码中添加哪些代码来实现钻石形状点以及如何更改线条的颜色吗 该程序使用 rs 和 stmt 以及其他从数据库派生并在其他地方定义的
  • Firebase 实时数据库写入/上传数据是否收费?

    还有一个问题与这个类似here 但答案并不能满足我的问题 我具体询问实时数据库中的写入操作 我知道读取 下载将被计费 但是 那实时定价没有提到 上传 或 写入 它只提到 下载 存储和同时连接 但是上传 又名写入 怎么样 这是否意味着它是免费
  • 创建参考 y 值的垂直堆叠条形图(岩性/地层柱)

    我想制作一个堆积条形图 其中 y axis md litho x axis litho 数据 我已经尝试使用我修改过的代码来实现它另一个问题在堆栈溢出上 path pd ExcelFile F Backup JN Litologi lito