data("iris")
(Pertemuan 04) R: Visualisasi Dua Variabel, Time Series, dan ggplot2
R: Two-Variable Visualization, Time Series, and ggplot2
Kembali ke Pengantar Sains Data
Melanjutkan pertemuan sebelumnya, kali ini kita akan mempelajari lebih lanjut tentang visualisasi menggunakan R, yaitu visualisasi dua variabel (termasuk line chart untuk data time series), serta tentang package bernama ggplot2
yang bisa mempermudah urusan visualisasi.
Kita coba gunakan dataset iris
terlebih dahulu, ya. Aktifkan terlebih dahulu:
Agar konsisten (bahwa kita sedang berurusan dengan data frame), mari kita beri nama df1
saja:
<- iris df1
Kita bisa lihat-lihat:
View(df1)
df1
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
11 5.4 3.7 1.5 0.2 setosa
12 4.8 3.4 1.6 0.2 setosa
13 4.8 3.0 1.4 0.1 setosa
14 4.3 3.0 1.1 0.1 setosa
15 5.8 4.0 1.2 0.2 setosa
16 5.7 4.4 1.5 0.4 setosa
17 5.4 3.9 1.3 0.4 setosa
18 5.1 3.5 1.4 0.3 setosa
19 5.7 3.8 1.7 0.3 setosa
20 5.1 3.8 1.5 0.3 setosa
21 5.4 3.4 1.7 0.2 setosa
22 5.1 3.7 1.5 0.4 setosa
23 4.6 3.6 1.0 0.2 setosa
24 5.1 3.3 1.7 0.5 setosa
25 4.8 3.4 1.9 0.2 setosa
26 5.0 3.0 1.6 0.2 setosa
27 5.0 3.4 1.6 0.4 setosa
28 5.2 3.5 1.5 0.2 setosa
29 5.2 3.4 1.4 0.2 setosa
30 4.7 3.2 1.6 0.2 setosa
31 4.8 3.1 1.6 0.2 setosa
32 5.4 3.4 1.5 0.4 setosa
33 5.2 4.1 1.5 0.1 setosa
34 5.5 4.2 1.4 0.2 setosa
35 4.9 3.1 1.5 0.2 setosa
36 5.0 3.2 1.2 0.2 setosa
37 5.5 3.5 1.3 0.2 setosa
38 4.9 3.6 1.4 0.1 setosa
39 4.4 3.0 1.3 0.2 setosa
40 5.1 3.4 1.5 0.2 setosa
41 5.0 3.5 1.3 0.3 setosa
42 4.5 2.3 1.3 0.3 setosa
43 4.4 3.2 1.3 0.2 setosa
44 5.0 3.5 1.6 0.6 setosa
45 5.1 3.8 1.9 0.4 setosa
46 4.8 3.0 1.4 0.3 setosa
47 5.1 3.8 1.6 0.2 setosa
48 4.6 3.2 1.4 0.2 setosa
49 5.3 3.7 1.5 0.2 setosa
50 5.0 3.3 1.4 0.2 setosa
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
53 6.9 3.1 4.9 1.5 versicolor
54 5.5 2.3 4.0 1.3 versicolor
55 6.5 2.8 4.6 1.5 versicolor
56 5.7 2.8 4.5 1.3 versicolor
57 6.3 3.3 4.7 1.6 versicolor
58 4.9 2.4 3.3 1.0 versicolor
59 6.6 2.9 4.6 1.3 versicolor
60 5.2 2.7 3.9 1.4 versicolor
61 5.0 2.0 3.5 1.0 versicolor
62 5.9 3.0 4.2 1.5 versicolor
63 6.0 2.2 4.0 1.0 versicolor
64 6.1 2.9 4.7 1.4 versicolor
65 5.6 2.9 3.6 1.3 versicolor
66 6.7 3.1 4.4 1.4 versicolor
67 5.6 3.0 4.5 1.5 versicolor
68 5.8 2.7 4.1 1.0 versicolor
69 6.2 2.2 4.5 1.5 versicolor
70 5.6 2.5 3.9 1.1 versicolor
71 5.9 3.2 4.8 1.8 versicolor
72 6.1 2.8 4.0 1.3 versicolor
73 6.3 2.5 4.9 1.5 versicolor
74 6.1 2.8 4.7 1.2 versicolor
75 6.4 2.9 4.3 1.3 versicolor
76 6.6 3.0 4.4 1.4 versicolor
77 6.8 2.8 4.8 1.4 versicolor
78 6.7 3.0 5.0 1.7 versicolor
79 6.0 2.9 4.5 1.5 versicolor
80 5.7 2.6 3.5 1.0 versicolor
81 5.5 2.4 3.8 1.1 versicolor
82 5.5 2.4 3.7 1.0 versicolor
83 5.8 2.7 3.9 1.2 versicolor
84 6.0 2.7 5.1 1.6 versicolor
85 5.4 3.0 4.5 1.5 versicolor
86 6.0 3.4 4.5 1.6 versicolor
87 6.7 3.1 4.7 1.5 versicolor
88 6.3 2.3 4.4 1.3 versicolor
89 5.6 3.0 4.1 1.3 versicolor
90 5.5 2.5 4.0 1.3 versicolor
91 5.5 2.6 4.4 1.2 versicolor
92 6.1 3.0 4.6 1.4 versicolor
93 5.8 2.6 4.0 1.2 versicolor
94 5.0 2.3 3.3 1.0 versicolor
95 5.6 2.7 4.2 1.3 versicolor
96 5.7 3.0 4.2 1.2 versicolor
97 5.7 2.9 4.2 1.3 versicolor
98 6.2 2.9 4.3 1.3 versicolor
99 5.1 2.5 3.0 1.1 versicolor
100 5.7 2.8 4.1 1.3 versicolor
101 6.3 3.3 6.0 2.5 virginica
102 5.8 2.7 5.1 1.9 virginica
103 7.1 3.0 5.9 2.1 virginica
104 6.3 2.9 5.6 1.8 virginica
105 6.5 3.0 5.8 2.2 virginica
106 7.6 3.0 6.6 2.1 virginica
107 4.9 2.5 4.5 1.7 virginica
108 7.3 2.9 6.3 1.8 virginica
109 6.7 2.5 5.8 1.8 virginica
110 7.2 3.6 6.1 2.5 virginica
111 6.5 3.2 5.1 2.0 virginica
112 6.4 2.7 5.3 1.9 virginica
113 6.8 3.0 5.5 2.1 virginica
114 5.7 2.5 5.0 2.0 virginica
115 5.8 2.8 5.1 2.4 virginica
116 6.4 3.2 5.3 2.3 virginica
117 6.5 3.0 5.5 1.8 virginica
118 7.7 3.8 6.7 2.2 virginica
119 7.7 2.6 6.9 2.3 virginica
120 6.0 2.2 5.0 1.5 virginica
121 6.9 3.2 5.7 2.3 virginica
122 5.6 2.8 4.9 2.0 virginica
123 7.7 2.8 6.7 2.0 virginica
124 6.3 2.7 4.9 1.8 virginica
125 6.7 3.3 5.7 2.1 virginica
126 7.2 3.2 6.0 1.8 virginica
127 6.2 2.8 4.8 1.8 virginica
128 6.1 3.0 4.9 1.8 virginica
129 6.4 2.8 5.6 2.1 virginica
130 7.2 3.0 5.8 1.6 virginica
131 7.4 2.8 6.1 1.9 virginica
132 7.9 3.8 6.4 2.0 virginica
133 6.4 2.8 5.6 2.2 virginica
134 6.3 2.8 5.1 1.5 virginica
135 6.1 2.6 5.6 1.4 virginica
136 7.7 3.0 6.1 2.3 virginica
137 6.3 3.4 5.6 2.4 virginica
138 6.4 3.1 5.5 1.8 virginica
139 6.0 3.0 4.8 1.8 virginica
140 6.9 3.1 5.4 2.1 virginica
141 6.7 3.1 5.6 2.4 virginica
142 6.9 3.1 5.1 2.3 virginica
143 5.8 2.7 5.1 1.9 virginica
144 6.8 3.2 5.9 2.3 virginica
145 6.7 3.3 5.7 2.5 virginica
146 6.7 3.0 5.2 2.3 virginica
147 6.3 2.5 5.0 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
Kolom-kolomnya adalah:
ls(df1)
[1] "Petal.Length" "Petal.Width" "Sepal.Length" "Sepal.Width" "Species"
Visualisasi Dua Variabel (dengan fungsi built-in)
Di pertemuan sebelumnya, kita sudah membuat visualisasi frekuensi dengan fungsi seperti barplot
, pie
, dan hist
, yang “sudah ada dari sananya” atau disebut built-in. Untuk keperluan visualisasi dua variabel, juga tersedia beberapa fungsi built-in.
Boxplot
boxplot(df1$Sepal.Length) #1 variabel
boxplot(df1$Sepal.Length, df1$Sepal.Width) #2 variabel atau lebih
boxplot(df1$Sepal.Length, df1$Sepal.Width,
main = "Boxplot Perbandingan Sepal Length dan Sepal Width",
names = c("Sepal Length", "Sepal Width")) #tambahkan judul dan xlabel
boxplot(df1$Sepal.Length, df1$Sepal.Width,
main = "Boxplot Perbandingan Sepal Length dan Sepal Width",
names = c("Sepal Length", "Sepal Width"),
col = c("red", "blue")) #ganti warna
boxplot(df1$Sepal.Length, df1$Sepal.Width,
main = "Boxplot Perbandingan Sepal Length dan Sepal Width",
names = c("Sepal Length", "Sepal Width"),
col = c("red", "blue"),
horizontal = TRUE) #rotate jadi horizontal
boxplot(df1$Sepal.Length, df1$Sepal.Width,
main = "Boxplot Perbandingan Sepal Length dan Sepal Width",
names = c("Sepal Length", "Sepal Width"),
col = c("red", "blue"),
notch = TRUE) # jadi "mengerucut" di sekitar median
boxplot(df1$Sepal.Length ~ df1$Species)
boxplot(Sepal.Length ~ Species, data = df1)
boxplot(df1$Sepal.Length ~ df1$Species,
main = "Perbandingan Sepal Length berdasarkan Species",
xlab = "Species",
ylab = "Sepal Length",
col = c("blue","yellow","red"))
Scatter
Untuk menggambar scatter plot, gunakan fungsi plot
Plot paling dasar: semua variabel numerik menjadi scatter
plot(df1)
Scatter plot antar dua variabel pilihan:
plot(df1$Sepal.Length, df1$Sepal.Width)
Tambahkan judul pakai main
plot(df1$Sepal.Length, df1$Sepal.Width,
main = "Ini Judul grafiknya")
Tambahkan label sumbu
plot(df1$Sepal.Length, df1$Sepal.Width,
main = "Ini Judul grafiknya",
xlab = "Sumbu X",
ylab = "Sumbu Y")
Beri warna
plot(df1$Sepal.Length, df1$Sepal.Width,
main = "Scatter Plot Sepal Length dengan Sepal Width",
xlab = "Sepal Length",
ylab = "Sepal Width",
col = "blue")
(Pengayaan) Visualisasi Tambahan (dengan fungsi built-in)
Stem and Leaf Plot
Untuk melihat persebaran data (min, max, distribusi), mirip histogram
?stemView(ChickWeight) #data dari r
stem(ChickWeight$weight)
The decimal point is 1 digit(s) to the right of the |
2 | 599999999
4 | 00000111111111111111111112222222222222223333456678888888899999999999+38
6 | 00111111122222222333334444455555666677777888888900111111222222333334+8
8 | 00112223344444455555566777788999990001223333566666788888889
10 | 0000111122233333334566667778889901122223445555667789
12 | 00002223333344445555667788890113444555566788889
14 | 11123444455556666677788890011234444555666777777789
16 | 00002233334444466788990000134445555789
18 | 12244444555677782225677778889999
20 | 0123444555557900245578
22 | 0012357701123344556788
24 | 08001699
26 | 12344569259
28 | 01780145
30 | 355798
32 | 12712
34 | 1
36 | 13
hist(ChickWeight$weight) #buat perbandingan
min(ChickWeight$weight) #cek nilai minimumnya
[1] 35
max(ChickWeight$weight) #cek maxnya
[1] 373
Kalau ternyata min sama maxnya kurang tepat, ganti scalenya
stem(ChickWeight$weight, scale = 5)
The decimal point is 1 digit(s) to the right of the |
3 | 599999999
4 | 000001111111111111111111122222222222222233334
4 | 5667888888889999999999999
5 | 00000011111111222233333444
5 | 5555566667778888899999
6 | 001111111222222223333344444
6 | 555556666777778888889
7 | 001111112222223333344444444
7 | 6667778889999
8 | 001122233444444
8 | 5555556677778899999
9 | 0001223333
9 | 566666788888889
10 | 0000111122233333334
10 | 5666677788899
11 | 0112222344
11 | 5555667789
12 | 0000222333334444
12 | 555566778889
13 | 0113444
13 | 555566788889
14 | 111234444
14 | 5555666667778889
15 | 0011234444
15 | 555666777777789
16 | 000022333344444
16 | 6678899
17 | 000013444
17 | 5555789
18 | 12244444
18 | 55567778
19 | 222
19 | 5677778889999
20 | 0123444
20 | 5555579
21 | 0024
21 | 5578
22 | 00123
22 | 577
23 | 01123344
23 | 556788
24 | 0
24 | 8
25 | 001
25 | 699
26 | 12344
26 | 569
27 | 2
27 | 59
28 | 01
28 | 78
29 | 014
29 | 5
30 | 3
30 | 5579
31 |
31 | 8
32 | 12
32 | 7
33 | 12
33 |
34 | 1
34 |
35 |
35 |
36 | 1
36 |
37 | 3
stem(ChickWeight$weight, width = 100)
The decimal point is 1 digit(s) to the right of the |
2 | 599999999
4 | 0000011111111111111111111222222222222222333345667888888889999999999999000000111111112222+18
6 | 0011111112222222233333444445555566667777788888890011111122222233333444444446667778889999
8 | 00112223344444455555566777788999990001223333566666788888889
10 | 0000111122233333334566667778889901122223445555667789
12 | 00002223333344445555667788890113444555566788889
14 | 11123444455556666677788890011234444555666777777789
16 | 00002233334444466788990000134445555789
18 | 12244444555677782225677778889999
20 | 0123444555557900245578
22 | 0012357701123344556788
24 | 08001699
26 | 12344569259
28 | 01780145
30 | 355798
32 | 12712
34 | 1
36 | 13
Dot Diagram
?dotchartView(mtcars)
Paling Sederhana
dotchart(mtcars$mpg)
Tambah Judul dan Label
dotchart(mtcars$mpg, labels = row.names(mtcars),
cex = 0.9, xlab = "mpg",
main = "Persebaran Jarak Yang Dapat Ditempuh Per Galon")
Berdasarkan Grup
<- as.factor(mtcars$cyl)
grps <- c("blue", "darkgreen", "orange")
my_cols dotchart(mtcars$mpg, labels = row.names(mtcars),
groups = grps, gcolor = my_cols,
color = my_cols[grps],
cex = 0.9, pch = 22, xlab = "mpg",
main = "Persebaran Jarak Yang Dapat Ditempuh Per Galon Berdasarkan Jumlah Silinder")
legend("bottomright", legend = c("4","6", "6"),
fill = my_cols, cex = 0.8)
Time Series dan Line Chart
Data periodik terhadap waktu (misalnya data tahunan atau data bulanan) disebut time series data (data runtun waktu), biasa disebut time series saja atau disingkat “TS”. Visualisasi line chart biasa digunakan untuk data time series, dan begitu juga sebaliknya, data time series biasa divisualisasikan dengan line chart.
Mencari data time series
Sayangnya, dataset iris
tidak memiliki data time series. Bahkan, dari semua dataset yang built-in, data time series cenderung berupa dataset tersendiri, yang memang khusus menyimpan data variabel tertentu saja terhadap waktu.
Oleh karena itu, mari kita coba dataset lain. Kalian bisa melihat-lihat dataset yang sudah tersedia di R dengan perintah data()
data()
Sebenarnya, tiap dataset berasal dari sebuah package. Perhatikan bahwa dataset iris
berasal dari package bernama datasets
(yang memang sudah built-in)
?iris
Kita bisa spesifik melihat daftar dataset yang berasal dari package tertentu dengan tambahan opsi package
data(package = "datasets")
Untuk data time series, kita bisa mencoba misalnya nhtemp
, rata-rata tahunan untuk suhu di kota New Haven di Amerika Serikat
data("nhtemp")
Mari kita lihat:
View(nhtemp)
nhtemp
Time Series:
Start = 1912
End = 1971
Frequency = 1
[1] 49.9 52.3 49.4 51.1 49.4 47.9 49.8 50.9 49.3 51.9 50.8 49.6 49.3 50.6 48.4
[16] 50.7 50.9 50.6 51.5 52.8 51.8 51.1 49.8 50.2 50.4 51.6 51.8 50.9 48.8 51.7
[31] 51.0 50.6 51.7 51.5 52.1 51.3 51.0 54.0 51.4 52.7 53.1 54.6 52.0 52.0 50.9
[46] 52.6 50.2 52.6 51.6 51.9 50.5 50.9 51.7 51.4 51.7 50.8 51.9 51.8 51.9 53.0
Terlihat bahwa data ini berupa time series yang tidak langsung berbentuk tabel. Di R, data berjenis time series memang diberi perhatian khusus, sehingga menjadi yang namanya “time series object”. Data runtun waktu dipelajari lebih lanjut di mata kuliah Metode Peramalan (Forecasting Methods / Time Series Analysis).
Line chart instan dari objek time series
Di pertemuan kali ini, kita hanya akan membuat visualisasinya dengan line chart.
Perhatian khusus tersebut ternyata sangat mempermudah cara memvisualisasikannya:
plot(nhtemp)
Langsung jadi!
Namun, apabila sewaktu-waktu kalian berurusan dengan tabel data yang sebenarnya berupa time series, mungkin R tidak akan langsung mengakuinya sebagai time series. Tidak masalah, karena kita masih bisa membuat line chart dari data frame.
Mengubah time series object menjadi data frame
Sebelum bisa membuat line chart dari data frame, datanya harus ada. Kalian bisa sewaktu-waktu import data kalian sendiri, kalau ada. Di sini, kita hanya akan mengubah time series object nhtemp
menjadi data frame.
<- data.frame(Time=time(nhtemp),
df_nhtemp Temp=as.matrix(nhtemp))
Mari kita lihat:
View(df_nhtemp)
df_nhtemp
Time Temp
1 1912 49.9
2 1913 52.3
3 1914 49.4
4 1915 51.1
5 1916 49.4
6 1917 47.9
7 1918 49.8
8 1919 50.9
9 1920 49.3
10 1921 51.9
11 1922 50.8
12 1923 49.6
13 1924 49.3
14 1925 50.6
15 1926 48.4
16 1927 50.7
17 1928 50.9
18 1929 50.6
19 1930 51.5
20 1931 52.8
21 1932 51.8
22 1933 51.1
23 1934 49.8
24 1935 50.2
25 1936 50.4
26 1937 51.6
27 1938 51.8
28 1939 50.9
29 1940 48.8
30 1941 51.7
31 1942 51.0
32 1943 50.6
33 1944 51.7
34 1945 51.5
35 1946 52.1
36 1947 51.3
37 1948 51.0
38 1949 54.0
39 1950 51.4
40 1951 52.7
41 1952 53.1
42 1953 54.6
43 1954 52.0
44 1955 52.0
45 1956 50.9
46 1957 52.6
47 1958 50.2
48 1959 52.6
49 1960 51.6
50 1961 51.9
51 1962 50.5
52 1963 50.9
53 1964 51.7
54 1965 51.4
55 1966 51.7
56 1967 50.8
57 1968 51.9
58 1969 51.8
59 1970 51.9
60 1971 53.0
Line chart dari data frame
Sekarang tinggal kita gambar, dengan cara menggambar scatter plot yang kemudian diberi opsi type = "l"
agar menjadi line chart:
plot(df_nhtemp$Time, df_nhtemp$Temp, type="l")
plot(df_nhtemp$Time, df_nhtemp$Temp, type="l",
xlab="Time", ylab="Temp",
main="Average Yearly Temperature in New Haven")
Hmm, kurang bagus ya. Untuk line chart yang lebih bagus (dan juga berbagai plot lainnya) serta lebih fleksibel, selanjutnya kita akan mencoba ggplot2
, sebuah package untuk plotting di R yang sangat terkenal dan sering digunakan di kalangan pengguna R.
ggplot2
Fungsi-fungsi plot yang tersedia di R secara built-in (terkadang disebut “base R”), yang sudah kita eksplorasi sejauh ini, cenderung terbatas dan tidak begitu fleksibel. Kalangan pengguna R cenderung menggunakan sebuah package terkenal di R untuk keperluan plotting, yaitu ggplot2
.
Instal terlebih dahulu, kalau belum:
install.packages("ggplot2")
Lalu aktifkan:
library(ggplot2)
Dataset yang tersedia di ggplot2
Kebetulan, ggplot2
menyediakan beberapa dataset (yang tidak tersedia di base R) yang bisa kita gunakan untuk mempelajari dan mengeksplorasi ggplot2
.
data(package = "ggplot2")
Kita lihat, data time series tersedia di ggplot2
, bernama economics
. Mari kita lihat-lihat:
data("economics", package = "ggplot2")
<- economics df2
View(df2)
df2
# A tibble: 574 × 6
date pce pop psavert uempmed unemploy
<date> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1967-07-01 507. 198712 12.6 4.5 2944
2 1967-08-01 510. 198911 12.6 4.7 2945
3 1967-09-01 516. 199113 11.9 4.6 2958
4 1967-10-01 512. 199311 12.9 4.9 3143
5 1967-11-01 517. 199498 12.8 4.7 3066
6 1967-12-01 525. 199657 11.8 4.8 3018
7 1968-01-01 531. 199808 11.7 5.1 2878
8 1968-02-01 534. 199920 12.3 4.5 3001
9 1968-03-01 544. 200056 11.7 4.1 2877
10 1968-04-01 544 200208 12.3 4.6 2709
# ℹ 564 more rows
ls(df2)
[1] "date" "pce" "pop" "psavert" "uempmed" "unemploy"
Data time series ini terdiri dari sejumlah kolom terhadap waktu.
Dasar-dasar ggplot2
dengan line chart
Menggunakan line chart, kita bisa memvisualisasikan bagaimana perubahan suatu variabel terhadap variabel waktu (date
). Misalnya, kita bisa melihat bagaimana perubahan banyaknya pengangguran (unemploy
) dari tahun ke tahun.
Apabila kita gunakan fungsi built-in untuk line chart, jadinya seperti berikut:
plot(df2$date, df2$unemploy,
type = "l",
col = "red")
Mari kita coba buat dengan ggplot2
.
Langkah pertama adalah menentukan data frame yang ingin kita gunakan, serta variabel yang akan di sumbu x dan variabel yang akan di sumbu y. Syntax-nya seperti berikut.
ggplot(df2, aes(x = date, y = unemploy))
aes
artinya aesthetic (estetika), sebenarnya dalam artian “sesuatu yang bisa dilihat”. Kita memang ingin melihat data date
untuk sumbu x dan unemploy
untuk sumbu y, sehingga kita tuliskan seperti itu.
Namun, sejauh ini, isi plot masih kosong. Kita baru membuat canvas nya saja, belum garis-garisnya.
Agar ada garis, kita “tambahkan” dengan fungsi geom_line()
seperti berikut.
ggplot(df2, aes(x = date, y = unemploy)) +
geom_line()
Mungkin tampak aneh, seolah-olah fungsi dijumlahkan dengan fungsi. Cara kerjanya kurang lebih seperti berikut.
Sebenarnya, fungsi
ggplot
menghasilkan “objek” atau “benda” yang berupa plot kosong.Serupa, fungsi
geom_line
menghasilkan “objek” berupa perintah untuk menggambarkan garis-garis.Begitu kita jumlahkan, objek hasil
geom_line
diterapkan ke objek hasilggplot
.Hasil jumlahnya berupa objek plot baru, yaitu line chart yang kita inginkan.
Objek baru itulah yang kemudian ditampilkan.
Cara ini sangat berbeda dengan cara kerja fungsi-fungsi plotting di base R yang memang berupa perintah.
Penjumlahan seperti itu di ggplot2
bisa kita bayangkan sebagai “komposisi”, yang pada akhirnya menghasilkan suatu objek plot akhir. Ibaratnya seperti penulisan penjumlahan bilangan di R,
2 + 3
[1] 5
yang memang menggabungkan 2 dengan 3 untuk menghasilkan hasil akhir yaitu 5, yang kemudian ditampilkan.
Tentu, kita bisa menyimpan atau meng-assign hasil jumlah tersebut ke dalam variabel, yang kemudian bisa kita tampilkan, sebagai berikut:
<- 2 + 3 hasil_jumlah
hasil_jumlah
[1] 5
Sebagaimana hasil penjumlahan bilangan itu bisa kita simpan ke dalam variabel, “hasil jumlahan plot” dalam penggunaan ggplot2
sebenarnya juga bisa kita simpan ke dalam variabel.
<- ggplot(df2, aes(x = date, y = unemploy)) +
tren_pengangguran geom_line()
Karena sudah tersimpan ke dalam variabel, kita bisa menampilkan plot akhir tersebut kapan saja, cukup dengan memanggil variabelnya:
tren_pengangguran
Fleksibilitas seperti ini tidak ada ketika kita menggunakan fungsi-fungsi plotting dari base R.
Tentunya, kita juga bisa menambahkan label, dengan menambahkan labs
seperti berikut
ggplot(df2, aes(x = date, y = unemploy)) +
geom_line() +
labs(
title = "Line Chart Tahun dengan Jumlah Pengangguran",
x = "Tahun",
y = "Jumlah Pengangguran"
)
Scatter
Penulisannya mirip, tetapi menggunakan geom_point
daripada geom_line
Secara tampilan pun, bedanya line chart dan scatter plot hanyalah pilihan antara menggambar garis atau menggambar titik-titik.
ggplot(df1, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point()
Kita juga bisa menambahkan warna-warna sesuai kolom lain, misal berdasarkan spesies.
ggplot(df1, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point()
Betapa fleksibelnya, ya! Fitur scatter plot plot
di base R tidak se-fleksibel ini. Lebih nyaman juga, karena keterangan warna-warnanya juga langsung ada.
Jangan lupa tambahkan label dengan labs
seperti berikut:
ggplot(df1, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point() +
labs(
title = "Scatter Plot Sepal Length vs Sepal Width",
x = "Sepal Length",
y = "Sepal Width",
color = "Species Names"
)
Contoh lain: Petal.Length
vs. Petal.Width
ggplot(df1, aes(x = Petal.Length, y = Petal.Width, color = Species)) +
geom_point() +
labs(
title = "Scatter Plot Petal Length vs Petal Width",
x = "Petal Length",
y = "Petal Width",
color = "Species Names"
)
Bar Chart
Di pertemuan sebelumnya, kita sudah menggunakan bar chart untuk memvisualisasi frekuensi nilai-nilai di satu variabel, menggunakan dataset iris
. Persebaran Species
ternyata kurang menarik, kecuali apabila dilakukan filter data terlebih dahulu.
Agar lebih mudah, mari kita coba dataset lain yang sudah memiliki persebaran lebih menarik. Tidak harus dari ggplot2
, bisa juga dari package* datasets
yang built-in. Kita bisa cari-cari dulu:
data()
data(package = "datasets")
Misalnya kita pilih mtcars
dari datasets
(daripada dari ggplot2
), yang berisi data mobil-mobil dari majalah Motor Trend tahun 1974.
data("mtcars", package = "datasets")
<- mtcars df3
Kita bisa lihat isinya:
View(df3)
df3
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
ls(df3)
[1] "am" "carb" "cyl" "disp" "drat" "gear" "hp" "mpg" "qsec" "vs"
[11] "wt"
Perhatikan bahwa tiap baris adalah mobil tersendiri, dan datanya memang tidak terlalu banyak. Salah satu kolomnya adalah cyl
, banyaknya “silinder” untuk tiap mobil, yaitu mesin di dalam mobil yang biasa memompa bensin.
$cyl df3
[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
Sepertinya persebarannya menarik. Tidak seperti fungsi barplot
dari base R, di ggplot2
kita tidak perlu membuat tabel frekuensi untuk membuat bar chart. Langsung saja tambahkan geom_bar
seperti berikut. Karena hanya ada satu variabel, kita cukup pasang variabel sumbu x saja.
ggplot(df3, aes(x = cyl)) +
geom_bar()
Untuk memberi warna, gunakan opsi fill
di aes
ggplot(df3, aes(x = cyl, fill = "red")) +
geom_bar()
Kita juga bisa menentukan ketebalan dengan opsi width
di geom_bar
ggplot(df3, aes(x = cyl, fill = "red")) +
geom_bar(width = 1)
Seandainya kalian justru memiliki data yang berupa semacam tabel frekuensi saja, misalnya data voting anonim, bar chart masih bisa dibuat dengan fungsi terpisah yaitu geom_col
daripada geom_bar
Sebagai contoh, misalkan kita punya tabel frekuensi untuk variabel cyl
, yang bisa kita peroleh sebagai berikut (seperti di pertemuan sebelumnya):
<- data.frame(table(df3$cyl, dnn="cyl")) cyl_freq
View(cyl_freq)
cyl_freq
cyl Freq
1 4 11
2 6 7
3 8 14
Kita bisa menggambar bar chart untuk tabel frekuensi tersebut dengan tambahan fungsi geom_col
seperti berikut.
ggplot(cyl_freq, aes(x = cyl, y = Freq)) +
geom_col()
Kita juga bisa memberi warna (dengan fill
di aes
di ggplot
) dan menentukan lebar batang (dengan width
di geom_col
), sebagaimana ketika menggunakan geom_bar
ggplot(cyl_freq, aes(x = cyl, y = Freq, fill = "red")) +
geom_col(width = 0.5)
Pie Chart
Selain bar chart, ada pie chart sebagai visualisasi yang berbeda untuk kegunaan yang sama. Sayangnya, di ggplot2
tidak ada fungsi khusus untuk pie chart. Namun, kita bisa akali dengan membuat bar chart dengan geom_bar
seperti berikut, yang kemudian diterapkan koordinat polar.
ggplot(df3, aes(x = factor(1), fill = factor(cyl))) +
geom_bar(width = 1) +
coord_polar(theta = "y")
Di sini, fungsi factor
diperlukan untuk memberitahu R bahwa data cyl
berupa data kategorik. Kita juga pasang x = factor(1)
karena di sini seolah-olah hanya ada satu batang di bar chart (yang kemudian diterapkan koordinat polar), dan kita biasa hanya memasang sumbu x ketika membuat bar chart.
Seperti biasa, kita bisa tambahkan labs
untuk menentukan label, seperti menentukan judul, mengosongkan label sumbu x maupun sumbu y, dan menentukan label untuk opsi fill
(yang saat ini terpasang menjadi factor(cyl)
)
ggplot(df3, aes(x = factor(1), fill = factor(cyl))) +
geom_bar(width = 1) +
coord_polar(theta = "y") +
labs(
title = "Banyaknya Silinder di Mobil (dari Motor Trend, 1974)",
x = "",
y = "",
fill = "cyl (banyaknya silinder)"
)
Apabila data kita berupa semacam tabel frekuensi saja, kita juga bisa melakukan hal serupa dengan geom_col
agar tetap bisa membuat pie chart. Caranya seperti berikut, juga menggantikan x = cyl
dengan x = factor(1)
, sedangkan opsi fill
tetap diberi factor(cyl)
ggplot(cyl_freq, aes(x = factor(1), y = Freq, fill = factor(cyl))) +
geom_col() +
coord_polar(theta = "y")
Label bisa kita tentukan dengan menambahkan labs
seperti biasa
ggplot(cyl_freq, aes(x = factor(1), y = Freq, fill = factor(cyl))) +
geom_col() +
coord_polar(theta = "y") +
labs(
title = "Pie Chart Banyaknya Silinder dari Tabel Frekuensi",
x = "",
y = "",
fill = "cyl (banyaknya silinder)"
)
Histogram
Di ggplot2
, histogram juga seolah-olah seperti sejenis bar chart. Mari kita coba gambar histogram untuk Sepal.Length
seperti di pertemuan sebelumnya. Kali ini, tambahkan geom_histogram
ggplot(df1, aes(x = Sepal.Length)) +
geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Kita bisa menentukan lebar batang di histogram dengan opsi binwidth
ggplot(df1, aes(x = Sepal.Length)) +
geom_histogram(binwidth = 0.5)
Kita juga bisa memberi opsi warna, yaitu fill
untuk warna isi batangnya dan color
untuk warna pinggiran batangnya.
ggplot(df1, aes(x = Sepal.Length)) +
geom_histogram(binwidth = 0.5, fill = "skyblue", color = "black")
Boxplot
Untuk boxplot, tambahkan geom_boxplot
ggplot(df1, aes(x = Species, y = Sepal.Length)) +
geom_boxplot()
Kita juga bisa menenukan warna isi yaitu fill
dan warna pinggiran yaitu color
ggplot(df1, aes(x = Species, y = Sepal.Length)) +
geom_boxplot(fill = "skyblue", color = "black")
Lampiran untuk belajar lebih lanjut
ggplot2:
https://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html