diff --git a/elm.json b/elm.json
index 508adeafc66675ec3a9321d35324234c02cb2ca1..37da2b127318bc544e0c0d062129dda9c62eac99 100644
--- a/elm.json
+++ b/elm.json
@@ -22,6 +22,7 @@
             "gampleman/elm-visualization": "2.4.1",
             "lovasoa/elm-csv": "1.1.7",
             "mpizenberg/elm-pointer-events": "5.0.0",
+            "myrho/elm-round": "1.0.5",
             "rtfeldman/elm-css": "18.0.0"
         },
         "indirect": {
@@ -37,7 +38,6 @@
             "elm/virtual-dom": "1.0.3",
             "elm-community/intdict": "3.0.0",
             "elmcraft/core-extra": "2.0.0",
-            "ericgj/elm-csv-decode": "2.0.1",
             "folkertdev/elm-deque": "3.0.1",
             "folkertdev/svg-path-lowlevel": "4.0.1",
             "ianmackenzie/elm-1d-parameter": "1.0.1",
@@ -57,6 +57,8 @@
     },
     "test-dependencies": {
         "direct": {},
-        "indirect": {}
+        "indirect": {
+            "ericgj/elm-csv-decode": "2.0.1"
+        }
     }
-}
\ No newline at end of file
+}
diff --git a/public/csv/smartphone_dataset.csv b/public/csv/smartphone_dataset.csv
index 04d6208a9e2e768061d867968aad2d80f3db2d0f..982ef453b9fb799957332cf17ddc7923af4caa55 100644
--- a/public/csv/smartphone_dataset.csv
+++ b/public/csv/smartphone_dataset.csv
@@ -270,7 +270,7 @@ id,index,brand,model,price,rating,5G,NFC,IR_blaster,processor_name,processor_bra
 268,270,redmi,Redmi Note 11 Pro 2023,18999,81.0,False,False,True,Snapdragon 712,snapdragon,octa core, 2.3 GHz Processor,"6 GB RAM, 128 GB inbuilt",5000.0,67, 128 GB inbuilt,6,"6.67 inches, 1080 x 2400 px, 120 Hz Display with Punch Hole",6.67 inches,1080 x 2400 ,120,108 MP Quad Rear & 16 MP Front Camera,"Memory Card (Hybrid), upto 1 TB",Android v11
 269,271,nothing,Nothing Phone 2,39990,88.0,True,True,False,Snapdragon 8+ Gen1,snapdragon,octa core, 3.2 GHz Processor,"8 GB RAM, 128 GB inbuilt",4700.0,66, 128 GB inbuilt,8,"6.67 inches, 1080 x 2400 px, 120 Hz Display with Punch Hole",6.67 inches,1080 x 2400 ,120,50 MP + 50 MP + 50 MP Triple Rear & 32 MP Front Camera,Memory card not supported,Android v13
 270,272,samsung,Samsung Galaxy A32 (8GB RAM + 128GB),16499,82.0,False,False,False,Helio G80,helio,octa core, 2 GHz Processor,"8 GB RAM, 128 GB inbuilt",5000.0,15, 128 GB inbuilt,8,"6.4 inches, 1080 x 2400 px, 90 Hz Display with Water Drop Notch",6.4 inches,1080 x 2400 ,90,64 MP Quad Rear & 20 MP Front Camera,"Memory Card Supported, upto 1 TB",Android v11
-271,273,nokia,Nokia 2720 V Flip,6199,,False,False,False,Snapdragon 205,snapdragon,dual core, 1.1 GHz Processor,"512 MB RAM, 4 GB inbuilt",1500.0,-1, 4 GB inbuilt,512,"2.8 inches, 240 x 320 px Display",2.8 inches,240 x 320 ,60,2 MP Rear Camera,Memory card not supported,
+271,273,nokia,Nokia 2720 V Flip,6199,,False,False,False,Snapdragon 205,snapdragon,dual core, 1.1 GHz Processor,"512 MB RAM, 4 GB inbuilt",1500.0,-1, 4 GB inbuilt,0.512,"2.8 inches, 240 x 320 px Display",2.8 inches,240 x 320 ,60,2 MP Rear Camera,Memory card not supported,
 272,274,google,Google Pixel 6 Pro,54300,89.0,True,True,False,Google  Tensor,google,octa core, 2.8 GHz Processor,"12 GB RAM, 128 GB inbuilt",5003.0,30, 128 GB inbuilt,12,"6.71 inches, 1440 x 3120 px, 120 Hz Display with Punch Hole",6.71 inches,1440 x 3120 ,120,50 MP + 48 MP + 12 MP Triple Rear & 11.1 MP Front Camera,Memory card not supported,Android v12
 273,275,infinix,Infinix Note 12i (2022),9999,73.0,False,False,False,Helio G85,helio,octa core, 2 GHz Processor,"4 GB RAM, 64 GB inbuilt",5000.0,33, 64 GB inbuilt,4,"6.7 inches, 1080 x 2400 px Display with Water Drop Notch",6.7 inches,1080 x 2400 ,60,50 MP + 2 MP Triple Rear & 8 MP Front Camera,"Memory Card Supported, upto 512 GB",Android v12
 274,276,xiaomi,Xiaomi Redmi 11 Prime 5G (6GB RAM + 128GB),15990,77.0,True,False,True,Dimensity 700 5G,dimensity,octa core, 2.2 GHz Processor,"6 GB RAM, 128 GB inbuilt",5000.0,18, 128 GB inbuilt,6,"6.58 inches, 1080 x 2408 px, 90 Hz Display with Water Drop Notch",6.58 inches,1080 x 2408 ,90,50 MP + 2 MP Dual Rear & 5 MP Front Camera,"Memory Card Supported, upto 512 GB",Android v12
@@ -436,7 +436,7 @@ id,index,brand,model,price,rating,5G,NFC,IR_blaster,processor_name,processor_bra
 436,438,oppo,OPPO A16e,8999,65.0,False,False,False,Helio P22,helio,octa core, 2 GHz Processor,"3 GB RAM, 32 GB inbuilt",4230.0,-1, 32 GB inbuilt,3,"6.52 inches, 720 x 1600 px Display with Water Drop Notch",6.52 inches,720 x 1600 ,60,13 MP Rear & 5 MP Front Camera,"Memory Card (Hybrid), upto 1 TB",Android v11
 437,439,motorola,Motorola Moto E32,8999,71.0,False,False,False,Helio G37,helio,octa core, 2.3 GHz Processor,"4 GB RAM, 64 GB inbuilt",5000.0,10, 64 GB inbuilt,4,"6.5 inches, 720 x 1600 px, 90 Hz Display with Punch Hole",6.5 inches,720 x 1600 ,90,50 MP + 2 MP Dual Rear & 8 MP Front Camera,"Memory Card Supported, upto 1 TB",Android v12
 438,440,xiaomi,Xiaomi Redmi Note 11S (8GB RAM + 128GB),15824,84.0,False,False,True,Helio  G96,helio,octa core, 2.05 GHz Processor,"8 GB RAM, 128 GB inbuilt",5000.0,33, 128 GB inbuilt,8,"6.43 inches, 1080 x 2400 px, 90 Hz Display with Punch Hole",6.43 inches,1080 x 2400 ,90,108 MP Quad Rear & 16 MP Front Camera,"Memory Card Supported, upto 512 GB",Android v11
-439,441,apple,Apple iPhone SE 3 2022,43900,,True,True,False,Bionic  A15,bionic,hexa core, 3.22 GHz Processor,64 GB inbuilt,,-1,,64,"4.7 inches, 750 x 1334 px Display",4.7 inches,750 x 1334 ,60,12 MP Rear & 7 MP Front Camera,Memory Card Not Supported,iOS v15
+439,441,apple,Apple iPhone SE 3 2022,43900,,True,True,False,Bionic  A15,bionic,hexa core, 3.22 GHz Processor,64 GB inbuilt,,-1, 64 GB inbuilt,4,"4.7 inches, 750 x 1334 px Display",4.7 inches,750 x 1334 ,60,12 MP Rear & 7 MP Front Camera,Memory Card Not Supported,iOS v15
 440,442,samsung,Samsung Galaxy A52 (8GB RAM + 128GB),22494,86.0,False,False,False,Snapdragon  720G,snapdragon,octa core, 2.3 GHz Processor,"8 GB RAM, 128 GB inbuilt",4500.0,25, 128 GB inbuilt,8,"6.5 inches, 1080 x 2400 px, 90 Hz Display with Punch Hole",6.5 inches,1080 x 2400 ,90,64 MP Quad Rear & 32 MP Front Camera,"Memory Card Supported, upto 1 TB",Android v11
 441,443,poco,Poco X3 Pro,19650,82.0,False,False,True,Snapdragon 860,snapdragon,octa core, 2.96 GHz Processor,"6 GB RAM, 128 GB inbuilt",5160.0,33, 128 GB inbuilt,6,"6.67 inches, 1080 x 2400 px, 120 Hz Display with Punch Hole",6.67 inches,1080 x 2400 ,120,48 MP Quad Rear & 20 MP Front Camera,Memory Card (Hybrid),Android v11
 442,444,xiaomi,Xiaomi Redmi 9A,6999,61.0,False,False,False,Helio G25,helio,octa core, 2 GHz Processor,"2 GB RAM, 32 GB inbuilt",5000.0,-1, 32 GB inbuilt,2,"6.53 inches, 720 x 1600 px Display with Water Drop Notch",6.53 inches,720 x 1600 ,60,13 MP Rear & 5 MP Front Camera,"Memory Card Supported, upto 512 GB",Android v10
