diff --git a/Bericht/bericht.pdf b/Bericht/bericht.pdf
index 2f09258c89fb123976bc7d650f8e16feaa1888fc..cd2df4b8a9861eba14285bf1392beabb793330b0 100644
Binary files a/Bericht/bericht.pdf and b/Bericht/bericht.pdf differ
diff --git a/Bericht/bericht.tex b/Bericht/bericht.tex
index 8e114e02ccafa71fd6c0afb9a6083712ad3acdb4..7407825cd79c54cd766cf1c21a31009dbc2fee1e 100644
--- a/Bericht/bericht.tex
+++ b/Bericht/bericht.tex
@@ -41,7 +41,8 @@ Die Daten sind zufällig generiert und enthalten Informationen zu Studenten: Ges
 
 Für die Lösung der Frage ob Studenten, die den Vorbereitungskurs abgeschlossen haben bessere Leistungen erzielen, werden die Leistungen der Studenten mit abgeschlossenem Vorbereitungskurs den Leistungen der Studenten ohne abgeschlossenem Vorbereitungskurs in einem QQ-Plot gegenübergestellt, aus dem ablesbar sein wird, dass die Studenten mit abgeschlossenem Vorbereitungskurs bessere Leistungen erzielen.
 
--Visualisierung 2- Gesamtpunktzahl splitten nach Bildungsgrad der Eltern -> Daraus Quantile berechnen -> Mehrdimensionalen QQ-Plot
+In der zweiten Visualisierung wird die Frage beantwortet, ob die Leistung der Studenten vom Bildungsgrad der Eltern abhängt. Dazu werden analog der ersten Visualisierung die Studenten nach Bildungsgrad der Eltern aufgeteilt und es werden jeweils die Quantile für die Durchschnittliche Leistung für jeden Bildungsgrad berechnet. Es gibt insgesamt 6 Bildungsgrade: Associateabschluss, Bachelorabschluss, Masterabschluss, Oberschulabschluss, irgendein Collageabschluss, irgendein Oberschulabschluss. Daher kann der QQ-Plot nicht 2-Dimensional erfolgen, stattdessen wird dieser QQ-Plot mehrdimensional gezeichnet. Zusätzlich gibt es die Interaktion bei der Mehrdimensionalen Darstellung 2 Dimensionen auszuwählen und dann einen 2D-Plot anzeigen zu lassen wie in der 1. Visualisierung.
+%-Visualisierung 2- Gesamtpunktzahl splitten nach Bildungsgrad der Eltern -> Daraus Quantile berechnen -> Mehrdimensionalen QQ-Plot
 
 -Visualisierung 3- wie Vis1 nur mit sowas wie Chernoff-Gesichtern?
 
@@ -68,26 +69,40 @@ Sinnvoll ist aber eine Durchschnittliche Leistung für jeden Studenten zu berech
 
 \section{Visualisierungen}
 \subsection{Analyse der Anwendungsaufgaben}
+Bei den Lehrveranstaltungen und Vorbereitungskursen für Prüfungen haben Lehrende die Aufgabe diese Veranstaltungen so zu gestalten, dass diese den Studenten beim lernen helfen. Bei dieser Gestaltung ist unter anderem auch die Frage wichtig wie sehr und ob die Veranstaltung für die Studenten nützlich ist. Um das herauszufinden hilft eine Gegenüberstellung der Verteilungen der Leistung der Studenten, die den Vorbereitungskurs abgeschlossen haben und der Leistung der Studenten, die den Vorbereitungskurs nicht abgeschlossen haben. Dadurch bekommen die Lehrenden ein Bild davon ob und wie ihr Vorbereitungskurs hilfreich ist.
+Nützlich dabei zu wissen ist auch für welche Studenten es eher hilfreich ist und für welche weniger. Das hilft nicht nur den Lehrenden sich auf gewisse Studentengruppen etwas mehr zu konzentrieren, sondern auch den Studenten zu entscheiden, ob sie an dem Vorbereitungskurs teilnehmen sollten oder nicht. Denn dann sehen sie anhand der Studentengruppen ob sie eher in der Gruppe sind, denen der Vorbereitungskurs viel bringt oder eher in der Gruppe sind, denen der Vorbereitungskurs weniger hilft.
+Bei der Frage an welche Studentengruppen sich Lehrende eher konzentrieren sollten, die mehr Hilfe beim lernen benötigen als andere Studenten, ist eine der Unterscheidungen welchen Bildungsgrad die Eltern haben. Daher ist es wichtig zu analysieren ob und welchen Einfluss der Bildungsgrad der Eltern auf die Leistungen der Studenten hat.
 
 %Analysieren sie die konkreten Anwendungsaufgaben. Welche Visualisierungen helfen den Personen, die die Software verwenden, sinnvolle mentale Modelle aufzubauen. Sind diese mentalen Modelle für sie notwendig, um die Aufgaben lösen zu können?
 \subsection{Anforderungen an die Visualisierungen}
