1 Objective

Menampilkan hasil clustering dari kmeans() menggunakan ggplot2.

2 Load Package

library(ggplot2)

3 Clustering Using K-means

Data yang akan digunakan

iris_cluster <- iris[, -5]
head(iris_cluster)
cls <- kmeans(x = iris_cluster, centers = 3)
iris_cluster$cluster <- as.character(cls$cluster)
head(iris_cluster)

4 Visualization Using ggplot2

4.1 Plot the data point

ggplot() +
  geom_point(data = iris_cluster, 
             mapping = aes(x = Sepal.Length, 
                                  y = Petal.Length, 
                                  colour = cluster))

4.2 Add centroid

ggplot() +
  geom_point(data = iris_cluster, 
             mapping = aes(x = Sepal.Length, 
                                  y = Petal.Length, 
                                  colour = cluster)) +
  geom_point(mapping = aes_string(x = cls$centers[, "Sepal.Length"], 
                                  y = cls$centers[, "Petal.Length"]),
                                  color = "red", size = 4)

4.3 Add text as label

ggplot() +
  geom_point(data = iris_cluster, 
             mapping = aes(x = Sepal.Length, 
                                  y = Petal.Length, 
                                  colour = cluster)) +
  geom_point(mapping = aes_string(x = cls$centers[, "Sepal.Length"], 
                                  y = cls$centers[, "Petal.Length"]),
                                  color = "red", size = 4) +
  geom_text(mapping = aes_string(x = cls$centers[, "Sepal.Length"], 
                                  y = cls$centers[, "Petal.Length"],
                                 label = 1:3),
                                  color = "black", size = 4) +
  theme_light()

4.4 Other Variables

ggplot() +
  geom_point(data = iris_cluster, 
             mapping = aes(x = Petal.Width, 
                                  y = Petal.Length, 
                                  colour = cluster)) +
  geom_point(mapping = aes_string(x = cls$centers[, "Petal.Width"], 
                                  y = cls$centers[, "Petal.Length"]),
                                  color = "red", size = 4) +
  geom_text(mapping = aes_string(x = cls$centers[, "Petal.Width"], 
                                  y = cls$centers[, "Petal.Length"],
                                 label = 1:3),
                                  color = "black", size = 4) +
  theme_light()