@@ -479,10 +479,10 @@ id,index,brand,model,price,rating,5G,NFC,IR_blaster,processor_name,processor_bra
 480,482,tecno,Tecno Pop 6 Pro,6299,,False,False,False,Helio A22,helio,quad core, 2 GHz Processor,"2 GB RAM, 32 GB inbuilt",5000.0,-1, 32 GB inbuilt,2,"6.56 inches, 720 x 1600 px Display with Water Drop Notch",6.56 inches,720 x 1600 ,60,8 MP Dual Rear & 5 MP Front Camera,"Memory Card Supported, upto 1 TB",Android v12
 481,483,itel,Itel A24 Pro,5990,,False,False,False,Unisoc  SC9832E,unisoc,quad core, 1.4 GHz Processor,"2 GB RAM, 32 GB inbuilt",3020.0,-1, 32 GB inbuilt,2,"5 inches, 854 x 480 px Display",5 inches,854 x 480 ,60,2 MP Rear & 0.3 MP Front Camera,Memory Card Supported,Android v12
 482,484,vivo,Vivo X Fold Plus,113990,,True,True,False,Snapdragon 8+ Gen1,snapdragon,octa core, 3.2 GHz Processor,"12 GB RAM, 256 GB inbuilt",4730.0,80, 256 GB inbuilt,12,"8.03 inches, 1916 x 2160 px, 120 Hz Display with Punch Hole",8.03 inches,1916 x 2160 ,120,50 MP Quad Rear & 16 MP + 16 MP Dual Front Camera,Memory card not supported,
-483,485,huawei,Huawei Mate 50 RS Porsche Design,239999,81.0,False,True,True,Snapdragon 8+ Gen1,snapdragon,octa core, 3.2 GHz Processor,512 GB inbuilt,4700.0,66,,512,"6.74 inches, 1212 x 2616 px, 120 Hz Display",6.74 inches,1212 x 2616 ,120,50 MP + 48 MP + 13 MP Triple Rear & 13 MP Front Camera,"Memory Card (Hybrid), upto 256 GB",Hongmeng OS v3.0
+483,485,huawei,Huawei Mate 50 RS Porsche Design,239999,81.0,False,True,True,Snapdragon 8+ Gen1,snapdragon,octa core, 3.2 GHz Processor,"12 GB RAM,512 GB inbuilt",4700.0,66,512 GB inbuilt,12,"6.74 inches, 1212 x 2616 px, 120 Hz Display",6.74 inches,1212 x 2616 ,120,50 MP + 48 MP + 13 MP Triple Rear & 13 MP Front Camera,"Memory Card (Hybrid), upto 256 GB",Hongmeng OS v3.0
 484,486,samsung,Samsung Galaxy F63,21999,84.0,True,True,False,Dimensity 900,dimensity,octa core, 2 GHz Processor,"6 GB RAM, 128 GB inbuilt",7000.0,33, 128 GB inbuilt,6,"6.7 inches, 1080 x 2400 px Display with Punch Hole",6.7 inches,1080 x 2400 ,60,64 MP Quad Rear & 32 MP Front Camera,"Memory Card Supported, upto 1 TB",Android v12
 485,487,iqoo,iQOO Z6 4G (6GB RAM + 128GB),15999,80.0,False,False,False,Snapdragon  680,snapdragon,octa core, 2.4 GHz Processor,"6 GB RAM, 128 GB inbuilt",5000.0,44, 128 GB inbuilt,6,"6.44 inches, 1080 x 2400 px, 120 Hz Display with Water Drop Notch",6.44 inches,1080 x 2400 ,120,50 MP + 2 MP + 2 MP Triple Rear & 16 MP Front Camera,"Memory Card (Hybrid), upto 1 TB",Android v12
-486,488,nokia,Nokia 8000 4G,6899,,False,False,False,Snapdragon  210,snapdragon,quad core, 1.1 GHz Processor,"512 MB RAM, 4 GB inbuilt",1500.0,-1, 4 GB inbuilt,512,"2.8 inches, 240 x 320 px Display",2.8 inches,240 x 320 ,60,2 MP Rear Camera,Memory Card Supported,
+486,488,nokia,Nokia 8000 4G,6899,,False,False,False,Snapdragon  210,snapdragon,quad core, 1.1 GHz Processor,"512 MB RAM, 4 GB inbuilt",1500.0,-1, 4 GB inbuilt,0.512,"2.8 inches, 240 x 320 px Display",2.8 inches,240 x 320 ,60,2 MP Rear Camera,Memory Card Supported,
 487,489,sony,Sony Xperia 5 II,69990,86.0,True,True,False,Snapdragon 865,snapdragon,octa core, 2.84 GHz Processor,"8 GB RAM, 128 GB inbuilt",4000.0,21, 128 GB inbuilt,8,"6.1 inches, 1080 x 2520 px, 120 Hz Display",6.1 inches,1080 x 2520 ,120,12 MP + 12 MP + 12 MP Triple Rear & 8 MP Front Camera,Memory Card (Hybrid),Android v10
 488,490,vivo,Vivo Y3 (4GB RAM + 128GB),12990,71.0,False,False,False,Helio P35,helio,octa core, 2.3 GHz Processor,"4 GB RAM, 128 GB inbuilt",5000.0,0, 128 GB inbuilt,4,"6.35 inches, 720 x 1544 px Display with Water Drop Notch",6.35 inches,720 x 1544 ,60,13 MP + 8 MP + 2 MP Triple Rear & 16 MP Front Camera,"Memory Card Supported, upto 256 GB",Android v9.0 (Pie)
 489,491,sony,Sony Xperia 1 IV (12GB RAM + 512GB),92980,,True,True,False,Snapdragon 8 Gen1,snapdragon,octa core, 3 GHz Processor,"12 GB RAM, 512 GB inbuilt",5000.0,30, 512 GB inbuilt,12,"6.5 inches, 1644 x 3840 px, 120 Hz Display",6.5 inches,1644 x 3840 ,120,12 MP Quad Rear & 12 MP Front Camera,Memory Card (Hybrid),Android v12
@@ -615,7 +615,7 @@ id,index,brand,model,price,rating,5G,NFC,IR_blaster,processor_name,processor_bra
 624,626,realme,Realme C21Y,6999,62.0,False,False,False,Unisoc T610,unisoc,octa core, 1.8 GHz Processor,"3 GB RAM, 32 GB inbuilt",5000.0,-1, 32 GB inbuilt,3,"6.5 inches, 720 x 1600 px Display with Water Drop Notch",6.5 inches,720 x 1600 ,60,13 MP + 2 MP + 2 MP Triple Rear & 5 MP Front Camera,"Memory Card Supported, upto 256 GB",Android v11
 625,627,oppo,OPPO A16,11999,69.0,False,False,False,Helio G35,helio,octa core, 2.3 GHz Processor,"4 GB RAM, 64 GB inbuilt",5000.0,-1, 64 GB inbuilt,4,"6.52 inches, 720 x 1600 px Display with Water Drop Notch",6.52 inches,720 x 1600 ,60,13 MP + 2 MP + 2 MP Triple Rear & 8 MP Front Camera,Memory Card Supported,Android v11
 626,628,vivo,Vivo V21 5G,23994,85.0,True,False,False,Dimensity 800U,dimensity,octa core, 2.4 GHz Processor,"8 GB RAM, 128 GB inbuilt",4000.0,33, 128 GB inbuilt,8,"6.44 inches, 1080 x 2400 px, 90 Hz Display with Water Drop Notch",6.44 inches,1080 x 2400 ,90,64 MP + 8 MP + 2 MP Triple Rear & 44 MP Front Camera,Memory Card (Hybrid),Android v11
-627,629,nokia,Nokia 225 4G,3589,,False,False,False,Unisoc T117,unisoc,,,"64 MB RAM, 128 MB inbuilt",1150.0,-1, 128 MB inbuilt,64,"2.4 inches, 240 x 320 px Display",2.4 inches,240 x 320 ,60,0.3 MP Rear Camera,"Memory Card Supported, upto 32 GB",RTOS (Series 30+)
+627,629,nokia,Nokia 225 4G,3589,,False,False,False,Unisoc T117,unisoc,,,"64 MB RAM, 128 MB inbuilt",1150.0,-1, 0.128 GB inbuilt,0.064,"2.4 inches, 240 x 320 px Display",2.4 inches,240 x 320 ,60,0.3 MP Rear Camera,"Memory Card Supported, upto 32 GB",RTOS (Series 30+)
 628,630,apple,Apple iPhone 12 Pro (512GB),139900,80.0,True,True,False,Bionic A14,bionic,hexa core, 3.1 GHz Processor,"6 GB RAM, 512 GB inbuilt",,-1, 512 GB inbuilt,6,"6.1 inches, 1170 x 2532 px Display with Large Notch",6.1 inches,1170 x 2532 ,60,12 MP + 12 MP + 12 MP Triple Rear & 12 MP Front Camera,Memory Card Not Supported,iOS v14.0
 629,631,sony,Sony Xperia 1 II,69999,89.0,True,True,False,Snapdragon  865,snapdragon,octa core, 2.84 GHz Processor,"8 GB RAM, 256 GB inbuilt",4000.0,21, 256 GB inbuilt,8,"6.5 inches, 1644 x 3840 px Display",6.5 inches,1644 x 3840 ,60,12 MP Quad Rear & 8 MP Front Camera,Memory Card (Hybrid),Android v10
 630,632,motorola,Motorola Edge Plus,57999,89.0,True,True,False,Snapdragon  865,snapdragon,octa core, 2.84 GHz Processor,"12 GB RAM, 256 GB inbuilt",5000.0,18, 256 GB inbuilt,12,"6.7 inches, 1080 x 2340 px, 90 Hz Display with Punch Hole",6.7 inches,1080 x 2340 ,90,108 MP + 16 MP + 8 MP Triple Rear & 25 MP Front Camera,Memory card not supported,Android v10.0
@@ -740,7 +740,7 @@ id,index,brand,model,price,rating,5G,NFC,IR_blaster,processor_name,processor_bra
 759,761,xiaomi,Xiaomi Redmi K60 Gaming Edition,54990,86.0,True,True,True,Snapdragon 8 Gen2,snapdragon,octa core, 3.2 GHz Processor,"8 GB RAM, 128 GB inbuilt",5000.0,67, 128 GB inbuilt,8,"6.73 inches, 1440 x 3200 px, 120 Hz Display with Punch Hole",6.73 inches,1440 x 3200 ,120,50 MP + 8 MP + 2 MP Triple Rear & 20 MP Front Camera,Memory card not supported,Android v13
 760,762,vivo,Vivo S17 Pro,49990,77.0,True,True,False,Dimensity 9200,dimensity,octa core,,"12 GB RAM, 256 GB inbuilt",5000.0,120, 256 GB inbuilt,12,"6.67 inches, 1080 x 2400 px, 120 Hz Display with Punch Hole",6.67 inches,1080 x 2400 ,120,50 MP + 13 MP + 2 MP Triple Rear & 32 MP Front Camera,Memory card not supported,Android v13
 761,763,honor,Honor 80 Pro Plus,54990,,True,True,False,Snapdragon 8 Gen1,snapdragon,octa core, 3 GHz Processor,"12 GB RAM, 256 GB inbuilt",4500.0,100, 256 GB inbuilt,12,"6.78 inches, 1200 x 2652 px, 120 Hz Display with Punch Hole",6.78 inches,1200 x 2652 ,120,200 MP + 50 MP + 8 MP Triple Rear & 50 MP Front Camera,Memory card not supported,Android v12
