import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.facecolor"] = "none"
plt.rcParams["axes.facecolor"] = "none"
def boxplot(x):
x = np.sort(x)
n = x.size
Q1 = x[int(0.25*n)]
Q2 = x[int(0.50*n)]
Q3 = x[int(0.75*n)]
IQR = Q3 - Q1
nol = (x < Q3 + 1.5*IQR) * (x > Q1 - 1.5*IQR)
wlo = min(x[nol])
wup = max(x[nol])
fig, ax = plt.subplots(figsize = (8,3))
ol = x[nol==False]
ax.plot([Q2],[0],'D',color='black',label='Q2 (Median)')
ax.plot([Q1,Q3],[0,0],'s',color='black',label='Q1 and Q3')
ax.plot([wlo,wup],[0,0],'^',color='black',label='Most extreme non-outliers')
ax.plot(ol,np.zeros(ol.size),'o',color='black',label='Outliers')
ax.fill([Q1,Q1,Q3,Q3],[-1,1,1,-1],color='lightgray')
ax.plot([Q1,Q1,Q3,Q3,Q1],[-1,1,1,-1,-1],linewidth=1,color='black')
ax.plot([Q2,Q2],[-1,1], linewidth=2, color='black')
ax.plot([Q3,wup],[0,0], linewidth=1, color = 'black')
ax.plot([wlo,Q1],[0,0], linewidth=1, color = 'black')
ax.get_yaxis().set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.set_ylim((-2,2))
ax.legend()
plt.show()
ft = np.array([2.5692,2.5936,2.6190,2.6320,2.6345,
2.6602,2.6708,2.6804,2.6850,2.7049,
2.7111,2.8034,2.8300,3.0639,3.1489,
3.2411,3.5701,3.9686,4.1220])
boxplot(ft)