Spaces:
Sleeping
Sleeping
File size: 7,767 Bytes
50bf100 446b05f 50bf100 446b05f 50bf100 446b05f 50bf100 526192e 50bf100 526192e 50bf100 446b05f 50bf100 446b05f 50bf100 446b05f 50bf100 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
import numpy as np
import pandas as pd
import streamlit as st
import matplotlib.pyplot as plt
import warnings
from matplotlib.patches import Ellipse
warnings.simplefilter("ignore")
import matplotlib as mpl
color_seq = np.array(['grey', 'blue', 'green', 'yellow', 'orange', 'red', 'purple', 'purple'])
cog = np.array([-99, 0., 1.0, 1.5, 2.0, 2.5, 3.0, 3.0001])
cmap = mpl.colors.ListedColormap(color_seq)
norm = mpl.colors.BoundaryNorm(cog, cmap.N)
#@st.cache
def get_text_block(fname):
# this is how to read a block of text:
path = ""
f = open(fname, "r")
# and then write it to the app
return f.read();
def rotate(pts, rot):
c = np.cos(np.radians(rot))
s = np.sin(np.radians(rot))
rotmat = np.array([[c, -s], [s, c]])
pts = np.dot(pts, rotmat)
return pts;
def plot_samps(df, plot_contour=True):
aniso = (300.) / (750.)
fig, ax = plt.subplots(figsize=(15, 15 * aniso * 0.8))
if plot_contour:
xx, yy = dgrid(1.)
rbfi = Rbf(df.YPT, df.ZPT, df.AU_G_T, function='cubic')
zz = rbfi(xx, yy)
ax.contour(xx, yy, zz, cog, colors=color_seq, alpha=0.5)
ax.imshow(zz, origin='lower', extent=(0., 750, 0., 300.), alpha=0.2, cmap=cmap, norm=norm)
scat = ax.scatter(df.YPT, df.ZPT, c=df.AU_G_T, cmap=cmap, norm=norm, edgecolor="black", s=40)
cbar = fig.colorbar(scat, ticks=cog)
cbar.set_label('Au g/t', rotation=0)
plt.xlim((0,750))
plt.ylim((0, 300))
plt.xlabel('X')
plt.ylabel('Y')
return fig, ax;
def block_modelling():
st.title("Block Modelling Exercise")
st.markdown("## **Visual Trend Analysis**")
st.markdown("The figure below is an orthogonal projection of full width intercepts within a narrow vein.")
st.markdown("Prior to any statistical analysis, it is useful just to look at your data." +
" Take it for a spin, look to see where high grades are located and what trends you can observe." +
" When selecting a colour profile, try use a scheme that highlights trends but considers some economic" +
" criteria too. It is always useful to have one or two colour bins below your cut-off grade." +
" The last tip is, be consistent with your legend, make sure the samples and contours/blocks use the" +
" same colour scheme.")
df = pd.read_csv("data//sim_pts.csv")
df = df[df.use==1].copy().reset_index(drop=True)
# fig, ax = plot_samps(df)
# st.pyplot(fig)
st.image("images//contour.jpg", use_column_width=True)
#-----------------------------------------------------------------------------------------------------------------#
# Variogram
# ----------------------------------------------------------------------------------------------------------------#
st.markdown("## **Variogram Activity**")
st.markdown("The omni-directional variogram is given in the chart that follows." +
" Keep in mind that no direction has been chosen and that the range shown will be shorter than" +
" the longest direction and longer than the shortest direction. Your job is to estimate the range" +
" in the longest direction given your observations from the plot above.")
st.image("images//interp_var.jpg")
var_options = ["Select and Answer",
"Major = 75m, Semi-Major = 75m",
"Major = 125m, Semi-Major = 60m",
"Major = 75m, Semi-Major = 100m",
"Major = 150m, Semi-Major = 75m"]
st.radio("What is you estimate of the major and semi major direction ranges?", options=var_options, key='vv1')
#-----------------------------------------------------------------------------------------------------------------#
# Set up search ellipse
# ----------------------------------------------------------------------------------------------------------------#
st.markdown("## **Search Ellipse Activity**")
# scol1, scol2 = st.beta_columns((1, 1))
# with scol1:
st.markdown('#### Ellipse Shape')
rot = st.number_input('Pick a Rotation (-360 to 360)', min_value=-360., max_value=360., value=0., step=5., key=1)
rot = (360. - rot)
srange_major = st.number_input('Major Axis Range', min_value=10., max_value=500., value=100., step=5., key=2)
srange_minor = st.number_input('Semi-Major Axis Range', min_value=10., max_value=500., value=100., step=5., key=3)
# with scol2:
# st.markdown('#### Sample Selection')
# min_samps = st.number_input("Minimum Samples", min_value=1, max_value=40, value=2, step=1)
# max_samps = st.number_input("Maximum Samples", min_value=1, max_value=40, value=10, step=1)
fig, ax = plot_samps(df, plot_contour=False)
e = Ellipse(xy=[350, 150], width=srange_minor * 2, height=srange_major * 2, angle=rot, linewidth=2)
ax.add_artist(e)
e.set_facecolor('None')
e.set_edgecolor('black')
st.pyplot(fig)
src_options = ["Select an Answer",
"Major = 75m, Semi-Major = 75m, Rotated by 90, Min 2 Max 40",
"Major = 125m, Semi-Major = 60m, Rotated -60 towards South East, Min 3 Max 12",
"Major = 125m, Semi-Major = 60m, Rotated 20 towards South West, Min 2 Max 12",
"Major = 150m, Semi-Major = 75m, Min 2 Max 10, No Rotation"]
st.radio("Select the appropriate search parameters?", options=src_options, key='ss1')
st.markdown("## **Guess the Model: Question 1**")
st.markdown("The interpolations given below are Nearest Neighbour (NN), Inverse Distance (ID) and Ordinary Kriging (OK) respectively")
st.markdown("The curves increasing to the right on the grade tonnage curves are the grades foe each technique at different cut-offs.")
scol1, scol2 = st.beta_columns((1, 1))
with scol1:
st.image("images//interp_ests_q1.jpg", use_column_width=True)
with scol2:
st.write("")
st.write("")
st.write("")
st.write("")
st.write("")
st.write("")
st.write("")
st.write("")
st.write("")
st.write("")
st.image("images//interp_gt_q1.jpg", use_column_width=True)
gt_options = ["Select an Answer",
"Light blue is NN, purple is OK and red is ID",
"Light blue is NN, purple is ID and red is OK",
"Light blue is OK, purple is NN and red is ID",
"Light blue is OK, purple is ID and red is NN"]
st.radio("Which lines on the gt_curve belong to which estimate?", options=gt_options, key='gg1')
st.text("Any additional comments?")
st.markdown("## **Guess the Model: Question 2**")
st.markdown("Use your knowledge gained to decipher the mystery of the images below.")
st.markdown("What we know:")
st.markdown("* ID squared was used for one estimate and OK for another")
st.markdown("* Identical search parameters were used")
st.markdown("* The variogram has nugget of around 0.3 and most of the variability is accounted for within about 20-30m.")
st.image("images//interp_OK_q2.jpg")
st.image("images//interp_ID_q2.jpg")
est_options = ["Select an Answer",
"Estimate A is more variable than estimate B. Estimate A is OK and Estimate B is ID",
"Estimate B is more variable than estimate B. Estimate A is OK and Estimate B is ID",
"Both estimates have equal variances as they use the same sample data. Estimate A is OK and Estimate B is ID",
"Estimate B is more variable than estimate A. Estimate A is ID and Estimate B is OK",]
st.radio("Select the correct statement", options=est_options, key='est1')
|