-762,764,apple,Apple iPhone SE 4,49990,60.0,True,True,False,Bionic  A15,bionic,hexa core, 3.22 GHz Processor,64 GB inbuilt,,-1,,64,"6.1 inches, 750 x 1580 px Display",6.1 inches,750 x 1580 ,60,12 MP Rear & 10.8 MP Front Camera,Memory Card Not Supported,iOS v16
+762,764,apple,Apple iPhone SE 4,49990,60.0,True,True,False,Bionic  A15,bionic,hexa core, 3.22 GHz Processor,"8 GB RAM, 64 GB inbuilt",,-1, 64 GB inbuilt,8,"6.1 inches, 750 x 1580 px Display",6.1 inches,750 x 1580 ,60,12 MP Rear & 10.8 MP Front Camera,Memory Card Not Supported,iOS v16
 763,765,tecno,Tecno Pova Neo 5G,15499,71.0,False,False,False,Dimensity 810 5G,dimensity,octa core, 2.4 GHz Processor,"4 GB RAM, 128 GB inbuilt",6000.0,18, 128 GB inbuilt,4,"6.8 inches, 1080 x 2400 px, 120 Hz Display with Punch Hole",6.8 inches,1080 x 2400 ,120,50 MP Dual Rear & 8 MP Front Camera,"Memory Card Supported, upto 1 TB",Android v12
 764,766,apple,Apple iPhone 14 Pro Max (512GB),169900,78.0,True,True,False,Bionic  A16,bionic,hexa core,,"6 GB RAM, 512 GB inbuilt",4323.0,0, 512 GB inbuilt,6,"6.7 inches, 1290 x 2796 px, 120 Hz Display",6.7 inches,1290 x 2796 ,120,48 MP + 12 MP + 12 MP Triple Rear & 12 MP Front Camera,Memory Card Not Supported,iOS v16
 765,767,google,Google Pixel 8,53990,75.0,True,True,False,Google Tensor 3,google,octa core,,"8 GB RAM, 128 GB inbuilt",4830.0,67, 128 GB inbuilt,8,"6.6 inches, 1080 x 2400 px, 120 Hz Display with Punch Hole",6.6 inches,1080 x 2400 ,120,50 MP + 8 MP Dual Rear & 10.1 MP Front Camera,Memory card not supported,Android v13
diff --git a/public/main.js b/public/main.js
index 56bceba501b73f2d31db53c08afcd28148741266..edd1a288adf9702e6ae17d34cae7c9bff6e8a6dd 100644
--- a/public/main.js
+++ b/public/main.js
@@ -6268,7 +6268,7 @@ var $author$project$Main$init = function (_v0) {
 			_List_Nil,
 			$elm$core$Maybe$Nothing,
 			'',
-			{att1List: _List_Nil, att2List: _List_Nil, attribute1: 'Price', attribute2: 'Rating'},
+			{att1List: _List_Nil, att2List: _List_Nil, attribute1: 'Price', attribute2: 'Rating', unit1: 'EUR', unit2: '%'},
 			{
 				orderedLabels: _List_fromArray(
 					['Price', 'Rating', 'NumCores', 'Processor Speed', 'Battery', 'Fast Charging', 'Memory', 'RAM', 'Screen Size', 'Refresh Rate']),
@@ -6305,6 +6305,8 @@ var $author$project$Main$init = function (_v0) {
 						return $.refresh_rate;
 					}
 					]),
+				orderedUnitLabels: _List_fromArray(
+					['EUR', '%', '', 'GHz', 'mAh', '', 'GB', 'GB', 'inches', 'Hz']),
 				selectedFilter: {brand: 'all', g5: 'all', ir_blaster: 'all', nfc: 'all'}
 			},
 			{
@@ -6997,57 +6999,77 @@ var $author$project$Main$subscriptions = function (model) {
 };
 var $author$project$Main$createAttList = F2(
 	function (model, att) {
-		return (att === 'Price') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.price;
-			},
-			model.data) : ((att === 'Rating') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.rating;
-			},
-			model.data) : ((att === 'NumCores') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.num_cores;
-			},
-			model.data) : ((att === 'Processor Speed') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.processor_speed;
-			},
-			model.data) : ((att === 'Battery') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.battery;
-			},
-			model.data) : ((att === 'Fast Charging') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.fast_charging;
-			},
-			model.data) : ((att === 'Memory') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.memory;
-			},
-			model.data) : ((att === 'Ram') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.ram;
-			},
-			model.data) : ((att === 'Screen Size') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.screen_size;
-			},
-			model.data) : ((att === 'Refresh Rate') ? A2(
-			$elm$core$List$map,
-			function ($) {
-				return $.refresh_rate;
-			},
-			model.data) : _List_Nil)))))))));
+		return (att === 'Price') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.price;
+				},
+				model.data),
+			'EUR') : ((att === 'Rating') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.rating;
+				},
+				model.data),
+			'%') : ((att === 'NumCores') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.num_cores;
+				},
+				model.data),
+			'') : ((att === 'Processor Speed') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.processor_speed;
+				},
+				model.data),
+			'GHz') : ((att === 'Battery') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.battery;
+				},
+				model.data),
+			'mAh') : ((att === 'Fast Charging') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.fast_charging;
+				},
+				model.data),
+			'') : ((att === 'Memory') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.memory;
+				},
+				model.data),
+			'GB') : ((att === 'RAM') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.ram;
+				},
+				model.data),
+			'GB') : ((att === 'Screen Size') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.screen_size;
+				},
+				model.data),
+			'inches') : ((att === 'Refresh Rate') ? _Utils_Tuple2(
+			A2(
+				$elm$core$List$map,
+				function ($) {
+					return $.refresh_rate;
+				},
+				model.data),
+			'Hz') : _Utils_Tuple2(_List_Nil, ''))))))))));
 	});
 var $elm$core$Platform$Cmd$batch = _Platform_batch;
 var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil);
@@ -8109,6 +8131,272 @@ var $author$project$Main$toCores = function (str) {
 	}
 	return $elm$core$Maybe$Nothing;
 };
+var $elm$core$Basics$not = _Basics_not;
+var $elm$core$Basics$abs = function (n) {
+	return (n < 0) ? (-n) : n;
+};
+var $elm$core$List$any = F2(
+	function (isOkay, list) {
+		any:
+		while (true) {
+			if (!list.b) {
+				return false;
+			} else {
+				var x = list.a;
+				var xs = list.b;
+				if (isOkay(x)) {
+					return true;
+				} else {
+					var $temp$isOkay = isOkay,
+						$temp$list = xs;
+					isOkay = $temp$isOkay;
+					list = $temp$list;
+					continue any;
+				}
+			}
+		}
+	});
+var $elm$core$Basics$neq = _Utils_notEqual;
+var $elm$core$String$foldr = _String_foldr;
+var $elm$core$String$toList = function (string) {
+	return A3($elm$core$String$foldr, $elm$core$List$cons, _List_Nil, string);
+};
+var $myrho$elm_round$Round$addSign = F2(
+	function (signed, str) {
+		var isNotZero = A2(
+			$elm$core$List$any,
+			function (c) {
+				return (!_Utils_eq(
+					c,
+					_Utils_chr('0'))) && (!_Utils_eq(
+					c,
+					_Utils_chr('.')));
+			},
+			$elm$core$String$toList(str));
+		return _Utils_ap(
+			(signed && isNotZero) ? '-' : '',
+			str);
+	});
+var $elm$core$String$fromFloat = _String_fromNumber;
+var $elm$core$Char$fromCode = _Char_fromCode;
+var $myrho$elm_round$Round$increaseNum = function (_v0) {
+	var head = _v0.a;
+	var tail = _v0.b;
+	if (_Utils_eq(
+		head,
+		_Utils_chr('9'))) {
+		var _v1 = $elm$core$String$uncons(tail);
+		if (_v1.$ === 'Nothing') {
+			return '01';
+		} else {
+			var headtail = _v1.a;
+			return A2(
+				$elm$core$String$cons,
+				_Utils_chr('0'),
+				$myrho$elm_round$Round$increaseNum(headtail));
+		}
+	} else {
+		var c = $elm$core$Char$toCode(head);
+		return ((c >= 48) && (c < 57)) ? A2(
+			$elm$core$String$cons,
+			$elm$core$Char$fromCode(c + 1),
+			tail) : '0';
+	}
+};
+var $elm$core$Basics$isInfinite = _Basics_isInfinite;
+var $elm$core$Basics$isNaN = _Basics_isNaN;
+var $elm$core$Bitwise$and = _Bitwise_and;
+var $elm$core$Bitwise$shiftRightBy = _Bitwise_shiftRightBy;
+var $elm$core$String$repeatHelp = F3(
+	function (n, chunk, result) {
+		return (n <= 0) ? result : A3(
+			$elm$core$String$repeatHelp,
+			n >> 1,
+			_Utils_ap(chunk, chunk),
+			(!(n & 1)) ? result : _Utils_ap(result, chunk));
+	});
+var $elm$core$String$repeat = F2(
+	function (n, chunk) {
+		return A3($elm$core$String$repeatHelp, n, chunk, '');
+	});
+var $elm$core$String$padRight = F3(
+	function (n, _char, string) {
+		return _Utils_ap(
+			string,
+			A2(
+				$elm$core$String$repeat,
+				n - $elm$core$String$length(string),
+				$elm$core$String$fromChar(_char)));
+	});
+var $elm$core$String$reverse = _String_reverse;
+var $myrho$elm_round$Round$splitComma = function (str) {
+	var _v0 = A2($elm$core$String$split, '.', str);
+	if (_v0.b) {
+		if (_v0.b.b) {
+			var before = _v0.a;
+			var _v1 = _v0.b;
+			var after = _v1.a;
+			return _Utils_Tuple2(before, after);
+		} else {
+			var before = _v0.a;
+			return _Utils_Tuple2(before, '0');
+		}
+	} else {
+		return _Utils_Tuple2('0', '0');
+	}
+};
+var $elm$core$Tuple$mapFirst = F2(
+	function (func, _v0) {
+		var x = _v0.a;
+		var y = _v0.b;
+		return _Utils_Tuple2(
+			func(x),
+			y);
+	});
+var $myrho$elm_round$Round$toDecimal = function (fl) {
+	var _v0 = A2(
+		$elm$core$String$split,
+		'e',
+		$elm$core$String$fromFloat(
+			$elm$core$Basics$abs(fl)));
+	if (_v0.b) {
+		if (_v0.b.b) {
+			var num = _v0.a;
+			var _v1 = _v0.b;
+			var exp = _v1.a;
+			var e = A2(
+				$elm$core$Maybe$withDefault,
+				0,
+				$elm$core$String$toInt(
+					A2($elm$core$String$startsWith, '+', exp) ? A2($elm$core$String$dropLeft, 1, exp) : exp));
+			var _v2 = $myrho$elm_round$Round$splitComma(num);
+			var before = _v2.a;
+			var after = _v2.b;
+			var total = _Utils_ap(before, after);
+			var zeroed = (e < 0) ? A2(
+				$elm$core$Maybe$withDefault,
+				'0',
+				A2(
+					$elm$core$Maybe$map,
+					function (_v3) {
+						var a = _v3.a;
+						var b = _v3.b;
+						return a + ('.' + b);
+					},
+					A2(
+						$elm$core$Maybe$map,
+						$elm$core$Tuple$mapFirst($elm$core$String$fromChar),
+						$elm$core$String$uncons(
+							_Utils_ap(
+								A2(
+									$elm$core$String$repeat,
+									$elm$core$Basics$abs(e),
+									'0'),
+								total))))) : A3(
+				$elm$core$String$padRight,
+				e + 1,
+				_Utils_chr('0'),
+				total);
+			return _Utils_ap(
+				(fl < 0) ? '-' : '',
+				zeroed);
+		} else {
+			var num = _v0.a;
+			return _Utils_ap(
+				(fl < 0) ? '-' : '',
+				num);
+		}
+	} else {
+		return '';
+	}
+};
+var $myrho$elm_round$Round$roundFun = F3(
+	function (functor, s, fl) {
+		if ($elm$core$Basics$isInfinite(fl) || $elm$core$Basics$isNaN(fl)) {
+			return $elm$core$String$fromFloat(fl);
+		} else {
+			var signed = fl < 0;
+			var _v0 = $myrho$elm_round$Round$splitComma(
+				$myrho$elm_round$Round$toDecimal(
+					$elm$core$Basics$abs(fl)));
+			var before = _v0.a;
+			var after = _v0.b;
+			var r = $elm$core$String$length(before) + s;
+			var normalized = _Utils_ap(
+				A2($elm$core$String$repeat, (-r) + 1, '0'),
+				A3(
+					$elm$core$String$padRight,
+					r,
+					_Utils_chr('0'),
+					_Utils_ap(before, after)));
+			var totalLen = $elm$core$String$length(normalized);
+			var roundDigitIndex = A2($elm$core$Basics$max, 1, r);
+			var increase = A2(
+				functor,
+				signed,
+				A3($elm$core$String$slice, roundDigitIndex, totalLen, normalized));
+			var remains = A3($elm$core$String$slice, 0, roundDigitIndex, normalized);
+			var num = increase ? $elm$core$String$reverse(
+				A2(
+					$elm$core$Maybe$withDefault,
+					'1',
+					A2(
+						$elm$core$Maybe$map,
+						$myrho$elm_round$Round$increaseNum,
+						$elm$core$String$uncons(
+							$elm$core$String$reverse(remains))))) : remains;
+			var numLen = $elm$core$String$length(num);
+			var numZeroed = (num === '0') ? num : ((s <= 0) ? _Utils_ap(
+				num,
+				A2(
+					$elm$core$String$repeat,
+					$elm$core$Basics$abs(s),
+					'0')) : ((_Utils_cmp(
+				s,
+				$elm$core$String$length(after)) < 0) ? (A3($elm$core$String$slice, 0, numLen - s, num) + ('.' + A3($elm$core$String$slice, numLen - s, numLen, num))) : _Utils_ap(
+				before + '.',
+				A3(
+					$elm$core$String$padRight,
+					s,
+					_Utils_chr('0'),
+					after))));
+			return A2($myrho$elm_round$Round$addSign, signed, numZeroed);
+		}
+	});
+var $myrho$elm_round$Round$round = $myrho$elm_round$Round$roundFun(
+	F2(
+		function (signed, str) {
+			var _v0 = $elm$core$String$uncons(str);
+			if (_v0.$ === 'Nothing') {
+				return false;
+			} else {
+				if ('5' === _v0.a.a.valueOf()) {
+					if (_v0.a.b === '') {
+						var _v1 = _v0.a;
+						return !signed;
+					} else {
+						var _v2 = _v0.a;
+						return true;
+					}
+				} else {
+					var _v3 = _v0.a;
+					var _int = _v3.a;
+					return function (i) {
+						return ((i > 53) && signed) || ((i >= 53) && (!signed));
+					}(
+						$elm$core$Char$toCode(_int));
+				}
+			}
+		}));
+var $author$project$Main$toEuro = function (str) {
+	if (str.$ === 'Just') {
+		var price = str.a;
+		return $elm$core$String$toFloat(
+			A2($myrho$elm_round$Round$round, 2, price * 0.011));
+	} else {
+		return $elm$core$Maybe$Nothing;
+	}
+};
 var $elm$core$String$replace = F3(
 	function (before, after, string) {
 		return A2(
@@ -8277,7 +8565,10 @@ var $author$project$Main$decoder = A2(
 																			A2(
 																				$BrianHicks$elm_csv$Csv$Decode$field,
 																				'price',
-																				$BrianHicks$elm_csv$Csv$Decode$blank($BrianHicks$elm_csv$Csv$Decode$float)),
+																				A2(
+																					$BrianHicks$elm_csv$Csv$Decode$map,
+																					$author$project$Main$toEuro,
+																					$BrianHicks$elm_csv$Csv$Decode$blank($BrianHicks$elm_csv$Csv$Decode$float))),
 																			A2(
 																				$BrianHicks$elm_csv$Csv$Decode$pipeline,
 																				A2(
@@ -8309,9 +8600,6 @@ var $elm$core$Basics$min = F2(
 		return (_Utils_cmp(x, y) < 0) ? x : y;
 	});
 var $author$project$TreeView$padding = 30;
-var $elm$core$Basics$abs = function (n) {
-	return (n < 0) ? (-n) : n;
-};
 var $elm$core$Basics$e = _Basics_e;
 var $elm$core$Basics$pow = _Basics_pow;
 var $gampleman$elm_visualization$Zoom$Interpolation$exp = function (x) {
@@ -9179,30 +9467,26 @@ var $author$project$Main$update = F2(
 				switch (msg.a.$) {
 					case 'ChangeAttribute1':
 						var value = msg.a.a;
+						var attList = A2($author$project$Main$createAttList, model, value);
+						var unit = attList.b;
+						var values = attList.a;
 						return _Utils_Tuple2(
 							_Utils_update(
 								model,
 								{
-									scatterplotOptions: {
-										att1List: A2($author$project$Main$createAttList, model, value),
-										att2List: model.scatterplotOptions.att2List,
-										attribute1: value,
-										attribute2: model.scatterplotOptions.attribute2
-									}
+									scatterplotOptions: {att1List: values, att2List: model.scatterplotOptions.att2List, attribute1: value, attribute2: model.scatterplotOptions.attribute2, unit1: unit, unit2: model.scatterplotOptions.unit2}
 								}),
 							$elm$core$Platform$Cmd$none);
 					case 'ChangeAttribute2':
 						var value = msg.a.a;
+						var attList = A2($author$project$Main$createAttList, model, value);
+						var unit = attList.b;
+						var values = attList.a;
 						return _Utils_Tuple2(
 							_Utils_update(
 								model,
 								{
-									scatterplotOptions: {
-										att1List: model.scatterplotOptions.att1List,
-										att2List: A2($author$project$Main$createAttList, model, value),
-										attribute1: model.scatterplotOptions.attribute1,
-										attribute2: value
-									}
+									scatterplotOptions: {att1List: model.scatterplotOptions.att1List, att2List: values, attribute1: model.scatterplotOptions.attribute1, attribute2: value, unit1: model.scatterplotOptions.unit1, unit2: unit}
 								}),
 							$elm$core$Platform$Cmd$none);
 					default:
@@ -9235,6 +9519,7 @@ var $author$project$Main$update = F2(
 									parallelPlotOption: {
 										orderedLabels: A3($elm_community$list_extra$List$Extra$swapAt, pos1, pos2, model.parallelPlotOption.orderedLabels),
 										orderedList: A3($elm_community$list_extra$List$Extra$swapAt, pos1, pos2, model.parallelPlotOption.orderedList),
+										orderedUnitLabels: A3($elm_community$list_extra$List$Extra$swapAt, pos1, pos2, model.parallelPlotOption.orderedUnitLabels),
 										selectedFilter: model.parallelPlotOption.selectedFilter
 									}
 								}),
@@ -9243,17 +9528,18 @@ var $author$project$Main$update = F2(
 						var _v3 = msg.a;
 						var att1 = _v3.a;
 						var att2 = _v3.b;
+						var attList2 = A2($author$project$Main$createAttList, model, att2);
+						var unit2 = attList2.b;
+						var values2 = attList2.a;
+						var attList1 = A2($author$project$Main$createAttList, model, att1);
+						var unit1 = attList1.b;
+						var values1 = attList1.a;
 						return _Utils_Tuple2(
 							_Utils_update(
 								model,
 								{
 									plotVisible: {parallelCoordinatesPlot: false, scatterPlot: true, starPlot: false, treeView: false},
-									scatterplotOptions: {
-										att1List: A2($author$project$Main$createAttList, model, att1),
-										att2List: A2($author$project$Main$createAttList, model, att2),
-										attribute1: att1,
-										attribute2: att2
-									}
+									scatterplotOptions: {att1List: values1, att2List: values2, attribute1: att1, attribute2: att2, unit1: unit1, unit2: unit2}
 								}),
 							$elm$core$Platform$Cmd$none);
 					case 'SetBrandParallel':
@@ -9265,6 +9551,7 @@ var $author$project$Main$update = F2(
 									parallelPlotOption: {
 										orderedLabels: model.parallelPlotOption.orderedLabels,
 										orderedList: model.parallelPlotOption.orderedList,
+										orderedUnitLabels: model.parallelPlotOption.orderedUnitLabels,
 										selectedFilter: {brand: value, g5: model.parallelPlotOption.selectedFilter.g5, ir_blaster: model.parallelPlotOption.selectedFilter.ir_blaster, nfc: model.parallelPlotOption.selectedFilter.nfc}
 									}
 								}),
@@ -9278,6 +9565,7 @@ var $author$project$Main$update = F2(
 									parallelPlotOption: {
 										orderedLabels: model.parallelPlotOption.orderedLabels,
 										orderedList: model.parallelPlotOption.orderedList,
+										orderedUnitLabels: model.parallelPlotOption.orderedUnitLabels,
 										selectedFilter: {brand: model.parallelPlotOption.selectedFilter.brand, g5: value, ir_blaster: model.parallelPlotOption.selectedFilter.ir_blaster, nfc: model.parallelPlotOption.selectedFilter.nfc}
 									}
 								}),
@@ -9291,6 +9579,7 @@ var $author$project$Main$update = F2(
 									parallelPlotOption: {
 										orderedLabels: model.parallelPlotOption.orderedLabels,
 										orderedList: model.parallelPlotOption.orderedList,
+										orderedUnitLabels: model.parallelPlotOption.orderedUnitLabels,
 										selectedFilter: {brand: model.parallelPlotOption.selectedFilter.brand, g5: model.parallelPlotOption.selectedFilter.g5, ir_blaster: model.parallelPlotOption.selectedFilter.ir_blaster, nfc: value}
 									}
 								}),
@@ -9304,6 +9593,7 @@ var $author$project$Main$update = F2(
 									parallelPlotOption: {
 										orderedLabels: model.parallelPlotOption.orderedLabels,
 										orderedList: model.parallelPlotOption.orderedList,
+										orderedUnitLabels: model.parallelPlotOption.orderedUnitLabels,
 										selectedFilter: {brand: model.parallelPlotOption.selectedFilter.brand, g5: model.parallelPlotOption.selectedFilter.g5, ir_blaster: value, nfc: model.parallelPlotOption.selectedFilter.nfc}
 									}
 								}),
@@ -9667,7 +9957,6 @@ var $author$project$ParallelCoordinates$fromBrand = F2(
 			model.parallelPlotOption.selectedFilter.brand,
 			A2($elm$core$Maybe$withDefault, '', smartphone.brand)) || (model.parallelPlotOption.selectedFilter.brand === 'all')) ? true : false;
 	});
