3D plot
parent
1b8018496d
commit
419bd20092
@ -1 +1 @@
|
|||||||
main_2.py
|
creat_3d.py
|
@ -0,0 +1,385 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Form</class>
|
||||||
|
<widget class="QWidget" name="Form">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>790</width>
|
||||||
|
<height>757</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="data_file_lineEdit">
|
||||||
|
<property name="placeholderText">
|
||||||
|
<string>请导入数据文件</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="chose_datafile_button">
|
||||||
|
<property name="text">
|
||||||
|
<string>选择文件</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="well_file_lineEdit">
|
||||||
|
<property name="placeholderText">
|
||||||
|
<string>请导入井文件</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="chose_wellfile_button">
|
||||||
|
<property name="text">
|
||||||
|
<string>选择文件</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>levels:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDoubleSpinBox" name="level_chose">
|
||||||
|
<property name="decimals">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>100.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="colorbar_chose">
|
||||||
|
<property name="placeholderText">
|
||||||
|
<string>colorbar选择</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_5">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>包围盒</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_7">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="all_axes">
|
||||||
|
<property name="text">
|
||||||
|
<string>轴</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_12">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>轴字体</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="axes_wordsize">
|
||||||
|
<property name="value">
|
||||||
|
<number>8</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_10">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="axes_length">
|
||||||
|
<property name="text">
|
||||||
|
<string>轴长</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="scatter_density">
|
||||||
|
<property name="text">
|
||||||
|
<string>密度图/散点图</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="len_axes">
|
||||||
|
<property name="text">
|
||||||
|
<string>长轴</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="len_color">
|
||||||
|
<property name="text">
|
||||||
|
<string>长轴颜色</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="short_axes">
|
||||||
|
<property name="text">
|
||||||
|
<string>短轴</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="short_color">
|
||||||
|
<property name="text">
|
||||||
|
<string>短轴颜色</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="over_axes">
|
||||||
|
<property name="text">
|
||||||
|
<string>纵轴</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="over_color">
|
||||||
|
<property name="text">
|
||||||
|
<string>纵轴颜色</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="chose_oilwell_color">
|
||||||
|
<property name="text">
|
||||||
|
<string>油井颜色选择</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="chose_waterwell_color">
|
||||||
|
<property name="text">
|
||||||
|
<string>水井颜色选择</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_8">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>显示水井</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_9">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="center_scale">
|
||||||
|
<property name="text">
|
||||||
|
<string>显示油井</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_3">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="len_view">
|
||||||
|
<property name="text">
|
||||||
|
<string>长轴视图</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="short_view">
|
||||||
|
<property name="text">
|
||||||
|
<string>短轴视图</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_6">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="over_view">
|
||||||
|
<property name="text">
|
||||||
|
<string>俯视图</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="clear_data">
|
||||||
|
<property name="text">
|
||||||
|
<string>清除数据</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGraphicsView" name="graphicsView"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Binary file not shown.
@ -0,0 +1,105 @@
|
|||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from scipy.stats import gaussian_kde
|
||||||
|
from scipy.spatial.distance import cdist
|
||||||
|
import copy
|
||||||
|
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
|
||||||
|
from matplotlib.colors import Normalize
|
||||||
|
import numpy as np
|
||||||
|
from skimage import measure
|
||||||
|
import matplotlib.cm as cm
|
||||||
|
|
||||||
|
class create():
|
||||||
|
def __init__(self):
|
||||||
|
"""
|
||||||
|
data is the x and y coordinate of data.pos
|
||||||
|
contours is the edge points
|
||||||
|
f is the kernel density value
|
||||||
|
levels is the levels for contours
|
||||||
|
x_range is the range of x label
|
||||||
|
y_range is the range of y label
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.data = []
|
||||||
|
self.vertices = []
|
||||||
|
self.faces = []
|
||||||
|
self.levels = []
|
||||||
|
self.x_range = []
|
||||||
|
self.y_range = []
|
||||||
|
|
||||||
|
def data_pre(self, data_name):
|
||||||
|
with open(data_name, 'r') as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
L_en=len(lines)
|
||||||
|
lines= lines[1:L_en]
|
||||||
|
data = []
|
||||||
|
for line in lines:
|
||||||
|
x, y,z,t = line.strip().split("\t")
|
||||||
|
data.append(list(map(float, [x,y,z])))
|
||||||
|
data = np.array(data)
|
||||||
|
self.data = data
|
||||||
|
self.x_range = [min(data[:, 0]), max(data[:,0])]
|
||||||
|
self.y_range = [min(data[:, 1]), max(data[:,1])]
|
||||||
|
self.z_range = [min(data[:, 2]), max(data[:,2])]
|
||||||
|
|
||||||
|
def contours_pre(self, level):
|
||||||
|
|
||||||
|
x = self.data[:, 0]
|
||||||
|
y = self.data[:, 1]
|
||||||
|
z = self.data[:, 2]
|
||||||
|
# 使用scipy库中的gaussian_kde函数计算密度估计
|
||||||
|
k = gaussian_kde(self.data.T)
|
||||||
|
xi, yi, zi = np.mgrid[x.min()*1.5:x.max()*1.5:30j, y.min()*1.5:y.max()*1.5:30j, z.min()-50:z.max()+50:50j]
|
||||||
|
density = k(np.vstack([xi.flatten(), yi.flatten(), zi.flatten()]))
|
||||||
|
self.density =density
|
||||||
|
level = density.max()*level/100
|
||||||
|
|
||||||
|
# 使用 marching_cubes 生成等值面顶点和面
|
||||||
|
verts, faces, _, _ = measure.marching_cubes(density.reshape(xi.shape), level=level)
|
||||||
|
a_0 = (x.max() - x.min()) / (verts[:, 0].max() - verts[:, 0].min())
|
||||||
|
vertices_0 = (verts[:, 0] - verts[:, 0].min()) * a_0 + x.min()-5
|
||||||
|
a_1 = (y.max() - y.min()+10) / (verts[:, 1].max() - verts[:, 1].min())
|
||||||
|
vertices_1 = (verts[:, 1] - verts[:, 1].min()) * a_1 + y.min()-5
|
||||||
|
a_2 = (z.max() - z.min()+10) / (verts[:, 2].max() - verts[:, 2].min())
|
||||||
|
vertices_2 = (verts[:, 2] - verts[:, 2].min()) * a_2 + z.min()-5
|
||||||
|
vertices = np.array([vertices_0, vertices_1, vertices_2]).T
|
||||||
|
self.vertices = vertices
|
||||||
|
self.faces = faces
|
||||||
|
|
||||||
|
|
||||||
|
class well_to_edge():
|
||||||
|
def __init__(self):
|
||||||
|
"""
|
||||||
|
name is used to store the well names
|
||||||
|
type is the types of the wells
|
||||||
|
position is the coordinates of wells
|
||||||
|
min_distance is the minimum distances between wells and edge
|
||||||
|
welltoedge_points is the points responding to the min_distance
|
||||||
|
angle is the angles between the shortest distance direction vector from the well to the edge and the positive direction of the y-axis during clockwise rotation;
|
||||||
|
wells_num: the number of wells
|
||||||
|
"""
|
||||||
|
self.name = []
|
||||||
|
self.type = []
|
||||||
|
self.position = []
|
||||||
|
self.min_distance = []
|
||||||
|
self.welltoedge_points = []
|
||||||
|
self.angle = []
|
||||||
|
self.wells_num = 0
|
||||||
|
|
||||||
|
def wells_name_and_position(self, wells_name):
|
||||||
|
# 读取井位信息
|
||||||
|
with open(wells_name, 'r') as f_j:
|
||||||
|
j_ing = f_j.readlines()
|
||||||
|
points = []
|
||||||
|
typee = []
|
||||||
|
namee = []
|
||||||
|
for line in j_ing:
|
||||||
|
if ('0' or '1') in line:
|
||||||
|
name, x, y, z, type = line.strip().split("\t")
|
||||||
|
if name != 'name':
|
||||||
|
points.append(list(map(float, [x, y, z])))
|
||||||
|
typee.append(list(map(int, [type])))
|
||||||
|
namee.append(name.split('\n'))
|
||||||
|
self.position = points
|
||||||
|
self.name = namee
|
||||||
|
self.type = typee
|
||||||
|
self.wells_num = len(points)
|
Loading…
Reference in New Issue