diff --git a/tests/population/plot_scaling.py b/tests/population/plot_scaling.py
new file mode 100644
index 0000000000000000000000000000000000000000..c819a207347dcb2263748cc14f42df932293caa7
--- /dev/null
+++ b/tests/population/plot_scaling.py
@@ -0,0 +1,94 @@
+import matplotlib.pyplot as plt
+import pandas as pd
+import numpy as np
+
+
+def calc_mean_and_std(arr):
+    return np.mean(arr), np.std(arr)
+
+# Readout
+result_file = 'comparison_result.dat'
+results = []
+name_testcase = 'laptop David'
+
+with open(result_file, 'r') as f:
+    for line in f:
+        res = list(eval(line.strip()))
+        res.append(res[-2]/res[-1])
+        results.append(res)
+
+# make dataframe
+headers = ['cores', 'total_systems', 'total_time_sequentially', 'total_time_multiprocessing', 'ratio']
+df = pd.DataFrame(results)
+df.columns = headers
+
+# Select unique amounts
+unique_amt_cores = df['cores'].unique()
+unique_amt_systems = df['total_systems'].unique()
+
+# Create dictionary with calculated means and stdevs etc
+calculated_results = []
+for i in unique_amt_cores:
+    for j in unique_amt_systems:
+        total_time_sequential_list, total_time_multiprocessing_list, total_ratio_list = [], [], []
+
+        for res in results:
+            if (res[0]==i) & (res[1]==j):
+                total_time_sequential_list.append(res[2])
+                total_time_multiprocessing_list.append(res[3])
+                total_ratio_list.append(res[4])
+
+        if (total_time_sequential_list) and (total_time_multiprocessing_list) and (total_ratio_list):
+            # calculate stuff
+            mean_time_sequential, std_sequential = calc_mean_and_std(np.array(total_time_sequential_list))
+            mean_time_multiprocessing, std_multiprocessing = calc_mean_and_std(np.array(total_time_multiprocessing_list))
+            mean_ratio, std_ratio = calc_mean_and_std(np.array(total_ratio_list))
+
+            # make dict
+            res_dict = {
+                    'cores': i, 
+                    'systems': j, 
+                    'mean_time_sequential': mean_time_sequential, 
+                    'mean_time_multiprocessing':mean_time_multiprocessing,
+                    'mean_ratio': mean_ratio,
+                    'std_sequential': std_sequential,
+                    'std_multiprocessing': std_multiprocessing,
+                    'std_ratio': std_ratio,
+                    'total_runs': len(total_time_sequential_list)
+                }
+
+            calculated_results.append(res_dict)
+
+
+# Plot
+x_position_shift = 0
+y_position_shift = -0.05
+for amt_systems in unique_amt_systems:
+    cores = []
+    speedup = []
+    std = [] 
+
+    for el in calculated_results:
+        if el['systems']==amt_systems:
+
+            cores.append(el['cores'] + x_position_shift)
+            speedup.append(el['mean_ratio'])
+            std.append(el['std_ratio'])
+
+            # add number of runs its based on
+            plt.text(el['cores'] + x_position_shift+0.01, el['mean_ratio']+y_position_shift, el['total_runs'])
+
+    plt.errorbar(cores, speedup, std, linestyle='None', marker='^', label='{} systems'.format(amt_systems))
+    x_position_shift += 0.04
+
+plt.title("Speed up ratio vs amount of cores for different amounts of systems on {}".format(name_testcase))
+plt.xlabel("Amount of cores used")
+plt.ylabel("Speed up ratio (time_linear/time_parallel)")
+plt.legend()
+plt.show()
+
+
+
+
+
+