-var $elm$core$Basics$not = _Basics_not;
 var $author$project$ParallelCoordinates$has5G = F2(
 	function (model, smartphone) {
 		return (((model.parallelPlotOption.selectedFilter.g5 === 'true') && A2($elm$core$Maybe$withDefault, false, smartphone.g5)) || (model.parallelPlotOption.selectedFilter.g5 === 'all')) ? true : (((model.parallelPlotOption.selectedFilter.g5 === 'false') && (!A2($elm$core$Maybe$withDefault, true, smartphone.g5))) ? true : false);
@@ -10160,7 +10449,6 @@ var $folkertdev$one_true_path_experiment$SubPath$toLowLevel = function (subpath)
 			});
 	}
 };
-var $elm$core$String$fromFloat = _String_fromNumber;
 var $folkertdev$svg_path_lowlevel$Path$LowLevel$defaultConfig = {floatFormatter: $elm$core$String$fromFloat};
 var $elm$core$Basics$round = _Basics_round;
 var $folkertdev$svg_path_lowlevel$Path$LowLevel$roundTo = F2(
@@ -10994,8 +11282,8 @@ var $gampleman$elm_visualization$Axis$left = A4($gampleman$elm_visualization$Axi
 var $author$project$ParallelCoordinates$yAxis = function (scale) {
 	return A2($gampleman$elm_visualization$Axis$left, _List_Nil, scale);
 };
-var $author$project$ParallelCoordinates$createYAxis = F4(
-	function (scaleX, model, scaleY, text) {
+var $author$project$ParallelCoordinates$createYAxis = F5(
+	function (scaleX, model, scaleY, text, unit) {
 		var index = scaleY.a;
 		var indexF = index;
 		var indexafter = (index === 9) ? 0 : (index + 1);
@@ -11071,7 +11359,7 @@ var $author$project$ParallelCoordinates$createYAxis = F4(
 					$elm_community$typed_svg$TypedSvg$text_,
 					_List_fromArray(
 						[
-							$elm_community$typed_svg$TypedSvg$Attributes$InPx$y(-10),
+							$elm_community$typed_svg$TypedSvg$Attributes$InPx$y(-14),
 							$elm_community$typed_svg$TypedSvg$Attributes$textAnchor($elm_community$typed_svg$TypedSvg$Types$AnchorMiddle),
 							$elm_community$typed_svg$TypedSvg$Attributes$fontSize(
 							$elm_community$typed_svg$TypedSvg$Types$Px(14)),
@@ -11081,6 +11369,21 @@ var $author$project$ParallelCoordinates$createYAxis = F4(
 					_List_fromArray(
 						[
 							$elm$html$Html$text(text)
+						])),
+					A2(
+					$elm_community$typed_svg$TypedSvg$text_,
+					_List_fromArray(
+						[
+							$elm_community$typed_svg$TypedSvg$Attributes$InPx$y(-5),
+							$elm_community$typed_svg$TypedSvg$Attributes$textAnchor($elm_community$typed_svg$TypedSvg$Types$AnchorMiddle),
+							$elm_community$typed_svg$TypedSvg$Attributes$fontSize(
+							$elm_community$typed_svg$TypedSvg$Types$Px(8)),
+							$elm$html$Html$Events$onClick(
+							A2($author$project$ParallelCoordinates$SetScatterPlotFromParallelPlot, att1, att2))
+						]),
+					_List_fromArray(
+						[
+							$elm$html$Html$text(unit)
 						]))
 				]));
 	});
@@ -11333,7 +11636,6 @@ var $elm_community$typed_svg$TypedSvg$Attributes$width = function (length) {
 var $gampleman$elm_visualization$Scale$Scale = function (a) {
 	return {$: 'Scale', a: a};
 };
-var $elm$core$Basics$isNaN = _Basics_isNaN;
 var $gampleman$elm_visualization$Scale$Continuous$normalize = F2(
 	function (a, b) {
 		var c = b - a;
@@ -11524,29 +11826,6 @@ var $gampleman$elm_visualization$Statistics$tickStep = F3(
 			$elm$core$Basics$sqrt(2)) > -1) ? (step1 * 2) : step1));
 		return (_Utils_cmp(stop, start) < 0) ? (-step2) : step2;
 	});
-var $elm$core$Bitwise$and = _Bitwise_and;
-var $elm$core$Bitwise$shiftRightBy = _Bitwise_shiftRightBy;
-var $elm$core$String$repeatHelp = F3(
-	function (n, chunk, result) {
-		return (n <= 0) ? result : A3(
-			$elm$core$String$repeatHelp,
-			n >> 1,
-			_Utils_ap(chunk, chunk),
-			(!(n & 1)) ? result : _Utils_ap(result, chunk));
-	});
-var $elm$core$String$repeat = F2(
-	function (n, chunk) {
-		return A3($elm$core$String$repeatHelp, n, chunk, '');
-	});
-var $elm$core$String$padRight = F3(
-	function (n, _char, string) {
-		return _Utils_ap(
-			string,
-			A2(
-				$elm$core$String$repeat,
-				n - $elm$core$String$length(string),
-				$elm$core$String$fromChar(_char)));
-	});
 var $gampleman$elm_visualization$Scale$Continuous$toFixed = F2(
 	function (precision, value) {
 		var power_ = A2($elm$core$Basics$pow, 10, precision);
@@ -11816,11 +12095,12 @@ var $author$project$ParallelCoordinates$parallelCoordinatesPlot = F2(
 			$elm$core$List$indexedMap,
 			$elm$core$Tuple$pair,
 			A2($elm$core$List$map, $author$project$ParallelCoordinates$yScale, yValues));
-		var yaxis = A3(
-			$elm$core$List$map2,
+		var yaxis = A4(
+			$elm$core$List$map3,
 			A2($author$project$ParallelCoordinates$createYAxis, xScaleLocal, model),
 			yScaleLocalsWithIndex,
-			multidimStrings);
+			multidimStrings,
+			model.parallelPlotOption.orderedUnitLabels);
 		var yValue1 = A2(
 			$elm$core$Maybe$withDefault,
 			_List_Nil,
@@ -11932,7 +12212,7 @@ var $author$project$ParallelCoordinates$viewParallelCoordinates = function (mode
 						_List_Nil,
 						_List_fromArray(
 							[
-								$elm$html$Html$text('Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,')
+								$elm$html$Html$text('Hints: By clicking on a axis label, you switch to the scatterplot with clicked axis label as x-value and the following label as y-value. By hovering over an axis, the axis values are displayed. By clicking on the <<< or >>> you can switch the axis backward or forward. You can select different filters to bound the result.')
 							]))
 					])),
 				A2(
@@ -12102,9 +12382,9 @@ var $author$project$Scatterplot$attributeSelector = F2(
 				$author$project$Scatterplot$createSelectorOptions(att2),
 				attributes));
 	});
