简体   繁体   English

Matplotlib 轮廓不规则数据

[英]Matplotlib Contourf with Irregular Data

I have a soil property data with depth in different x points.我有一个深度在不同 x 点的土壤特性数据。 The borehole data are not in equal depth or number, so I have to standardize the code.钻孔数据的深度或数量不相等,因此我必须标准化代码。 If all boreholes have same number of data and depth, no problem, np.meshgrid will work fine.如果所有钻孔具有相同数量的数据和深度,没问题,np.meshgrid 可以正常工作。 However, in my case, I had a trouble and couldn't manage to draw a contourf plot.但是,就我而言,我遇到了麻烦,无法绘制轮廓 plot。

Is it not possible or do I do something wrong?这是不可能的还是我做错了什么?

input_data = {
    "BH1": {
        "Chainage": 50,
        "Depth": [2, 3, 4, 5, 6,7,10],
        "Parameter": [10, 5, 12, 56, 34,45,62],
    },
    "BH2": {"Chainage": 0, "Depth": [2, 3, 4, 5, 6, 18], "Parameter": [2, 4, 12, 23, 12, 33]},
    "BH3": {
        "Chainage": -50,
        "Depth": [2, 3, 4, 5, 6, 9],
        "Parameter": [12, 14, 22, 33, 32, 70],
    },
}

import numpy as np
import matplotlib.pyplot as plt

#PREPROCESSING OF DATA

depth_lengths = []
for i in input_data.keys():
    depth_lengths.append(len(input_data[i]["Depth"]))

max_depth_length = max(depth_lengths)

for i in input_data.keys():
    while len(input_data[i]["Depth"]) < max_depth_length:
        input_data[i]["Depth"].append(None)
        input_data[i]["Parameter"].append(None)

parameter = []

for i in range(max_depth_length):
    temp = []
    for j in input_data.keys():
        temp.append(input_data[j]["Parameter"][i])
    parameter.append(temp)    
    
        
depth = []
chainage = []
parameter2 = []
for i in input_data.keys():
    for j in input_data[i]["Depth"]:
        depth.append(j)
    for j in input_data[i]["Parameter"]:
        parameter2.append(j)
    chainage.append(input_data[i]["Chainage"])
        
# X, Y = np.meshgrid(chainage, depth)

parameter2 = np.array(parameter2*3).reshape(-1,3)


fig,ax=plt.subplots()
ax.contourf(X, Y, parameter2, 8, alpha=.75, cmap='jet')

Not sure if this is what you intended, but this generates a filled contour plot using your data.不确定这是否是您想要的,但这会使用您的数据生成填充轮廓 plot。 There are a lot of missing values for z (parameter) so the graph doesn't look too nice. z(参数)有很多缺失值,所以图表看起来不太好。

X=     [[50,-50,-50,-50,-50,-50,-50,-50,-50],
        [0,   0,  0,  0,  0,  0, 0, 0, 0],
        [50, 50, 50, 50, 50, 50, 50, 50, 50]]
Y=     [[2, 3, 4, 5, 6, 7, 9, 10, 18],
        [2, 3, 4, 5, 6, 7, 9, 10, 18],
        [2, 3, 4, 5, 6, 7, 9, 10, 18]]
z= 3*np.array([[12, 14, 22, 33, 32, np.NaN, 70, np.NaN, np.NaN],
    [2, 4, 12, 23, 12, np.NaN, np.NaN, np.NaN, 33],
    [10, 5, 12, 56, 34,45,np.NaN,  62, np.NaN]])

plt.contourf(X, Y, z, 8, alpha=.75, cmap='jet')
plt.show()

For data that isn't organized on a regular grid, tricontourf creates a contour plot by connecting the input point via triangles.对于未按规则网格组织的数据, tricontourf通过三角形连接输入点来创建轮廓 plot。 You can use np.repeat to create a list (or 1D array) of chainage s with the same length as the depth s.您可以使用np.repeat创建长度与depth s 相同的chainage数列表(或一维数组)。 Just looping through the depth s and the parameter s to create the corresponding lists.只需遍历depth s 和parameter s 即可创建相应的列表。

import matplotlib.pyplot as plt
import numpy as np

input_data = {"BH1": {"Chainage": 50,
                      "Depth": [2, 3, 4, 5, 6, 7, 10],
                      "Parameter": [10, 5, 12, 56, 34, 45, 62]},
              "BH2": {"Chainage": 0,
                      "Depth": [2, 3, 4, 5, 6, 18],
                      "Parameter": [2, 4, 12, 23, 12, 33]},
              "BH3": {"Chainage": -50,
                      "Depth": [2, 3, 4, 5, 6, 9],
                      "Parameter": [12, 14, 22, 33, 32, 70]}}
chainage = np.repeat([v["Chainage"] for v in input_data.values()], [len(v["Depth"]) for v in input_data.values()])
depth = [d for v in input_data.values() for d in v["Depth"]]
parameter = [p for v in input_data.values() for p in v["Parameter"]]

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(16, 5))
ax1.tricontourf(chainage, depth, parameter, levels=8, alpha=.75, cmap='jet')
ax2.scatter(chainage, depth, c=parameter, cmap='jet')

plt.show()

The plot on the right shows the input, colored as a scatter plot.右侧的 plot 显示输入,颜色为散点 plot。 The left plot shows the corresponding contour plot.左边的 plot 显示了对应的轮廓 plot。

结果图

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM