logfiles_analysis / app_desktop.py
Jasper Siebelink
OC_SVM support
06b052d
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
from tkinter import ttk
from dataset_content import get_data_from_json
from isolation_forest import apply_isolation_forest
from oc_svm import apply_oc_svm
def plot_data(num_dimensions):
rng = np.random.RandomState(42)
X = get_data_from_json()
# Apply algorithm
plotted_result = apply_isolation_forest(rng, X) if combo_box_alg.current() == 0 else apply_oc_svm(X)
# Plotting
fig, ax = plt.subplots(figsize=(10, 7), subplot_kw={'projection': '3d'} if num_dimensions == 3 else {})
if num_dimensions == 3:
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=['red' if pred == -1 else 'blue' for pred in plotted_result], s=50)
ax.set_xlabel("Distance travelled")
ax.set_ylabel("Heartrate")
ax.set_zlabel("Weight")
else:
x_axis = X[:, 0]
y_axis = np.zeros_like(X[:, 0]) if num_dimensions == 1 else X[:, 1]
ax.scatter(x_axis, y_axis, c=['red' if pred == -1 else 'blue' for pred in plotted_result], s=50)
ax.set_xlabel("Distance travelled")
ax.set_ylabel("Heartrate" if num_dimensions > 1 else "")
plt.grid(True)
return fig
# Create the main window
root = tk.Tk()
root.title("Dimension Selector")
def update_plot(event):
num_dimensions = int(combo_box_dim.get()[0])
fig = plot_data(num_dimensions)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas_widget = canvas.get_tk_widget()
canvas_widget.grid(row=1, column=0, columnspan=4)
canvas.draw()
# Dimension selection
combo_box_dim = ttk.Combobox(root, values=("1 Dimension", "2 Dimensions", "3 Dimensions"), state="readonly")
combo_box_dim.grid(row=0, column=1, pady=10)
combo_box_dim.current(2)
combo_box_dim.bind("<<ComboboxSelected>>", update_plot)
# Algorithm selection
combo_box_alg = ttk.Combobox(root, values=("Isolation Forest", "One-Class Support Vector Machine"), state="readonly")
combo_box_alg.grid(row=0, column=2, pady=10)
combo_box_alg.current(0)
combo_box_alg.bind("<<ComboboxSelected>>", update_plot)
update_plot(None)
root.mainloop()