-Leiten sie Anforderungen an das Design der Visualisierungen ab, die sich durch ihre Analyse des Zielproblems ergeben.
+Die Visualisierungen sollen ein Bild darüber vermitteln ob der Vorbereitungskurs hilfreich ist. Dazu bietet sich eine Gegenüberstellung der Verteilungen der entsprechenden Leistungen der Studenten an. 
+
+Die Visualisierungen sollen auch vermitteln welche Studentengruppen eher dazu geneigt sind schlechtere Leistungen zu erzielen und somit mehr Hilfe beim lernen von den Lehrenden benötigen als andere Studentengruppen; mit dem Fokus auf die Unterscheidung des Bildungsgrades der Eltern.
+
+Weiterhin sollen die Visualisierungen zeigen welchen Studentengruppen der Vorbereitungskurs besser hilft und welchen weniger. 
+
+%Leiten sie Anforderungen an das Design der Visualisierungen ab, die sich durch ihre Analyse des Zielproblems ergeben.
 \subsection{Präsentation der Visualisierungen}
-Präsentieren sie die visuelle Abbildungen und Kodierungen der Daten und Interaktionsmöglichkeiten. 
-Sie müssen  begründen, warum und wiegut ihre Designentscheidungen die erstellten Anforderungen erfüllen. 
-Weiterhin müssen sie begründen, warum die gewählte visuelle Kodierung der Daten für das zulösenden Problem passend ist. 
-Typische Argumente würden hier auf Wahrnehmungsprinzipien und Theorie über Informationsvisualisierung verweisen. 
-Die besten Begründungen diskutieren explizit die konkrete Auswahl der Visualisierungen im Kontext von mehreren verschiedenen Alternativen. Diskutieren sie die Expressivität und die Effektivität der einzelnen Visualisierungen. 
+%Präsentieren sie die visuelle Abbildungen und Kodierungen der Daten und Interaktionsmöglichkeiten. 
+%Sie müssen  begründen, warum und wiegut ihre Designentscheidungen die erstellten Anforderungen erfüllen. 
+%Weiterhin müssen sie begründen, warum die gewählte visuelle Kodierung der Daten für das zulösenden Problem passend ist. 
+%Typische Argumente würden hier auf Wahrnehmungsprinzipien und Theorie über Informationsvisualisierung verweisen. 
+%Die besten Begründungen diskutieren explizit die konkrete Auswahl der Visualisierungen im Kontext von mehreren verschiedenen Alternativen. Diskutieren sie die Expressivität und die Effektivität der einzelnen Visualisierungen. 
 
-Die eben beschriebenen Präsentationen und Begründungen sollen für jede der drei folgenden Visualisierungen durchgeführt werden. 
+%Die eben beschriebenen Präsentationen und Begründungen sollen für jede der drei folgenden Visualisierungen durchgeführt werden. 
 \subsubsection{Visualisierung Eins}
+%Präsentieren sie die visuelle Abbildungen und Kodierungen der Daten und Interaktionsmöglichkeiten. 
 In der folgenden Visualisierung wird ein Quantil-Quantil-Plot dargestellt. Auf der X-Achse ist die Durchschnittliche Leistung der Studenten dargestellt, die den Vorbereitungskurs nicht abgeschlossen haben. Auf der Y-Achse ist die Durchschnittliche Leistung der Studenten dargestellt, die den Vorbereitungskurs abgeschlossen haben. Ein Punkt (x,y) auf dem Quantil-Quantil-Plot wird genau dann eingezeichnet, wenn das Quantil von x gleich dem Quantil von y ist. Ein Quantil ist dabei die Wahrscheinlichkeit dafür, dass die Werte der Verteilung kleiner dem gegebenem Wert sind.