LS0tDQp0aXRsZTogICJWaXN1YWxpemUgQ2x1c3RlcmluZyBVc2luZyBnZ3Bsb3QyIg0KYXV0aG9yOiAiQnkgQWVwIEhpZGF5YXR1bG9oIg0KZGF0ZTogICAiMjAxOSBKdWx5IDI1Ig0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBzcGFjZWxhYg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KYm9keXsgLyogTm9ybWFsICAqLw0KICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICB9DQp0ZCB7ICAvKiBUYWJsZSAgKi8NCiAgZm9udC1zaXplOiAxMnB4Ow0KfQ0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDM4cHg7DQogIGNvbG9yOiBsaWdodGJsdWU7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCn0NCmgyIHsgLyogSGVhZGVyIDIgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBjb2xvcjogRGFya0JsdWU7DQp9DQpoMyB7IC8qIEhlYWRlciAzICovDQogIGZvbnQtc2l6ZTogMTZweDsNCiMgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQp9DQpoNCB7IC8qIEhlYWRlciA0ICovDQogIGZvbnQtc2l6ZTogMTRweDsNCiAgY29sb3I6IERhcmtCbHVlOw0KfQ0KY29kZS5yeyAvKiBDb2RlIGJsb2NrICovDQogICAgZm9udC1zaXplOiAxMnB4Ow0KfQ0KcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8NCiAgICBmb250LXNpemU6IDEycHg7DQp9DQo8L3N0eWxlPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KI2tuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsIHJlc3VsdHM9J2hvbGQnLCB3YXJuaW5nPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UpIA0Kb3B0aW9ucyhzY2lwZW4gPSA5OSkNCmBgYA0KDQo8cCBhbGlnbj0iY2VudGVyIj4NCjxpbWcgc3JjPSJjbHVzdGVydmlzdWFsLnBuZyI+DQo8L3A+DQoNCiMgT2JqZWN0aXZlDQoNCk1lbmFtcGlsa2FuIGhhc2lsIGNsdXN0ZXJpbmcgZGFyaSBga21lYW5zKClgIG1lbmdndW5ha2FuIGBnZ3Bsb3QyYC4NCg0KIyBMb2FkIFBhY2thZ2UNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KIyBDbHVzdGVyaW5nIFVzaW5nIEstbWVhbnMNCkRhdGEgeWFuZyBha2FuIGRpZ3VuYWthbiANCg0KYGBge3J9DQppcmlzX2NsdXN0ZXIgPC0gaXJpc1ssIC01XQ0KaGVhZChpcmlzX2NsdXN0ZXIpDQpjbHMgPC0ga21lYW5zKHggPSBpcmlzX2NsdXN0ZXIsIGNlbnRlcnMgPSAzKQ0KaXJpc19jbHVzdGVyJGNsdXN0ZXIgPC0gYXMuY2hhcmFjdGVyKGNscyRjbHVzdGVyKQ0KaGVhZChpcmlzX2NsdXN0ZXIpDQpgYGANCg0KDQojIFZpc3VhbGl6YXRpb24gVXNpbmcgZ2dwbG90Mg0KDQojIyBQbG90IHRoZSBkYXRhIHBvaW50DQoNCmBgYHtyfQ0KZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBpcmlzX2NsdXN0ZXIsIA0KICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IFNlcGFsLkxlbmd0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFBldGFsLkxlbmd0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gY2x1c3RlcikpDQpgYGANCg0KIyMgQWRkIGNlbnRyb2lkDQoNCmBgYHtyfQ0KZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBpcmlzX2NsdXN0ZXIsIA0KICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IFNlcGFsLkxlbmd0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFBldGFsLkxlbmd0aCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gY2x1c3RlcikpICsNCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzX3N0cmluZyh4ID0gY2xzJGNlbnRlcnNbLCAiU2VwYWwuTGVuZ3RoIl0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjbHMkY2VudGVyc1ssICJQZXRhbC5MZW5ndGgiXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDQpDQpgYGANCg0KIyMgQWRkIHRleHQgYXMgbGFiZWwNCg0KYGBge3J9DQpnZ3Bsb3QoKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGlyaXNfY2x1c3RlciwgDQogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gU2VwYWwuTGVuZ3RoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gUGV0YWwuTGVuZ3RoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBjbHVzdGVyKSkgKw0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXNfc3RyaW5nKHggPSBjbHMkY2VudGVyc1ssICJTZXBhbC5MZW5ndGgiXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGNscyRjZW50ZXJzWywgIlBldGFsLkxlbmd0aCJdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLCBzaXplID0gNCkgKw0KICBnZW9tX3RleHQobWFwcGluZyA9IGFlc19zdHJpbmcoeCA9IGNscyRjZW50ZXJzWywgIlNlcGFsLkxlbmd0aCJdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY2xzJGNlbnRlcnNbLCAiUGV0YWwuTGVuZ3RoIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDE6MyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gNCkgKw0KICB0aGVtZV9saWdodCgpDQpgYGANCg0KIyMgT3RoZXIgVmFyaWFibGVzDQoNCmBgYHtyfQ0KZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBpcmlzX2NsdXN0ZXIsIA0KICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IFBldGFsLldpZHRoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gUGV0YWwuTGVuZ3RoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBjbHVzdGVyKSkgKw0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXNfc3RyaW5nKHggPSBjbHMkY2VudGVyc1ssICJQZXRhbC5XaWR0aCJdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY2xzJGNlbnRlcnNbLCAiUGV0YWwuTGVuZ3RoIl0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsIHNpemUgPSA0KSArDQogIGdlb21fdGV4dChtYXBwaW5nID0gYWVzX3N0cmluZyh4ID0gY2xzJGNlbnRlcnNbLCAiUGV0YWwuV2lkdGgiXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGNscyRjZW50ZXJzWywgIlBldGFsLkxlbmd0aCJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAxOjMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDQpICsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQo=