ggplot2 là một package hỗ trợ visualization rất mạnh trong R. Dựa trên package này ta có thể vẽ được các đồ thị dạng barchart, line, plot, density, candle chart,pie,… và rất nhiều các đồ thị khác.Ngoài ra ggplot2 còn cho phép người dùng tùy chỉnh màu sắc, kích cỡ, theme, title, … để đồ thị được đẹp hơn. Cấu trúc của ggplot2 được chia rõ ràng làm 2 phần chính.
ggplot(): phần này qui định đồ thị sẽ sử dụng data nào làm đầu vào. Lưu ý data phải có dạng data.frame. Dạng vector sẽ không được support.
geom_(aes(x,y)): Phần này qui định kiểu đồ thị và các trục tọa độ từ dữ liệu đầu vào. Nếu chỉ có ggplot() mà không thêm geom_() thì chúng ta chỉ nhận được background mà không có đồ thị mặc dù data đã được khai báo. Trong geom_() chúng ta phải khai báo thêm trục tọa độ vào các arguments x và y của aes() chẳng hạn như geom_point(aes(x=bienx,y=bieny)).
Các kiểu đồ thị chính: geom_line(): biển diễn line geom_point(): biểu diễn point geom_chart(): biểu diễn chart geom_density(): biểu diễn dưới dạng density geom_vertical(): thêm trục vertical geom_abline(): thêm trục horizontal, vertical và diagonal geom_qq(): quantile and quantile plot geom_contour(): vẽ các đường đồng mức 2d và 3d geom_label() geom_text(): hiển thị text geom_raster(), geom_tile(), geom_rect(): biểu diễn dạng màu sắc mật độ.
library(ggplot2)
df <- data.frame(x=1:100,y = rnorm(200,0,1))
#Nếu chỉ dùng ggplot sẽ không có kết quả hiện ra
ggplot(df)
#Qui định kiểu đồ thị là point
ggplot(df) + geom_point(aes(x,y))
2 thành phần chính trên đã có thể tạo nên một graph cơ bản. Tuy nhiên để tùy chỉnh chuyên sâu hơn chúng ta cần có thêm các phần khác:
ggplot(df) + geom_point(aes(x,y)) + theme_minimal()
ggplot(df) + geom_point(aes(x,y)) + theme_minimal() +
labs(title = "First plot",
subtitle = "Pham Dinh Khanh",
x = "x axis",
y = "y axis")
scale_*_gradient tạo thành 2 màu gradient (low-high),
scale_*_gradient2 tạo thành màu sắc phân tán thành (low-mid-high),
scale_*_gradientn tạo thành n-colour gradient.
Khi quá bí về nhóm màu ta có thể tạo hệ màu sắc theo hàm terrain. Khi đó các mã hex của màu sắc sẽ được gen ra tự động. Lưu ý mã hex của màu sắc luôn bắt đầu bởi dấu # và gồm 6-8 kí tự. Các kí tự là chữ số phải nằm trong khoảng từ 0-9 hoặc chữ cái từ A-F.
#Tạo 5 màu tự động
terrain.colors(5,alpha = 0.2)
## [1] "#00A60033" "#E6E60033" "#EAB64E33" "#EEB99F33" "#F2F2F233"
Lưu ý để sử dụng được scale color thì chúng ta phaỉ truyền giá trị vào argument colour của aes() để khai báo giá trị sử dụng để scale.
# Chọn màu sắc theo scale của cty
ggplot(mpg) +
geom_point(aes(hwy,displ, colour = cty)) +
scale_colour_gradientn(colours = terrain.colors(10))
Đây là cách scale cũng tương tự như gradient nhưng sử dụng chỉ số độ trong suốt Alpha-transparency để biểu diễn các điểm theo mức độ quan trọng.
Các hàm có dạng:
scale_alpha(..., range = c(0.1, 1)): scale cho các biến liên tục
scale_alpha_continuous(..., range = c(0.1, 1)): scale cho các biến liên tục
scale_alpha_discrete(..., range = c(0.1, 1)): scale cho các biến phân loại
Trong đó các arguments có ý nghĩa như sau:
…: Các argument được pass vào để control name, limits, breaks, labels,…
range: Output của alpha và phải nằm trong khoảng 0 và 1.
#Scale theo biến liên tục.
ggplot(mpg, aes(displ,hwy))+
geom_point(aes(alpha = year)) +
scale_alpha(range = c(0.2,1))
#Scale theo biến phân loại
ggplot(mpg, aes(displ,hwy))+
geom_point(aes(alpha = class)) +
scale_alpha_discrete(range=c(0.2,1))
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'R'
## Note: no visible binding for global variable 'key.row'
## Note: no visible binding for global variable 'key.col'
## Note: no visible binding for global variable 'label.row'
## Note: no visible binding for global variable 'label.col'
## Note: no visible binding for global variable 'key.row'
## Note: no visible binding for global variable 'key.col'
## Note: no visible binding for global variable 'label.row'
## Note: no visible binding for global variable 'label.col'
## Note: no visible binding for global variable 'key.row'
## Note: no visible binding for global variable 'key.col'
## Note: no visible binding for global variable 'label.row'
## Note: no visible binding for global variable 'label.col'
## Note: no visible binding for global variable 'key.row'
## Note: no visible binding for global variable 'key.col'
## Note: no visible binding for global variable 'label.row'
## Note: no visible binding for global variable 'label.col'
Scale theo các màu sắc được cung cấp theo chuỗi sequential (tuần tự), chuỗi diverging (phân tán) và các chuỗi qualitative (chất lượng) sẵn có từ ColorBrewer. Có thể xem thêm trên website Colorbrewer.org
scale_colour_brewer(..., type = "seq", palette = 1, direction = 1)
scale_fill_brewer(..., type = "seq", palette = 1, direction = 1)
scale_colour_distiller(..., type = "seq", palette = 1, direction = -1,
values = NULL, space = "Lab", na.value = "grey50",
guide = "colourbar")
scale_fill_distiller(..., type = "seq", palette = 1, direction = -1,
values = NULL, space = "Lab", na.value = "grey50",
guide = "colourbar")
Đối với các biểu đồ dạng rectangle ta sẽ như barchart hay heatmap ta phải dùng scale_fill, còn các biểu đồ của point ta sẽ dùng scale_colour.
Trong đó :
…: là các argument khác để định nghĩa names, limits, breaks, labels.
type: là 3 kiểu lựa chọn sequential, diverging, qualitative.
palette: tên của bảng màu, có thể là string hoặc index.
direction: thứ tự các màu trong bảng màu, 1 là thứ tự tăng dần, -1 là ngược chiều.
values: Đánh số thứ tự trong vector gradient, hầu hết để NULL
space: Không gian màu sắc để từ đó tính toán gradient, nên chọn là “Lab” vì những space khác đã depreciated.
na.value: màu sử dụng cho missing value.
guide: Kiểu đánh màu gồm “colourbar” cho các màu liên tục, “legend” cho các màu phân loại.
Lưu ý:
Các palettes chính của 3 loại seqential, diverging và qualitative gồm:
Diverging BrBG, PiYG, PRGn, PuOr, RdBu, RdGy, RdYlBu, RdYlGn, Spectral
Qualitative Accent, Dark2, Paired, Pastel1, Pastel2, Set1, Set2, Set3
Sequential Blues, BuGn, BuPu, GnBu, Greens, Greys, Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples, RdPu, Reds, YlGn, YlGnBu, YlOrBr, YlOrRd
các scale_colour_distiller sẽ mở rộng các brewer thành các các scales liên tục bằng phương pháp interpolate 6 màu sắc khác nhau trong mỗi palette.
#màu sắc mặc định theo class
(p <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)))
#scale theo color brewer
p + scale_colour_brewer("Class of \n cars")
#scale sử dụng palettes Accent của Qualitative
p + scale_color_brewer(palette = "Accent")
#scale sử dụng palettes Set1 của sequential
p + scale_color_brewer(palette = "Set1")
#Scale trong biểu đồ histogram
(h <- ggplot(diamonds, aes(x=price, fill=cut))+
geom_histogram(position = "dodge", binwidth = 1500))
#Lưu ý đối với biểu đồ barchart ta phải dùng scale_fill thay cho scale_colour
h + scale_fill_brewer()
#Đảo ngược vị trí màu sắc
h + scale_fill_brewer(direction = -1)
#Sử dụng scale_fill trong heatmap
(v <- ggplot(faithfuld) +
geom_tile(aes(waiting, eruptions, fill = density)))
#Scale theo màu sắc bằng nhóm màu phân tán Spectral của palatte Diverging.
v + scale_fill_distiller(palette = "Spectral")
## Note: no visible binding for global variable 'x'
## Note: no visible binding for global variable 'width'
## Note: no visible binding for global variable 'x'
## Note: no visible binding for global variable 'width'
## Note: no visible binding for global variable 'y'
## Note: no visible binding for global variable 'height'
## Note: no visible binding for global variable 'y'
## Note: no visible binding for global variable 'height'
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class))
scale_*_date: scale time cho các kiểu thời gian thuộc class Date
scale_*_datetime: dành cho các class POSIXct
scale_*_time: dành có các kiểu thời gian thuộc class hms
Cú pháp chung:
scale_y_datetime(name = waiver(), breaks = waiver(),
date_breaks = waiver(), labels = waiver(), date_labels = waiver(),
minor_breaks = waiver(), date_minor_breaks = waiver(), timezone = NULL,
limits = NULL, expand = waiver(), position = "left")
Trong đó:
break: Khoảng break là bao nhiêu, có thể nhận các giá trị NULL (không break), waiver() theo mặc định package tính toán, một numeric vector của position, một hàm số trả về các khoảng breaks.
date_break: Xác định khoảng thời gian giữa các bước liên tiếp là bao nhiêu như “2 weeks”, “10 years”,…
labels: Là một trong những giá trị NULL (không có labels), waiver() là default label của package tính ra, một character vector gán nhãn cho labels(phải có độ dài = breaks), hoặc một function trả về labels.
date_labels: Là kí tự định dạng format thời gian cho labels. VD “%Y %b”, code này phải tuân theo kiểu strftime. Nếu labels được định dạng cùng với date_labels thì date_labels thắng.
limits: là vector cung cấp độ dài của scale gồm 2 điểm đầu và cuối. Chẳng hạn như c(as.Date(“2018-04-21”)-7,NA), c(as.Date(“2018-04-21”),as.Date(“2019-04-21”))
last_month <- Sys.Date() - 0:29
df <- data.frame(
date = last_month,
price = runif(30)
)
#Vẽ biểu đồ với định dạng time là yyyy-mm-dd
#Gõ strftime để biết định dạng time khi convert date.
ggplot(df,aes(date,price))+
geom_line() +
scale_x_date(date_labels = "%Y-%m-%d")
#Khai báo date break là 1 tuần
ggplot(df,aes(date,price))+
geom_line() +
scale_x_date(date_breaks = "1 week",date_labels = "%W")
#Chuyển sang dat ebreak = 1 ngày
ggplot(df,aes(date,price))+
geom_line() +
scale_x_date(date_breaks = "1 day",date_labels = "%d")
#Set date limit
ggplot(df,aes(date,price))+
geom_line() +
scale_x_date(date_breaks = "1 day",date_labels = "%Y-%b-%d",limits = c(Sys.Date()-7,NA))
2 hàm facet_wrap() và facet_grid() sử dụng để phân chia 1 đồ thị thành nhiều facet khác nhau. Trong đó:
facet_wrap(facets, nrow = NULL, ncol = NULL, scales = "fixed",
shrink = TRUE, labeller = "label_value", as.table = TRUE,
drop = TRUE, dir = "h", strip.position = "top")
Trong đó một số argument chính:
* facets: là công thức hoặc vector. Khi là công thức thì chỉ có 1 side chẳng hạn ~a+b, khi là vector sẽ có dạng c(“a”,“b”) qui định chiều sử dụng để phân loại dữ liệu thành các nhóm và mỗi nhóm sẽ được vẽ trên 1 facet. * nrow, ncol: qui định số dòng, số cột để sắp xếp các facets.
labeller: xác định label được hiển thị cho mỗi facet. Thông thường sẽ dùng “label_both”
scales: scales ở các trục x,y được fixed, free hoặc free 1 trong 2 trục với free_x hoặc free_y
strip.position: thay đổi vị trí các label. Có các option (“top”,“bottom”,“left”,“right”)
dir: thay đổi chiều biểu diễn các facets là dọc hay ngang dựa trên lựa chọn “v” hoặc “h”.
#Tạo mọt facet với các nhóm phân loại dựa trên class
ggplot(mpg) +
geom_point(aes(hwy, displ)) +
facet_wrap(c("class"))
#Muốn hiển thị label chi tiết hơn
ggplot(mpg) +
geom_point(aes(hwy, displ)) +
facet_wrap(c("class"), labeller = "label_both")
#Thay đổi vị trí của các label xuống dưới
ggplot(mpg) +
geom_point(aes(hwy, displ)) +
facet_wrap(c("class"), labeller = "label_both", strip.position = "bottom")
#Thay đổi chiều hiển thị facets từ ngang sang dọc
ggplot(mpg) +
geom_point(aes(hwy, displ)) +
facet_wrap(c("class"), dir = "v", strip.position = "bottom")
#Các facet đang có scale fixed, chúng ta muốn cho trục y free tức là mỗi một facet sẽ có một scale riêng
ggplot(mpg) +
geom_point(aes(hwy, displ)) +
facet_wrap(c("class"), dir = "v", strip.position = "bottom", scales = "free_y")
#Nếu muốn các đồ thị lặp lại dữ liệu và chỉ hightlight các category thuộc facet đó thì phải tạo một facet không chứa facet variable
ggplot(mpg,aes(displ, hwy)) +
geom_point(data = transform(mpg, class = NULL), colour = "grey") +
geom_point() +
facet_wrap(c("class"), dir = "v", strip.position = "bottom", scales = "free_y")
#Muốn scale theo màu sắc của trục y
ggplot(mpg,aes(displ, hwy)) +
geom_point(data = transform(mpg, class = NULL), colour = "grey") +
geom_point() +
facet_wrap(c("class"), strip.position = "bottom")
#Bản chất đồ thị trên gồm 2 lớp, lớp đầu tiên là tô cho toàn bộ đồ thị màu grey, bước thứ 2 là ở geom_point() bên dưới, chỉ những điểm có category thuộc facet mới được tô màu đè lên lớp 1.
#Tô màu theo scale thật sặc sỡ
ggplot(mpg,aes(displ, hwy)) +
geom_point(aes(colour = hwy)) +
facet_wrap(c("class"), strip.position = "bottom") +
scale_color_gradientn(colours = terrain.colors(10,alpha = 0.4))
#Điều chỉnh thêm theme cho màu sắc
ggplot(mpg,aes(displ, hwy)) +
geom_point(aes(colour = hwy)) +
theme_dark() +
facet_wrap(c("class"), strip.position = "bottom") +
scale_color_gradientn(colours = terrain.colors(10,alpha = 0.4))
#Đồ thị gốc
ggplot(mpg) +
geom_point(aes(hwy, displ))
#Thiết lập giới hạn cho x từ 15-20
ggplot(mpg) +
geom_point(aes(hwy, displ)) +
xlim(15,20)
#Thiết lập giới hạn cho y từ 12-20
ggplot(mpg) +
geom_point(aes(hwy, displ)) +
ylim(3,7)
#Thiết lập giới hạn cho class thuộc các nhóm c("compact","midsize","suv","minivan")
ggplot(mpg) +
geom_point(aes(hwy, displ, colour = class)) +
lims(colour = c("compact","midsize","suv","minivan"))