I have a soil property data with depth in different x points. 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. However, in my case, I had a trouble and couldn't manage to draw a contourf 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. There are a lot of missing values for z (parameter) so the graph doesn't look too nice.
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. You can use np.repeat
to create a list (or 1D array) of chainage
s with the same length as the depth
s. Just looping through the depth
s and the parameter
s to create the corresponding lists.
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. The left plot shows the corresponding contour plot.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.