-Außerdem ist eine Gerade bei x-y eingezeichnet. Wenn nämlich die Leistung unabhängig davon wäre ob der Vorbereitungskurs abgeschlossen wurde, dann würden bei einer genügend großen Stichprobe alle Punkte auf dieser Geraden liegen. Daher gibt diese Gerade eine Orientierung ob die Studenten von der X-Achse bessere Leistungen erbringen als die Studenten der Y-Achse oder umgekehrt.
-Man erkennt, dass fast alle Punkte über dieser Orientierungsgeraden liegen, also die Y-Werte größer sind als die X-Werte am entsprechenden Quantil. Das bedeutet, dass die Studenten, die den Vorbereitungskurs abgeschlossen haben bessere Leistungen vollbringen, als die Studenten, die den Vorbereitungskurs nicht abgeschlossen haben.
+Außerdem ist eine Gerade bei x=y eingezeichnet. Wenn nämlich die Leistung unabhängig davon wäre ob der Vorbereitungskurs abgeschlossen wurde, dann würden bei einer genügend großen Stichprobe alle Punkte diese Geraden bilden. Daher gibt diese Gerade eine Orientierung ob die Studenten von der X-Achse bessere Leistungen erbringen als die Studenten der Y-Achse oder umgekehrt.
+Man erkennt, dass fast alle Punkte über dieser Orientierungsgeraden liegen, also die Y-Werte größer sind als die X-Werte am entsprechenden Quantil. Das bedeutet, dass die Studenten, die den Vorbereitungskurs abgeschlossen haben bessere Chancen haben bessere Leistungen zu erbringen, als die Studenten, die den Vorbereitungskurs nicht abgeschlossen haben.
 
-\includegraphics[scale=0.68]{Bilder/Visualisierung1.jpg}
+Zusätzlich hat man noch die Interaktionsmöglichkeit für jeden angezeigten Punkt die genauen Leistungswerte, die sich gegenüber stehen anzeigen zu lassen.
 
-Alternativ könnte man in einem Boxplot 2 Boxen zeichnen: eine für die Studenten, die am Vorbereitungskurs teilgenommen haben und eine für die Studenten, die am Vorbereitungskurs nicht teilgenommen haben. Jede Box stellt dann die Verteilung der Leistungen der entsprechenden Studenten dar. Vorteil des Boxplots wäre, dass man die Mediane sowie die Quantile, die den Rand der Box darstellen, der beiden Verteilungen leichter vergleichen kann, da diese durch die Horizontale Position verglichen werden können. Nachteil des Boxplots ist aber, dass nur wenige Quantile miteinander verglichen werden können, während im QQ-Plot zu jedem einzelnen eingetragenen zum Quantil zugehörigen Wert der entsprechende Wert des selben Quantils der anderen Verteilung abgelesen und so verglichen werden kann. Auf die Weise bekommt man ein schärferes Bild des Vergleichs. Durch die zusätzlich eingetragene Linie bei x=y kann man außerdem sehen welche Quantile näher am Gleich-sein sind und welche einen größeren Unterschied aufweisen. So sieht man, dass die Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs abgeschlossen haben eine sehr schlechte Leitung in der Prüfung aufzeigen deutlich geringer ist als die Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs nicht abgeschlossen haben eine sehr schlechte Leistung in der Prüfung aufzeigen. Wohingegen die Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs abgeschlossen haben eine sehr gute Leistung vollbringen ähnlich der Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs nicht abgeschlossen haben und trotzdem eine sehr gute Leistung vollbringen, ist.
+\includegraphics[scale=0.68]{Bilder/Visualisierung1.jpg}
+%Sie müssen  begründen, warum und wiegut ihre Designentscheidungen die erstellten Anforderungen erfüllen. 
+Durch die Entfernung der Punkte von der Geraden erkennt man gut ob und in welche Richtung der Vorbereitungskurs Einfluss auf die Leistung der Studenten hat. Konkret erkennt man an dieser Visualisierung, dass der Vorbereitungskurs tatsächlich hilfreich ist. Ebenso ist erkennbar, dass die Studenten, die ohnehin schlechtere Leistungen erzielen ohne den Vorbereitungskurs noch viel schlechter sind, da am linken unteren Rand die Punkte viel weiter entfernt von der Gerade sind, als die Punkte am oberen rechten Rand. So sieht man auch, dass diejenigen Studenten, die gute Leistungen erzielen, dass sich dessen Leistung nur leicht bis kaum verbessert, wenn sie den Vorbereitungskurs besuchen. Somit kann man schon durch diese Visualisierung 2 Gruppen von Studenten unterscheiden, auf die sich der Vorbereitungskurs unterschiedlich stark auswirkt.
+%Weiterhin müssen sie begründen, warum die gewählte visuelle Kodierung der Daten für das zulösenden Problem passend ist.
+Alternativ zum Quantil-Quantil-Plot könnte man in einem Boxplot 2 Boxen zeichnen: eine für die Studenten, die am Vorbereitungskurs teilgenommen haben und eine für die Studenten, die am Vorbereitungskurs nicht teilgenommen haben. Jede Box stellt dann die Verteilung der Leistungen der entsprechenden Studenten dar. Vorteil des Boxplots wäre, dass man die Mediane sowie die Quantile, die den Rand der Box darstellen, der beiden Verteilungen leichter vergleichen kann, da diese durch die Horizontale Position verglichen werden können und diese explizit durch Linien markiert sind, sodass der Vergleich leichter wahrzunehmen ist als beim Quantil-Quantil-Plot, bei dem man die Quantile selbst nicht direkt ablesen kann. Nachteil des Boxplots ist aber, dass nur wenige Quantile miteinander verglichen werden können, nämlich nur die, die durch die Linien eingezeichnet wurden, während im QQ-Plot zu jedem einzelnen eingetragenen zum Quantil zugehörigen Wert der entsprechende Wert des selben Quantils der anderen Verteilung abgelesen und so verglichen werden kann. Auf die Weise bekommt man ein schärferes Bild des Vergleichs. Durch die zusätzlich eingetragene Linie bei x=y kann man außerdem sehen welche Quantile näher am Gleich-sein sind und welche einen größeren Unterschied aufweisen. Diese Linie erlaubt einen Vergleich, bei dem man lediglich eindimensionale Abstände wahrnehmen muss. Eindimensionale, parallele Abstände lassen sich sehr einfach wahrnehmen. Dadurch überbringt diese Visualisierung ihre Hauptinformation, dessen Wahrnehmung den Betrachtern leicht fällt. Durch dieses schärfere Bild kann man somit nicht nur erkennen welche der Studentengruppen (mit abgeschlossenem Vorbereitungskurs, ohne abgeschlossenem Vorbereitungskurs) bessere Leistungen abscheidet, sondern auch die Studentengruppen aufzeigt, auf die sich der Vorbereitungskurs unterschiedlich stark auswirkt. So sieht man, dass die Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs abgeschlossen haben eine sehr schlechte Leitung in der Prüfung aufzeigen deutlich geringer ist als die Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs nicht abgeschlossen haben eine sehr schlechte Leistung in der Prüfung aufzeigen. Wohingegen die Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs abgeschlossen haben eine sehr gute Leistung vollbringen ähnlich der Wahrscheinlichkeit, dass Studenten, die den Vorbereitungskurs nicht abgeschlossen haben und trotzdem eine sehr gute Leistung vollbringen, ist.
 \subsubsection{Visualisierung Zwei}
 \subsubsection{Visualisierung Drei}
 