-var $author$project$Scatterplot$XyData = F3(
-	function (xDescription, yDescription, data) {
-		return {data: data, xDescription: xDescription, yDescription: yDescription};
+var $author$project$Scatterplot$XyData = F5(
+	function (xDescription, yDescription, unitX, unitY, data) {
+		return {data: data, unitX: unitX, unitY: unitY, xDescription: xDescription, yDescription: yDescription};
 	});
 var $elm$core$List$map4 = _List_map4;
 var $elm$core$Maybe$map4 = F5(
@@ -12174,10 +12454,10 @@ var $author$project$Scatterplot$filterSmartphonesXY = F3(
 			modelList,
 			idList);
 		var filteredSmartphones = A2($elm$core$List$filterMap, $author$project$Scatterplot$mapToPoint, smartphoneDataList);
-		return A3($author$project$Scatterplot$XyData, model.scatterplotOptions.attribute1, model.scatterplotOptions.attribute2, filteredSmartphones);
+		return A5($author$project$Scatterplot$XyData, model.scatterplotOptions.attribute1, model.scatterplotOptions.attribute2, model.scatterplotOptions.unit1, model.scatterplotOptions.unit2, filteredSmartphones);
 	});
 var $author$project$Scatterplot$h = 430;
-var $author$project$Scatterplot$padding = 30;
+var $author$project$Scatterplot$padding = 50;
 var $author$project$Scatterplot$SetStarPlot = function (a) {
 	return {$: 'SetStarPlot', a: a};
 };
@@ -12384,7 +12664,7 @@ var $author$project$Scatterplot$scatterplot = function (model) {
 						_List_fromArray(
 							[
 								$elm_community$typed_svg$TypedSvg$Attributes$InPx$x(
-								A2($gampleman$elm_visualization$Scale$convert, xScaleLocal, labelPositions.x)),
+								A2($gampleman$elm_visualization$Scale$convert, xScaleLocal, labelPositions.x) - 10),
 								$elm_community$typed_svg$TypedSvg$Attributes$InPx$y(30),
 								$elm_community$typed_svg$TypedSvg$Attributes$textAnchor($elm_community$typed_svg$TypedSvg$Types$AnchorMiddle),
 								$elm_community$typed_svg$TypedSvg$Attributes$fontSize(
@@ -12392,7 +12672,12 @@ var $author$project$Scatterplot$scatterplot = function (model) {
 							]),
 						_List_fromArray(
 							[
-								$elm$html$Html$text(model.xDescription)
+								$elm$html$Html$text(
+								_Utils_ap(
+									model.xDescription,
+									_Utils_ap(
+										($elm$core$String$length(model.unitX) > 0) ? ' in ' : '',
+										model.unitX)))
 							]))
 					])),
 				A2(
@@ -12412,7 +12697,7 @@ var $author$project$Scatterplot$scatterplot = function (model) {
 						$elm_community$typed_svg$TypedSvg$text_,
 						_List_fromArray(
 							[
-								$elm_community$typed_svg$TypedSvg$Attributes$InPx$x(0),
+								$elm_community$typed_svg$TypedSvg$Attributes$InPx$x(10),
 								$elm_community$typed_svg$TypedSvg$Attributes$InPx$y(
 								A2($gampleman$elm_visualization$Scale$convert, yScaleLocal, labelPositions.y) - 10),
 								$elm_community$typed_svg$TypedSvg$Attributes$textAnchor($elm_community$typed_svg$TypedSvg$Types$AnchorMiddle),
@@ -12421,7 +12706,12 @@ var $author$project$Scatterplot$scatterplot = function (model) {
 							]),
 						_List_fromArray(
 							[
-								$elm$html$Html$text(model.yDescription)
+								$elm$html$Html$text(
+								_Utils_ap(
+									model.yDescription,
+									_Utils_ap(
+										($elm$core$String$length(model.unitY) > 0) ? ' in ' : '',
+										model.unitY)))
 							]))
 					])),
 				A2(
@@ -12475,7 +12765,7 @@ var $author$project$Scatterplot$viewScatterplot = function (model) {
 						_List_Nil,
 						_List_fromArray(
 							[
-								$elm$html$Html$text('Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,')
+								$elm$html$Html$text('Hints: By clicking on a point, the plot switch to the star plot and show the point data. By hovering over a point, you get the model name, ID und the exactly x and y values.')
 							]))
 					])),
 				A2(
@@ -12595,8 +12885,8 @@ var $author$project$Starplot$createAxis = function (axisPoint) {
 			]));
 };
 var $elm$core$Debug$toString = _Debug_toString;
-var $author$project$Starplot$createLabels = F3(
-	function (label, vlabel, labelPoint) {
+var $author$project$Starplot$createLabels = F4(
+	function (label, vlabel, unit, labelPoint) {
 		return A2(
 			$elm_community$typed_svg$TypedSvg$g,
 			_List_fromArray(
@@ -12649,7 +12939,7 @@ var $author$project$Starplot$createLabels = F3(
 							_List_fromArray(
 								[
 									$elm$html$Html$text(
-									(vlabel < 0) ? 'NaN' : $elm$core$Debug$toString(vlabel))
+									(vlabel < 0) ? 'NaN' : ($elm$core$Debug$toString(vlabel) + (' ' + unit)))
 								]))
 						]))
 				]));
@@ -12662,8 +12952,8 @@ var $elm_community$typed_svg$TypedSvg$Attributes$InPx$strokeWidth = function (va
 		$elm_community$typed_svg$TypedSvg$Types$px(value));
 };
 var $author$project$Starplot$w = 990;