diff --git a/Programm/src/Plots.elm b/Programm/src/Plots.elm
index 9aafe6c9044fb37e44837f7b2e2aa9f1b4f123f7..468dfa8adac6278c8dac67e43eb6d032ee08d399 100644
--- a/Programm/src/Plots.elm
+++ b/Programm/src/Plots.elm
@@ -1,6 +1,6 @@
-module Plots exposing ( XyData
-                      , pointConstructor,pointsConstructor,qValuesToQQValues
-                      , viewScatterplot,viewQQPlot
+module Plots exposing ( XyData,MultiDimData,Msg
+                      , pointConstructor,pointsConstructor,qValuesToQQValues,qValuesToMultiDimQQValues
+                      , viewScatterplot,viewQQPlot,viewParallelCoordsPlot
                       )
 
 -- Html
@@ -18,6 +18,7 @@ import TypedSvg.Attributes exposing (class, fontFamily, fontSize, textAnchor, tr
 import TypedSvg.Attributes.InPx exposing (cx, cy, height, r, width, x, y)
 import TypedSvg.Core exposing (Svg)
 import TypedSvg.Types exposing (AnchorAlignment(..), Length(..), Transform(..))
+import TypedSvg.Events
 import Color
 --own
 import Util exposing (..)
@@ -31,7 +32,7 @@ type alias Model =
 
 
 init : Model
-init = { scatterplotType = None
+init = { scatterplotType = None ""
        , powertransformation = ""
        }
 
@@ -40,6 +41,7 @@ init = { scatterplotType = None
 type Msg
   = ScatterplotChange ScatterplotType
   | Powertransformation String
+  | ParallelCoordsSwapD_list Int Int
 
 noUpdate : Model -> Model
 noUpdate model = model
@@ -51,6 +53,13 @@ update msg model =
     Powertransformation string -> if String.toFloat string /= Nothing
                                   then { model | powertransformation = string }
                                   else { model | powertransformation = "" }
+    ParallelCoordsSwapD_list i1 i2 ->
+      { model | scatterplotType =
+                  case model.scatterplotType of
+                    None _                   -> None "Exception: triggered CarType2Change with PlotType None"
+                    QQ_Plot                  -> None "Exception: triggered ParallelCoordsSwapD_list with PlotType QQ_Plot"
+                    Parallel_Coords b d_list -> Parallel_Coords b (list_swap d_list {i1=i1,i2=i2})
+      }
 
 -- Types
 
@@ -74,13 +83,9 @@ type alias MultiDimData =
     }
 
 type ScatterplotType
-    = None
-    | CityMPG_RetailPrice
-    | DealerCost_CarLen
-    | Q_Plot
+    = None String
     | QQ_Plot
-    | Normal_QQ_Plot
-    | Parallel_Coords
+    | Parallel_Coords Bool (List XyData)
 
 -- Eigenschaften
 
@@ -355,37 +360,53 @@ viewPowertransformedScatterplot power scatterplotName model line =
   in viewScatterplot ("Powertransformed - "++power++" - "++scatterplotName)
        newModel Nothing Nothing Nothing newLine ""
 
-viewParallelCoordsPlot : String -> MultiDimData -> Html msg
-viewParallelCoordsPlot name model =
+viewParallelCoordsPlot : String -> MultiDimData -> Bool -> Html Msg
+viewParallelCoordsPlot name model doXRay =
     Html.div []
       [ Html.h4 [] [Html.text name]
-      , if List.length model.data /= 0 then parallelCoordsPlot model
+      , if List.length model.data /= 0 then parallelCoordsPlot model doXRay
         else Html.text "Unable to show the parallel coords plot, because the input data is empty!"
       ]
 
 -- Plots
-parallelCoordsPlot : MultiDimData -> Svg msg
-parallelCoordsPlot model =
+parallelCoordsPlot : MultiDimData -> Bool -> Svg Msg
+parallelCoordsPlot model doXRay =
     let listDimValues : List (List Float)
         listDimValues = multiDimDataToListDimValues model.data
 
         listDimScaleLocal : List (ContinuousScale Float)
         listDimScaleLocal = List.map (\dimValues -> yScale dimValues) listDimValues
 
-        xCoordOfDim : Float -> Float
-        xCoordOfDim index = index*(w/(toFloat <| List.length (Maybe.withDefault [] <| List.head <| List.map .value model.data) ))
+        numberDims : Int
+        numberDims = List.length listDimValues
+
+        xCoordOfDim : Int -> Float
+        xCoordOfDim index = (toFloat index)*(w/(toFloat numberDims))
+
+        frontgroundColor = if doXRay then Color.white else Color.black
+        backgroundColor = if doXRay then Color.black else Color.white
     in
     svg [ viewBox 0 0 w h, TypedSvg.Attributes.width <| TypedSvg.Types.Percent 100, TypedSvg.Attributes.height <| TypedSvg.Types.Percent 100 ]
         (List.concat
         [[ style [] [ TypedSvg.Core.text """
              .HoverDescription g > text { display: none; }
              .HoverDescription:hover g > text { display: inline; }
-             """ ]
+             .Button:hover { fill-opacity: 0.2 }
+             """]
          ]
+        , [ TypedSvg.rect [ x 0
+                          , y 0
+                          , width w
+                          , height h
+                          , TypedSvg.Attributes.fill (TypedSvg.Types.Paint backgroundColor)
+                          ] [] ]
         , List.map3
             (\dimValues dimDescription index ->
                 g [ transform [ Translate (padding - 1 + (xCoordOfDim index)) padding ]
                   , class [ "HoverDescription" ]
+                  , TypedSvg.Attributes.stroke (TypedSvg.Types.Paint frontgroundColor)
+                  , TypedSvg.Attributes.fill   (TypedSvg.Types.Paint frontgroundColor)
+                  , TypedSvg.Attributes.strokeWidth (Px 0.5)
                   ] [ yAxis dimValues
                     , text_ [ fontFamily [ "sans-serif" ]
                             , fontSize <| TypedSvg.Types.Px 10
@@ -393,7 +414,43 @@ parallelCoordsPlot model =
                             , y -(padding/5)
                             ] [ TypedSvg.Core.text dimDescription ]
                     ]
-            ) listDimValues model.dimDescription (List.map toFloat <| List.range 0 <| (List.length listDimValues)-1)
+            ) listDimValues model.dimDescription (List.range 0 <| numberDims-1)
+        , let triangle_left: {x:Float,y:Float} -> Int -> Svg Msg
+              triangle_left midPoint currentIndex =
+                TypedSvg.polygon
+                  [ TypedSvg.Attributes.points [(midPoint.x-2*radius,midPoint.y)
+                                               ,(midPoint.x+(sqrt 3.0/4.0)*2*radius,midPoint.y+2*radius/2)
+                                               ,(midPoint.x+(sqrt 3.0/4.0)*2*radius,midPoint.y-2*radius/2)
+                                               ]
+                  , TypedSvg.Events.onClick (ParallelCoordsSwapD_list (currentIndex-1) currentIndex)
+                  , TypedSvg.Attributes.fill   (TypedSvg.Types.Paint frontgroundColor)
+                  , TypedSvg.Attributes.stroke (TypedSvg.Types.Paint frontgroundColor)
+                  , class [ "Button" ]
+                  ] []
+              triangle_right: {x:Float,y:Float} -> Int -> Svg Msg
+              triangle_right midPoint currentIndex =
+                TypedSvg.polygon
+                  [ TypedSvg.Attributes.points [(midPoint.x+2*radius,midPoint.y)
+                                               ,(midPoint.x-(sqrt 3.0/4.0)*2*radius,midPoint.y+2*radius/2)
+                                               ,(midPoint.x-(sqrt 3.0/4.0)*2*radius,midPoint.y-2*radius/2)
+                                               ]
+                  , TypedSvg.Events.onClick (ParallelCoordsSwapD_list currentIndex (currentIndex+1))
+                  , TypedSvg.Attributes.fill   (TypedSvg.Types.Paint frontgroundColor)
+                  , TypedSvg.Attributes.stroke (TypedSvg.Types.Paint frontgroundColor)
+                  , class [ "Button" ]
+                  ] []
+          in
+          List.map
+            (\dimIndex ->
+                g [ transform [ Translate padding padding ]
+                  ] ( List.append
+                      ( if not (dimIndex > 0) then [] else
+                        [ triangle_left  {x = (xCoordOfDim dimIndex)-2*radius,y = 0} dimIndex]
+                      )(if not (dimIndex < numberDims-1) then [] else
+                        [ triangle_right {x = (xCoordOfDim dimIndex)+2*radius,y = 0} dimIndex]
+                      )
+                    )
+            ) (List.range 0 <| numberDims-1)
         , List.map
             (\point_ ->
                 g [ transform [ Translate padding padding ] ]
@@ -405,11 +462,11 @@ parallelCoordsPlot model =
                              , Scale.convert dimScaleLocal pDimValue
                              )
                         )
-                        point_ listDimScaleLocal (List.map toFloat <| List.range 0 <| (List.length point_)-1)
+                        point_ listDimScaleLocal (List.range 0 <| numberDims-1)
                       )
-                    , TypedSvg.Attributes.stroke (TypedSvg.Types.Paint Color.black)
-                    , TypedSvg.Attributes.strokeWidth <| Px 0.3
-                    , TypedSvg.Attributes.strokeOpacity (TypedSvg.Types.Opacity 1)
+                    , TypedSvg.Attributes.stroke (TypedSvg.Types.Paint frontgroundColor)
+                    , TypedSvg.Attributes.strokeWidth <| if doXRay then Px 2 else Px 0.3
+                    , TypedSvg.Attributes.strokeOpacity (TypedSvg.Types.Opacity <| if doXRay then 0.1 else 1)
                     , TypedSvg.Attributes.fill TypedSvg.Types.PaintNone
                     ] []
                   ]
@@ -861,6 +918,26 @@ qValuesToQQValues qValues1 qValues2 =
                            (Statistics.quantile sPoint.x qV1)
               ) smaller.data
 
+qValuesToMultiDimQQValues : List XyData -> MultiDimData
+qValuesToMultiDimQQValues qList =
+    let qListSortedByLength : List XyData
+        qListSortedByLength = List.sortBy (\xyData -> List.length <| xyData.data) qList
+        smallestDimData : XyData
+        smallestDimData = Maybe.withDefault (XyData "Error: There is no Data" "Error: There is no Data" []) <| List.head qListSortedByLength
+        -- gets all values and description for one dimension
+        getOneDimData : XyData -> {description : String, value : List Float}
+        getOneDimData dimension_data =
+            { description = dimension_data.yDescription
+            , value       =
+                List.map
+                  (\quantil -> Maybe.withDefault 999 <| Statistics.quantile quantil <| List.map .y dimension_data.data)
+                  (List.map .x smallestDimData.data)
+            }
+        -- gets all the data that is nessesary
+        multiDimValues : List {description : String, value : List Float}
+        multiDimValues = List.map (\xyData -> getOneDimData xyData) qListSortedByLength
+    in MultiDimData (List.map .description multiDimValues) <| listDimValuesToMultiDimData <| List.map .value multiDimValues
+
    {-- other converts
 carsToXyData : List Car -> CarDependency -> CarDependency -> XyData
 carsToXyData my_cars  xDependency yDependency =
diff --git a/Programm/src/StudentsPerformanceInExams.elm b/Programm/src/StudentsPerformanceInExams.elm
index 0c0d0fff3e24e724c1ab0d922c1c63532e2c3952..551b15801f0de1c9e3966a65079174f41e4c0eba 100644
--- a/Programm/src/StudentsPerformanceInExams.elm
+++ b/Programm/src/StudentsPerformanceInExams.elm
@@ -27,7 +27,7 @@ import Statistics
 -- other
 import Color
 -- own
-import Plots exposing (XyData)
+import Plots exposing (XyData, MultiDimData)
 import Util exposing (..)
 
 -- MAIN
@@ -86,6 +86,7 @@ type alias DataDescription =
 type VisualisationKind
  = Table String Bool
  | QQ_Plot
+ | MultiDimPlot
 
 filesToLoad =
   [ "StudentsPerformance.csv"
@@ -119,6 +120,7 @@ init _ =
 type Msg
   = GotText String (Result Http.Error String)
   | ChangeVisualisation (VisualisationKind)
+  | UpdatePlots (Plots.Msg)
 
 update : Msg -> Model -> ( Model, Cmd Msg)
 update msg model = (updateModel msg model, Cmd.none)
@@ -149,6 +151,8 @@ updateModel msg model =
                  }
     ChangeVisualisation kind -> { model | visualisationKind = kind }
 
+    UpdatePlots plotsMsg -> model
+
 -- SUBSCRIPTIONS
 subscriptions : Model -> Sub Msg
 subscriptions model = Sub.none
@@ -169,6 +173,7 @@ view model =
         , viewSelect "Visualisierung auswählen "
             [(ChangeVisualisation (Table "no" True), "Tabelle"                   )
             ,(ChangeVisualisation QQ_Plot          , "QQ-Plot (Visualisierung 1)")
+            ,(ChangeVisualisation MultiDimPlot     , "Multidimensionaler QQ-Plot (Visualisierung 2)")
             ]
         , case model.visualisationKind of
             Table sortBy asc ->
@@ -245,6 +250,33 @@ view model =
                 , Plots.viewScatterplot "QPlot without test preparation" pointsWithoutPreparation Nothing Nothing Nothing Nothing ""
                 , Plots.viewQQPlot "QQPlot Students avgScore with test preparation vs without test preparation" qqValues
                 ]
+            MultiDimPlot ->
+              let -- Select the data
+                  dataSelection_ass   = selectData .parentEducation "associate's degree" model.data
+                  dataSelection_bac   = selectData .parentEducation "bachelor's degree"  dataSelection_ass.unselected
+                  dataSelection_mas   = selectData .parentEducation "master's degree"    dataSelection_bac.unselected
+                  dataSelection_hisc  = selectData .parentEducation "high school"        dataSelection_mas.unselected
+                  dataSelection_scol  = selectData .parentEducation "some college"       dataSelection_hisc.unselected
+                  --dataSelection_shisc = dataSelection_scol.unselected -- some high school
+                  -- Calc Q-Values
+                  qV_ass   = dataToQValuesXyData dataSelection_ass.selected    .avgScore .avgScore "with associate's degree"
+                  qV_bac   = dataToQValuesXyData dataSelection_bac.selected    .avgScore .avgScore "with bachelor's degree"
+                  qV_mas   = dataToQValuesXyData dataSelection_mas.selected    .avgScore .avgScore "with master's degree"
+                  qV_hisc  = dataToQValuesXyData dataSelection_hisc.selected   .avgScore .avgScore "with high school"
+                  qV_scol  = dataToQValuesXyData dataSelection_scol.selected   .avgScore .avgScore "with some college"
+                  qV_shisc = dataToQValuesXyData dataSelection_scol.unselected .avgScore .avgScore "with some high school"
+                  -- Create MultiDimData
+                  qqValues = Plots.qValuesToMultiDimQQValues [qV_ass, qV_bac, qV_mas, qV_hisc, qV_scol, qV_shisc]
+              in
+              div []
+                [ Plots.viewScatterplot "QPlot with associate's degree" qV_ass   Nothing Nothing Nothing Nothing ""
+                , Plots.viewScatterplot "QPlot with bachelor's degree"  qV_bac   Nothing Nothing Nothing Nothing ""
+                , Plots.viewScatterplot "QPlot with master's degree"    qV_mas   Nothing Nothing Nothing Nothing ""
+                , Plots.viewScatterplot "QPlot with high school"        qV_hisc  Nothing Nothing Nothing Nothing ""
+                , Plots.viewScatterplot "QPlot with some college"       qV_scol  Nothing Nothing Nothing Nothing ""
+                , Plots.viewScatterplot "QPlot with some high school"   qV_shisc Nothing Nothing Nothing Nothing ""
+                --, Plots.viewParallelCoordsPlot "Parallel QQ-Plot for parental Education showing the avgScore" qqValues False
+                ]
         ]
 
 dataToQValuesXyData : List Data -> (Data -> Int) -> (DataDescription -> String) -> String -> XyData
@@ -547,38 +579,3 @@ drawDimension (w,h) pixelMapping data =
                 ][]
     in g [] <| List.map2 drawPixel pixelMapping data
 -}
--- Working with Lists
-
-list_Last : List a -> Maybe a
-list_Last list =
-  case list of
-    []    -> Nothing
-    x::[] -> Just x
-    x::xs -> list_Last xs
-
-list_next : List a -> List a
-list_next list = List.append (List.drop 1 list) (List.take 1 list)
-
-list_get : List a -> Int -> a -- returns the listelement at index i. creates endless loop if length list < i+1
-list_get list i =
-    case list of
-        []    -> list_get list i
-        x::xs -> if i == 0 then x else list_get xs (i-1)
-
-list_set : List a -> Int -> a -> List a -- resets at index i the element with e. does nothing if length list < i+1
-list_set list i e =
-    case list of
-        []    -> []
-        x::xs -> if i==0 then e::xs else x::(list_set xs (i-1) e)
-
--- Working with Errors
-httpErrorToString : Http.Error -> String
-httpErrorToString err =
-  "Http-Error: "++(
-    case err of
-      Http.BadUrl string  -> "BadUrl "++string
-      Http.Timeout        -> "Timeout"
-      Http.NetworkError   -> "NetworkError"
-      Http.BadStatus int  -> "BadStatus "++(String.fromInt int)
-      Http.BadBody string -> "BadBody "++string
-  )
\ No newline at end of file
diff --git a/Programm/src/Util.elm b/Programm/src/Util.elm
index 98493ea6b095b6a6385870940e0dd41abaf72161..9ae6ef40a47bf817c6bf19279eab8c26bfb60ea3 100644
--- a/Programm/src/Util.elm
+++ b/Programm/src/Util.elm
@@ -1,7 +1,53 @@
 module Util exposing (..)
+--Http
+import Http
 
 maybeIntToMaybeFloat : Maybe Int -> Maybe Float
 maybeIntToMaybeFloat mayInt =
     case mayInt of
         Just int -> Just (toFloat int)
-        Nothing  -> Nothing
\ No newline at end of file
+        Nothing  -> Nothing
+
+-- Working with Lists
+
+list_Last : List a -> Maybe a
+list_Last list =
+  case list of
+    []    -> Nothing
+    x::[] -> Just x
+    x::xs -> list_Last xs
+
+list_next : List a -> List a
+list_next list = List.append (List.drop 1 list) (List.take 1 list)
+
+list_swap : List a -> {i1: Int,i2: Int} -> List a -- swaps the 2 elements at that 2 indices in the input list
+list_swap list {i1,i2} =
+    let e1 : a
+        e1 = list_get list i1
+        e2 : a
+        e2 = list_get list i2
+    in list_set (list_set list i1 e2) i2 e1
+
+list_get : List a -> Int -> a -- returns the listelement at index i. creates endless loop if length list < i+1
+list_get list i =
+    case list of
+        []    -> list_get list i
+        x::xs -> if i == 0 then x else list_get xs (i-1)
+
+list_set : List a -> Int -> a -> List a -- resets at index i the element with e. does nothing if length list < i+1
+list_set list i e =
+    case list of
+        []    -> []
+        x::xs -> if i==0 then e::xs else x::(list_set xs (i-1) e)
+
+-- Working with Errors
+httpErrorToString : Http.Error -> String
+httpErrorToString err =
+  "Http-Error: "++(
+    case err of
+      Http.BadUrl string  -> "BadUrl "++string
+      Http.Timeout        -> "Timeout"
+      Http.NetworkError   -> "NetworkError"
+      Http.BadStatus int  -> "BadStatus "++(String.fromInt int)
+      Http.BadBody string -> "BadBody "++string
+  )
\ No newline at end of file