-var $author$project$Starplot$starplot = F4(
-	function (smartphone, starValues, labels, func) {
+var $author$project$Starplot$starplot = F5(
+	function (smartphone, starValues, labels, unit, func) {
 		var valueLabel = A2(
 			$elm$core$List$map,
 			function (f) {
@@ -12676,11 +12966,12 @@ var $author$project$Starplot$starplot = F4(
 				}
 			},
 			func);
-		var starLabel = A4(
-			$elm$core$List$map3,
+		var starLabel = A5(
+			$elm$core$List$map4,
 			$author$project$Starplot$createLabels,
 			labels,
 			valueLabel,
+			unit,
 			_List_fromArray(
 				[
 					_Utils_Tuple2(0, -1.1),
@@ -12882,6 +13173,8 @@ var $author$project$Starplot$starplot = F4(
 						starAxisMax))));
 	});
 var $author$project$Starplot$viewStarplot = function (model) {
+	var unit = _List_fromArray(
+		['EUR', '%', '', 'GHz', 'mAh', '', 'GB', 'GB', 'inches', 'Hz']);
 	var starplotViewHead = F2(
 		function (spd1, spd2) {
 			return A2(
@@ -12905,7 +13198,7 @@ var $author$project$Starplot$viewStarplot = function (model) {
 								_List_Nil,
 								_List_fromArray(
 									[
-										$elm$html$Html$text('Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,')
+										$elm$html$Html$text('You can compare two smartphones at the same time. Each of the two starplots has an input field where an ID from a smartphone can be entered to display it in the starplot. By hovering over a plot label, you can see the exactly value for the label.')
 									]))
 							])),
 						A2(
@@ -13151,7 +13444,7 @@ var $author$project$Starplot$viewStarplot = function (model) {
 				function () {
 				if (starplotData1.$ === 'Just') {
 					var spd1 = starplotData1.a;
-					return A4($author$project$Starplot$starplot, spd1, starValues1, labels, smartphoneFunctions);
+					return A5($author$project$Starplot$starplot, spd1, starValues1, labels, unit, smartphoneFunctions);
 				} else {
 					return A2(
 						$elm$html$Html$div,
@@ -13165,7 +13458,7 @@ var $author$project$Starplot$viewStarplot = function (model) {
 				function () {
 				if (starplotData2.$ === 'Just') {
 					var spd2 = starplotData2.a;
-					return A4($author$project$Starplot$starplot, spd2, starValues2, labels, smartphoneFunctions);
+					return A5($author$project$Starplot$starplot, spd2, starValues2, labels, unit, smartphoneFunctions);
 				} else {
 					return A2(
 						$elm$html$Html$div,
@@ -14657,7 +14950,6 @@ var $gampleman$elm_visualization$Hierarchy$Tidy$contourNext = F2(
 			return contour;
 		}
 	});
-var $elm$core$Basics$neq = _Utils_notEqual;
 var $gampleman$elm_visualization$Hierarchy$Tidy$moveSubtree = F5(
 	function (currentIndex, fromMaybe, currentId, dist, lay) {
 		if (fromMaybe.$ === 'Just') {
@@ -16223,7 +16515,7 @@ var $author$project$TreeView$viewTree = function (model) {
 						_List_Nil,
 						_List_fromArray(
 							[
-								$elm$html$Html$text('Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,')
+								$elm$html$Html$text('Hints: By scrolling you can zoom out or in the visualization and you can move the tree. By clicking on a node (not a leaf), the tree focuses and zooms on this node. By clicking on a leaf node, you switch to the starplot of the node. You can select different filters to bound the result.')
 							]))
 					])),
 				A2(
diff --git a/src/Main.elm b/src/Main.elm
index 3f872cb45bdfb458c385d841efcc082a37bf4bac..b0307e8e67ca4844905978edf5358a024f895f0a 100644
--- a/src/Main.elm
+++ b/src/Main.elm
@@ -10,6 +10,7 @@ import List.Extra
 import Model exposing (Model)
 import ParallelCoordinates exposing (Msg(..))
 import Result exposing (Result(..))
+import Round
 import Scatterplot exposing (Msg(..))
 import SmartPhoneType exposing (Smartphone)
 import Starplot exposing (Msg(..))
@@ -32,7 +33,7 @@ init _ =
     ( Model []
         Nothing
         ""
-        { attribute1 = "Price", attribute2 = "Rating", att1List = [], att2List = [] }
+        { attribute1 = "Price", attribute2 = "Rating", att1List = [], att2List = [], unit1 = "EUR", unit2 = "%" }
         { orderedList =
             [ .price
             , .rating
@@ -57,6 +58,18 @@ init _ =
             , "Screen Size"
             , "Refresh Rate"
             ]
+        , orderedUnitLabels =
+            [ "EUR"
+            , "%"
+            , ""
+            , "GHz"
+            , "mAh"
+            , ""
+            , "GB"
+            , "GB"
+            , "inches"
+            , "Hz"
+            ]
         , selectedFilter =
             { brand = "all"
             , g5 = "all"
@@ -132,24 +145,48 @@ update msg model =
             ( { model | error = Just "Failed to load data" }, Cmd.none )
 
         ScatterplotMsg (ChangeAttribute1 value) ->
+            let
+                attList =
+                    createAttList model value
+
+                values =
+                    Tuple.first attList
+
+                unit =
+                    Tuple.second attList
+            in
             ( { model
                 | scatterplotOptions =
                     { attribute1 = value
                     , attribute2 = model.scatterplotOptions.attribute2
-                    , att1List = createAttList model value
+                    , att1List = values
                     , att2List = model.scatterplotOptions.att2List
+                    , unit1 = unit
+                    , unit2 = model.scatterplotOptions.unit2
                     }
               }
             , Cmd.none
             )
 
         ScatterplotMsg (ChangeAttribute2 value) ->
+            let
+                attList =
+                    createAttList model value
+
+                values =
+                    Tuple.first attList
+
+                unit =
+                    Tuple.second attList
+            in
             ( { model
                 | scatterplotOptions =
                     { attribute1 = model.scatterplotOptions.attribute1
                     , attribute2 = value
                     , att1List = model.scatterplotOptions.att1List
-                    , att2List = createAttList model value
+                    , att2List = values
+                    , unit1 = model.scatterplotOptions.unit1
+                    , unit2 = unit
                     }
               }
             , Cmd.none
@@ -189,6 +226,7 @@ update msg model =
                 | parallelPlotOption =
                     { orderedList = List.Extra.swapAt pos1 pos2 model.parallelPlotOption.orderedList
                     , orderedLabels = List.Extra.swapAt pos1 pos2 model.parallelPlotOption.orderedLabels
+                    , orderedUnitLabels = List.Extra.swapAt pos1 pos2 model.parallelPlotOption.orderedUnitLabels
                     , selectedFilter = model.parallelPlotOption.selectedFilter
                     }
               }
@@ -196,12 +234,33 @@ update msg model =
             )
 
         ParallelCoordinatesMsg (SetScatterPlotFromParallelPlot att1 att2) ->
+            let
+                attList1 =
+                    createAttList model att1
+
+                attList2 =
+                    createAttList model att2
+
+                values1 =
+                    Tuple.first attList1
+
+                unit1 =
+                    Tuple.second attList1
+
+                values2 =
+                    Tuple.first attList2
+
+                unit2 =
+                    Tuple.second attList2
+            in
             ( { model
                 | scatterplotOptions =
                     { attribute1 = att1
                     , attribute2 = att2
-                    , att1List = createAttList model att1
-                    , att2List = createAttList model att2
+                    , att1List = values1
+                    , att2List = values2
+                    , unit1 = unit1
+                    , unit2 = unit2
                     }
                 , plotVisible = { scatterPlot = True, parallelCoordinatesPlot = False, treeView = False, starPlot = False }
               }
@@ -213,6 +272,7 @@ update msg model =
                 | parallelPlotOption =
                     { orderedList = model.parallelPlotOption.orderedList
                     , orderedLabels = model.parallelPlotOption.orderedLabels
+                    , orderedUnitLabels = model.parallelPlotOption.orderedUnitLabels
                     , selectedFilter =
                         { brand = value
                         , g5 = model.parallelPlotOption.selectedFilter.g5
@@ -229,6 +289,7 @@ update msg model =
                 | parallelPlotOption =
                     { orderedList = model.parallelPlotOption.orderedList
                     , orderedLabels = model.parallelPlotOption.orderedLabels
+                    , orderedUnitLabels = model.parallelPlotOption.orderedUnitLabels
                     , selectedFilter =
                         { brand = model.parallelPlotOption.selectedFilter.brand
                         , g5 = value
@@ -245,6 +306,7 @@ update msg model =
                 | parallelPlotOption =
                     { orderedList = model.parallelPlotOption.orderedList
                     , orderedLabels = model.parallelPlotOption.orderedLabels
+                    , orderedUnitLabels = model.parallelPlotOption.orderedUnitLabels
                     , selectedFilter =
                         { brand = model.parallelPlotOption.selectedFilter.brand
                         , g5 = model.parallelPlotOption.selectedFilter.g5
@@ -261,6 +323,7 @@ update msg model =
                 | parallelPlotOption =
                     { orderedList = model.parallelPlotOption.orderedList
                     , orderedLabels = model.parallelPlotOption.orderedLabels
+                    , orderedUnitLabels = model.parallelPlotOption.orderedUnitLabels
                     , selectedFilter =
                         { brand = model.parallelPlotOption.selectedFilter.brand
                         , g5 = model.parallelPlotOption.selectedFilter.g5
@@ -516,40 +579,40 @@ update msg model =
             ( { model | plotVisible = { scatterPlot = False, parallelCoordinatesPlot = False, treeView = False, starPlot = True } }, Cmd.none )
 
 
-createAttList : Model -> String -> List (Maybe Float)
+createAttList : Model -> String -> ( List (Maybe Float), String )
 createAttList model att =
     if att == "Price" then
-        List.map .price model.data
+        ( List.map .price model.data, "EUR" )
 
     else if att == "Rating" then
-        List.map .rating model.data
+        ( List.map .rating model.data, "%" )
 
     else if att == "NumCores" then
-        List.map .num_cores model.data
+        ( List.map .num_cores model.data, "" )
 
     else if att == "Processor Speed" then
-        List.map .processor_speed model.data
+        ( List.map .processor_speed model.data, "GHz" )
 
     else if att == "Battery" then
-        List.map .battery model.data
+        ( List.map .battery model.data, "mAh" )
 
     else if att == "Fast Charging" then
-        List.map .fast_charging model.data
+        ( List.map .fast_charging model.data, "" )
 
     else if att == "Memory" then
-        List.map .memory model.data
+        ( List.map .memory model.data, "GB" )
 
-    else if att == "Ram" then
-        List.map .ram model.data
+    else if att == "RAM" then
+        ( List.map .ram model.data, "GB" )
 
     else if att == "Screen Size" then
-        List.map .screen_size model.data
+        ( List.map .screen_size model.data, "inches" )
 
     else if att == "Refresh Rate" then
-        List.map .refresh_rate model.data
+        ( List.map .refresh_rate model.data, "Hz" )
 
     else
-        []
+        ( [], "" )
 
 
 
@@ -616,7 +679,7 @@ decoder =
         |> Decode.pipeline (Decode.field "id" (Decode.blank Decode.string))
         |> Decode.pipeline (Decode.field "brand" (Decode.blank Decode.string))
         |> Decode.pipeline (Decode.field "model" (Decode.blank Decode.string))
-        |> Decode.pipeline (Decode.field "price" (Decode.blank Decode.float))
+        |> Decode.pipeline (Decode.field "price" (Decode.blank Decode.float |> Decode.map toEuro))
         |> Decode.pipeline (Decode.field "rating" (Decode.blank Decode.float))
         |> Decode.pipeline (Decode.field "5G" (Decode.blank Decode.string |> Decode.map toBool))
         |> Decode.pipeline (Decode.field "NFC" (Decode.blank Decode.string |> Decode.map toBool))
@@ -642,6 +705,20 @@ parseCSV csv =
     Decode.decodeCsv Decode.FieldNamesFromFirstRow decoder csv
 
 
+
+-- Umrechung Indische Rupie in Euro ungefähr
+
+
+toEuro : Maybe Float -> Maybe Float
+toEuro str =
+    case str of
+        Just price ->
+            String.toFloat <| Round.round 2 <| price * 0.011
+
+        _ ->
+            Nothing
+
+
 toBool : Maybe String -> Maybe Bool
 toBool str =
     case str of
diff --git a/src/Model.elm b/src/Model.elm
index a0764f60dc84cc0f35ca19cd104fbdabe2a3799c..21028ca61728cf4db69fe26618d5109eeb39bf16 100644
--- a/src/Model.elm
+++ b/src/Model.elm
@@ -26,12 +26,15 @@ type alias ScatterPlotOption =
     , attribute2 : String
     , att1List : List (Maybe Float)
     , att2List : List (Maybe Float)
+    , unit1 : String
+    , unit2 : String
     }
 
 
 type alias ParallelPlotOption =
     { orderedList : List (Smartphone -> Maybe Float)
     , orderedLabels : List String
+    , orderedUnitLabels : List String
     , selectedFilter : FilterOptions
     }
 
diff --git a/src/ParallelCoordinates.elm b/src/ParallelCoordinates.elm
index 039cb146c248662e1c8879d5f6ae785de982471e..5d1df27e59874f482060a5c4bc7e8b700a58622d 100644
--- a/src/ParallelCoordinates.elm
+++ b/src/ParallelCoordinates.elm
@@ -98,7 +98,7 @@ parallelCoordinatesPlot model smartphonesList =
             xScale (List.map toFloat (List.range 0 dimLen))
 
         yaxis =
-            List.map2 (createYAxis xScaleLocal model) yScaleLocalsWithIndex multidimStrings
+            List.map3 (createYAxis xScaleLocal model) yScaleLocalsWithIndex multidimStrings model.parallelPlotOption.orderedUnitLabels
 
         yValue1 =
             Maybe.withDefault [] <| List.head yValues
@@ -177,8 +177,8 @@ createLine path =
         ]
 
 
-createYAxis : ContinuousScale Float -> Model -> ( Int, ContinuousScale Float ) -> String -> Svg Msg
-createYAxis scaleX model scaleY text =
+createYAxis : ContinuousScale Float -> Model -> ( Int, ContinuousScale Float ) -> String -> String -> Svg Msg
+createYAxis scaleX model scaleY text unit =
     let
         index =
             Tuple.first scaleY
@@ -215,8 +215,11 @@ createYAxis scaleX model scaleY text =
             [ x 10, y -30, textAnchor AnchorStart, fontSize <| Px 10, onClick (ChangeOrder index indexafter) ]
             [ Html.text ">>>" ]
         , text_
-            [ y -10, textAnchor AnchorMiddle, fontSize <| Px 14, onClick (SetScatterPlotFromParallelPlot att1 att2) ]
+            [ y -14, textAnchor AnchorMiddle, fontSize <| Px 14, onClick (SetScatterPlotFromParallelPlot att1 att2) ]
             [ Html.text text ]
+        , text_
+            [ y -5, textAnchor AnchorMiddle, fontSize <| Px 8, onClick (SetScatterPlotFromParallelPlot att1 att2) ]
+            [ Html.text unit ]
         ]
 
 
@@ -369,7 +372,7 @@ viewParallelCoordinates model =
             [ "all", "true", "false" ]
     in
     Html.div []
-        [ Html.div [ class [ "description" ], align "center" ] [ Html.b [] [ Html.text "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren," ] ]
+        [ Html.div [ class [ "description" ], align "center" ] [ Html.b [] [ Html.text "Hints: By clicking on a axis label, you switch to the scatterplot with clicked axis label as x-value and the following label as y-value. By hovering over an axis, the axis values are displayed. By clicking on the <<< or >>> you can switch the axis backward or forward. You can select different filters to bound the result." ] ]
         , Html.span [ class [ "plotAttributeSelect" ] ] [ b [] [ text " Brand: " ] ]
         , select [ onInput SetBrandParallel ] (List.map (createSelectorOptions model.parallelPlotOption.selectedFilter.brand) brandFilterValues)
         , Html.span [ class [ "plotAttributeSelect" ] ]
diff --git a/src/Scatterplot.elm b/src/Scatterplot.elm
index 97619df2abab1539ffaaece761f1e3f434e8c26e..d9545a8dcdaf49b4b424bb0c75d845240c81290c 100644
--- a/src/Scatterplot.elm
+++ b/src/Scatterplot.elm
@@ -26,7 +26,7 @@ h =
 
 padding : Float
 padding =
-    30
+    50
 
 
 radius : Float
@@ -87,14 +87,32 @@ scatterplot model =
         , g [ transform [ Translate (padding - 1) (h - padding - 1) ] ]
             [ xAxis xValues
             , text_
-                [ x (Scale.convert xScaleLocal labelPositions.x), y 30, textAnchor AnchorMiddle, fontSize <| Px 14 ]
-                [ Html.text model.xDescription ]
+                [ x (Scale.convert xScaleLocal labelPositions.x - 10), y 30, textAnchor AnchorMiddle, fontSize <| Px 14 ]
+                [ Html.text <|
+                    model.xDescription
+                        ++ (if String.length model.unitX > 0 then
+                                " in "
+
+                            else
+                                ""
+                           )
+                        ++ model.unitX
+                ]
             ]
         , g [ transform [ Translate (padding - 1) (padding - 1) ] ]
             [ yAxis yValues
             , text_
-                [ x 0, y (Scale.convert yScaleLocal labelPositions.y - 10), textAnchor AnchorMiddle, fontSize <| Px 14 ]
-                [ Html.text model.yDescription ]
+                [ x 10, y (Scale.convert yScaleLocal labelPositions.y - 10), textAnchor AnchorMiddle, fontSize <| Px 14 ]
+                [ Html.text <|
+                    model.yDescription
+                        ++ (if String.length model.unitY > 0 then
+                                " in "
+
+                            else
+                                ""
+                           )
+                        ++ model.unitY
+                ]
             ]
 
         -- datenpunkte zeichnen
@@ -167,6 +185,8 @@ type alias Point =
 type alias XyData =
     { xDescription : String
     , yDescription : String
+    , unitX : String
+    , unitY : String
     , data : List Point
     }
 
@@ -186,7 +206,11 @@ filterSmartphonesXY model att1List att2List =
         filteredSmartphones =
             List.filterMap mapToPoint smartphoneDataList
     in
-    XyData model.scatterplotOptions.attribute1 model.scatterplotOptions.attribute2 filteredSmartphones
+    XyData model.scatterplotOptions.attribute1
+        model.scatterplotOptions.attribute2
+        model.scatterplotOptions.unit1
+        model.scatterplotOptions.unit2
+        filteredSmartphones
 
 
 mapToPoint : { att1 : Maybe Float, att2 : Maybe Float, name : Maybe String, id : Maybe String } -> Maybe Point
@@ -226,7 +250,9 @@ viewScatterplot model =
             filterSmartphonesXY model att1List att2List
     in
     Html.div []
-        [ Html.div [ class [ "description" ], align "center" ] [ Html.b [] [ Html.text "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren," ] ]
+        [ Html.div [ class [ "description" ], align "center" ]
+            [ Html.b [] [ Html.text "Hints: By clicking on a point, the plot switch to the star plot and show the point data. By hovering over a point, you get the model name, ID und the exactly x and y values." ]
+            ]
         , Html.span [ class [ "plotAttributeSelect" ] ]
             [ Html.b [] [ Html.text "x-Axis: " ]
             , attributeSelector 1 model
diff --git a/src/Starplot.elm b/src/Starplot.elm
index 08f9562e34331e97aa3fd7852e109367d3406171..f380577715518380f411a6d771d9cd55eee37b7e 100644
--- a/src/Starplot.elm
+++ b/src/Starplot.elm
@@ -54,8 +54,8 @@ type Msg
     | SubmitNumber2
 
 
-starplot : Smartphone -> List Float -> List String -> List (Smartphone -> Maybe Float) -> Svg msg
-starplot smartphone starValues labels func =
+starplot : Smartphone -> List Float -> List String -> List String -> List (Smartphone -> Maybe Float) -> Svg msg
+starplot smartphone starValues labels unit func =
     let
         axisMultiplikator =
             [ ( 0, -0.9 )
@@ -90,9 +90,10 @@ starplot smartphone starValues labels func =
                 func
 
         starLabel =
-            List.map3 createLabels
+            List.map4 createLabels
                 labels
                 valueLabel
+                unit
                 [ ( 0, -1.1 )
                 , ( 0.7, -0.95 )
                 , ( 0.95, -0.45 )
@@ -149,32 +150,6 @@ starplot smartphone starValues labels func =
                                 * Maybe.withDefault 0 (List.head starValues)
                             )
                        ]
-
-        {- valueLabel =
-           List.map2 createValueLabels
-               (List.map
-                   (\f ->
-                       case f smartphone of
-                           Just value ->
-                               value
-
-                           Nothing ->
-                               -1
-                   )
-                   func
-               )
-               [ ( 0, -1.1 )
-               , ( 0.7, -0.95 )
-               , ( 0.95, -0.45 )
-               , ( 0.95, 0.45 )
-               , ( 0.7, 0.95 )
-               , ( 0, 1.1 )
-               , ( -0.7, 0.95 )
-               , ( -0.95, 0.45 )
-               , ( -1.1, -0.45 ) -- individuel
-               , ( -0.7, -0.95 )
-               ]
-        -}
     in
     svg
         [ viewBox 0 0 w h
@@ -230,8 +205,8 @@ createAxis axisPoint =
     [ Just ( midX, midY ), Just ( midX + Tuple.first axisPoint * starlength, midY + Tuple.second axisPoint * starlength ) ] |> Shape.line Shape.linearCurve
 
 
-createLabels : String -> Float -> ( Float, Float ) -> Svg msg
-createLabels label vlabel labelPoint =
+createLabels : String -> Float -> String -> ( Float, Float ) -> Svg msg
+createLabels label vlabel unit labelPoint =
     g [ class [ "label" ] ]
         [ g [ class [ "starLabel" ] ]
             [ text_ [ x (midX + Tuple.first labelPoint * starlength - 20), y (midY + Tuple.second labelPoint * starlength) ] [ Html.text label ]
@@ -243,19 +218,12 @@ createLabels label vlabel labelPoint =
                         "NaN"
 
                     else
-                        toString vlabel
+                        toString vlabel ++ " " ++ unit
                 ]
             ]
         ]
 
 
-
-{- createValueLabels : Float -> ( Float, Float ) -> Svg msg
-   createValueLabels label labelPoint =
-       text_ [ class [ "valueLabel" ], x (midX + Tuple.first labelPoint * starlength - 20), y (midY + Tuple.second labelPoint * starlength) ] [ Html.text <| toString label ]
--}
-
-
 findSmartphoneById : Model -> String -> Maybe Smartphone
 findSmartphoneById model id =
     List.head <|
@@ -321,6 +289,19 @@ viewStarplot model =
             , "Refresh Rate"
             ]
 
+        unit =
+            [ "EUR"
+            , "%"
+            , ""
+            , "GHz"
+            , "mAh"
+            , ""
+            , "GB"
+            , "GB"
+            , "inches"
+            , "Hz"
+            ]
+
         starplotData1 =
             findSmartphoneById model model.starplotOption.modelID1
 
@@ -343,7 +324,7 @@ viewStarplot model =
 
         starplotViewHead spd1 spd2 =
             div []
-                [ Html.div [ class [ "description" ], align "center" ] [ Html.b [] [ Html.text "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren," ] ]
+                [ Html.div [ class [ "description" ], align "center" ] [ Html.b [] [ Html.text "You can compare two smartphones at the same time. Each of the two starplots has an input field where an ID from a smartphone can be entered to display it in the starplot. By hovering over a plot label, you can see the exactly value for the label." ] ]
                 , Html.span [ class [ "plotStarInfo" ] ]
                     [ case spd1 of
                         Just spd ->
@@ -388,7 +369,7 @@ viewStarplot model =
         [ starplotViewHead starplotData1 starplotData2
         , case starplotData1 of
             Just spd1 ->
-                starplot spd1 starValues1 labels smartphoneFunctions
+                starplot spd1 starValues1 labels unit smartphoneFunctions
 
             Nothing ->
                 div []
@@ -396,7 +377,7 @@ viewStarplot model =
                     ]
         , case starplotData2 of
             Just spd2 ->
-                starplot spd2 starValues2 labels smartphoneFunctions
+                starplot spd2 starValues2 labels unit smartphoneFunctions
 
             Nothing ->
                 div []
diff --git a/src/TreeView.elm b/src/TreeView.elm
index ec5b71c6c8f9df9be44a704e46b98e140fa96829..41d7b22c7a0e58a768d0cf1821dcc07362d0db49 100644
--- a/src/TreeView.elm
+++ b/src/TreeView.elm
@@ -182,7 +182,7 @@ viewTree model =
             Tuple.second treeViewInfo
     in
     div []
-        [ Html.div [ class [ "description" ], align "center" ] [ Html.b [] [ Html.text "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren," ] ]
+        [ Html.div [ class [ "description" ], align "center" ] [ Html.b [] [ Html.text "Hints: By scrolling you can zoom out or in the visualization and you can move the tree. By clicking on a node (not a leaf), the tree focuses and zooms on this node. By clicking on a leaf node, you switch to the starplot of the node. You can select different filters to bound the result." ] ]
         , Html.div [ class [ "plotTreeInfo" ] ]
             [ Html.span [ class [ "plotAttributeSelect" ] ]
                 [ b [] [ text <| "Smartphones in Tree: " ++ (toString <| Tuple.second nodeCounts) ]