1 Chương 1 Giới thiệu về package plotly

1.1 Đặt vấn đề

Trong thời đại 4.0, để phát triển doanh nghiệp, họ đã tận dụng nguồn dữ liệu lớn trong công ty để phân tích và đưa ra hướng đi cho doanh nghiệp. Trong quá trình phân tích dữ liệu, việc trực quan hóa dữ liệu là việc không thể thiếu. Trực quan hóa dữ liệu giúp ta truyền đạt cho người khác dễ hơn đồng thời làm thông tin dễ hiểu để đưa ra hướng giải quyết. Qua bài tiểu luận này, chúng tôi sẽ giới thiệu ngắn gọn về package plotly.

Khác với những package trực quan hóa dữ liệu khác, plotly cho phép chúng ta tương tác được với biểu đồ mà vẫn vẽ được những đồ thị phức tạp

1.2 Lý do chọn đề tài

Plotly là một trong những gói trực quan hóa dữ liệu phổ biến và mạnh mẽ trong R. Nó cung cấp các chức năng linh hoạt để tạo ra đồ thị tương tác và trực quan, cho phép bạn tương tác với dữ liệu trực tiếp trong các đồ thị, đồ thị 3D, biểu đồ thể hiện địa lý, biểu đồ phân tán, biểu đồ dạng bản đồ động và nhiều loại biểu đồ khác. Với Plotly, bạn có thể tạo ra các đồ thị phức tạp và chất lượng cao với dòng lệnh đơn giản.

Gói Plotly trong R kết hợp mạnh mẽ giữa sức mạnh của ngôn ngữ lập trình R. Điều này cho phép bạn tận dụng tính linh hoạt và tích hợp đa dạng của R để xử lý dữ liệu và tính toán, trong khi vẫn có thể tạo ra các biểu đồ tương tác đẹp mắt và phức tạp như thể bạn đang làm việc với JavaScript.

Với Plotly, bạn có thể tạo ra các biểu đồ tương tác mà người dùng có thể tương tác trực tiếp với dữ liệu bằng cách di chuột, kéo thả hoặc phóng to/thu nhỏ. Điều này giúp truyền tải thông tin dễ dàng và giúp người dùng hiểu rõ hơn về dữ liệu một cách trực quan và nhanh chóng.

Plotly tích hợp chặt chẽ với các gói dữ liệu phổ biến khác trong R như ggplot2, dplyr, shiny, và rmarkdown. Điều này giúp bạn tạo ra các đồ thị tương tác dễ dàng và tích hợp vào các ứng dụng web và báo cáo R.

Gói Plotly có một cộng đồng sôi nổi và hỗ trợ mạnh mẽ từ các chuyên gia và người dùng R khác. Nếu bạn gặp vấn đề hoặc cần giúp đỡ, bạn có thể tìm kiếm thông tin hoặc hỏi thăm cộng đồng để nhận được sự hỗ trợ.

Với sự phát triển liên tục, gói Plotly được phát triển và cập nhật thường xuyên, đảm bảo tính năng và khả năng mới nhất từ nhà phát triển.

Tóm lại, sự kết hợp giữa tính trực quan, tích hợp và mạnh mẽ của Plotly trong R làm cho nó trở thành một đề tài thú vị và hấp dẫn để nghiên cứu và sử dụng trong việc trực quan hóa dữ liệu và phân tích trong R.

1.3 Mục tiêu nghiên cứu

Mục tiêu nghiên cứu là khám phá và tận dụng package plotly trong việc trực quan hóa dữ liệu Cụ thể chúng tôi chia thành những mục tiêu như sau:

  • Tìm hiểu về câu lệnh và tính năng của plotly

  • vẽ biểu đồ và áp dụng nó với dataset

Khảo sát chức năng và cách sử dụng gói Plotly: Mục tiêu đầu tiên là nghiên cứu và hiểu rõ các chức năng chính của gói Plotly và cách sử dụng nó để tạo ra các loại biểu đồ tương tác và trực quan. Cần xem xét các hàm, lớp và cú pháp để tạo ra các biểu đồ đơn giản và phức tạp trong gói này.

Tạo các biểu đồ tương tác đơn giản: Nghiên cứu có thể tập trung vào việc tạo các biểu đồ tương tác đơn giản như biểu đồ đường, biểu đồ cột, biểu đồ phân tán và các biểu đồ dạng bản đồ. Mục tiêu là hiểu cách thực hiện các biểu đồ này và làm cho chúng trở nên tương tác để người dùng có thể tương tác với dữ liệu một cách trực quan.

Xử lý dữ liệu và biểu đồ đa chiều: Nghiên cứu cũng có thể tập trung vào việc xử lý dữ liệu phức tạp và tạo ra các biểu đồ đa chiều như biểu đồ đa biến, biểu đồ 3D và biểu đồ địa lý. Mục tiêu là hiểu cách thực hiện các biểu đồ này và biểu diễn dữ liệu trong không gian nhiều chiều.

Tối ưu hóa hiệu suất và tương tác: Mục tiêu tiếp theo là tối ưu hóa hiệu suất của việc trực quan hóa dữ liệu bằng Plotly và cải thiện tính tương tác với người dùng. Cần xem xét các phương pháp để tối ưu hóa mã, xử lý dữ liệu hiệu quả và làm cho các biểu đồ tương tác phản hồi nhanh chóng và mượt mà.

2 Chương 2 Tổng quan Package Plotly

2.1 Khái nhiệm

Package “plotly” được tạo ra bởi nhóm phát triển tại “Plotly Technologies Inc.”, một công ty phần mềm công nghệ dựa trên dữ liệu có trụ sở tại Montreal, Canada. Công ty này chuyên về phát triển các giải pháp và công cụ phân tích dữ liệu tương tác và trực quan.

Package “plotly” trong R đã trở thành một công cụ phổ biến và mạnh mẽ trong cộng đồng R, giúp người dùng tạo ra các biểu đồ trực quan và tương tác cho các dự án phân tích dữ liệu và trình bày thông tin. Được tích hợp với R Markdown và R Shiny, package “plotly” cung cấp một phạm vi rộng các ứng dụng từ việc tạo báo cáo tương tác đến triển khai ứng dụng web tương tác.

2.2 Các hàm trong plotly

2.2.1 add_annotation

Trong R Studio, gói “plotly” cung cấp chức năng “add_annotation” để thêm các chú thích vào biểu đồ tương tác được tạo bằng Plotly. Chú thích này có thể là văn bản, mũi tên hoặc hình dạng tùy chỉnh.

Dưới đây là cú pháp sử dụng hàm “add_annotation” trong gói “plotly”:

add_annotation(plot, text, x, y, xref, yref, showarrow, arrowhead, ax, ay, …)

Trong đó:

plot: Đối tượng biểu đồ Plotly đã tạo trước đó.

text: Nội dung chú thích (văn bản) muốn hiển thị.

x, y: Tọa độ (x, y) của chú thích trên biểu đồ.

xref, yref: Tùy chọn để xác định liệu tọa độ (x, y) có tham chiếu đến trục x hoặc y của biểu đồ hay không. Một số giá trị phổ biến cho xref và yref là “x”, “y” hoặc “paper”.

showarrow: Xác định liệu mũi tên hiển thị hay không (TRUE hoặc FALSE).

arrowhead: Kiểu đầu mũi tên (sử dụng các giá trị từ 0 đến 9).

ax, ay: Điều chỉnh vị trí mũi tên (sử dụng các giá trị từ -30 đến 30).

Sau đây là 1 ví dụ cụ thể cho hàm này:

library(plotly)

# Tạo dữ liệu ví dụ
x <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 6, 4, 2)

# Tạo biểu đồ scatter plot
plot <- plot_ly(x = x, y = y, mode = "markers")

# Thêm chú thích
plot <- add_annotations(plot, text = "Chú thích ví dụ", x = 3, y = 6, showarrow = TRUE, arrowhead = 1)

# Hiển thị biểu đồ
plot

2.2.2 add_trace

hàm add_trace() được sử dụng để thêm các loại trình bày dữ liệu khác nhau vào biểu đồ tương tác. Ví dụ: dữ liệu dạng điểm, đường, thanh, vùng, hình tròn, v.v. Điều này cho phép bạn hiển thị nhiều loại dữ liệu trên cùng một biểu đồ Plotly.

Dưới đây là cú pháp sử dụng hàm add_trace():

add_trace(plot, data, …, type)

Trong đó:

plot: Đối tượng biểu đồ Plotly đã tạo trước đó.

data: Dữ liệu mới mà bạn muốn thêm vào biểu đồ. Điều này thường là một dataframe hoặc một tập hợp các vector.

type: Loại dữ liệu bạn muốn thêm (ví dụ: “scatter”, “bar”, “box”, …).

Dưới đây là một ví dụ cơ bản về cách sử dụng hàm add_trace() để thêm dữ liệu dạng điểm vào biểu đồ scatter plot:

library(plotly)

# Tạo dữ liệu ví dụ
x <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 6, 4, 2)

# Tạo biểu đồ scatter plot
plot <- plot_ly(x = x, y = y, type = "scatter", mode = "markers")

# Thêm dữ liệu dạng điểm khác
new_x <- c(1.5, 2.5, 3.5)
new_y <- c(3, 5, 2)
plot <- add_trace(plot, x = new_x, y = new_y, type = "scatter", mode = "markers", marker = list(color = "red"))

# Hiển thị biểu đồ
plot

2.2.3 animation_opts

animation_opts() là một hàm dùng để tùy chỉnh các tùy chọn liên quan đến hiệu ứng hoạt hình trong biểu đồ tương tác. Hàm này thường được sử dụng cùng với các hàm tạo biểu đồ như plot_ly() và add_trace() để tạo ra hiệu ứng hoạt hình cho dữ liệu.

Dưới đây là cú pháp sử dụng hàm animation_opts():

animation_opts(frame = NULL, redraw = TRUE, easing = “linear”, duration = 1000, easingfunc = NULL)

Trong đó:

frame: Một danh sách các frame (gọi là key frames) chứa các thông số của từng khung hình trong hoạt hình.

redraw: Một giá trị logic xác định liệu có cần vẽ lại biểu đồ sau mỗi khung hình mới hay không.

easing: Hàm lựa chọn cho việc điều chỉnh tốc độ của hoạt hình. Các giá trị thông thường bao gồm “linear”, “cubic-in-out”, “elastic-in-out”, v.v.

duration: Thời gian (đơn vị milliseconds) mà mỗi khung hình sẽ hiển thị trong hoạt hình.

easingfunc: Một hàm tùy chỉnh để điều chỉnh tốc độ hoạt hình.

Dưới đây là một ví dụ về cách sử dụng animation_opts():

library(plotly)
df <- data.frame(x = c(1, 2, 3), y = c(1, 2, 3))
plot_ly(df) %>% 
add_markers(x = ~x, y = ~y, frame = ~x) %>%
animation_opts(frame = 1000)

3 Một số nguyên tắc và các loại biểu đồ cơ bản plotly

Trong R, bạn có thể sử dụng gói “plotly” để tạo trực quan hóa tương tác tương tự như gói Python. Để bắt đầu, hãy đảm bảo bạn đã cài đặt gói “plotly” bằng cách chạy lệnh sau:

3.1 Nguyên tắc cơ bản

3.1.1 Cấu trúc dữ liệu trong R

3.1.1.1 Tổng quan

Thư viện vẽ đồ thị R của Plotly tạo ra các đồ thị tương tác, chất lượng xuất bản. Ví dụ về cách tạo biểu đồ đường, biểu đồ phân tán, biểu đồ vùng, biểu đồ thanh, thanh lỗi, biểu đồ hộp, biểu đồ, bản đồ nhiệt, biểu đồ con, nhiều trục và biểu đồ 3D (dựa trên WebGL). Plotly.R là mã nguồn mở, miễn phí và bạn có thể xem mã nguồn, báo cáo sự cố hoặc đóng góp trên GitHub. Quá trình kết xuất sử dụng thư viện JavaScript Plotly.js . Các số liệu có thể được biểu diễn trong R dưới dạng danh sách hoặc dưới dạng phiên bản của plotly, và được đánh số thứ tự thành văn bản trong Ký hiệu đối tượng JavaScript (JSON) trước khi được chuyển đến Plotly.js.

Xem cấu trúc dữ liệu cơ bản cho bất kỳ plotly đối tượng nào, có thể được thực hiện thông qua dput(fig).

library(plotly) 

fig <- plot_ly() %>% 
  add_lines(x = c("a","b","c"), y = c(1,3,2))%>% 
  layout(title="sample figure", xaxis = list(title = 'x'), yaxis = list(title = 'y'), plot_bgcolor = "#c7daec") 

str(fig$x) 
## List of 7
##  $ visdat     :List of 1
##   ..$ 2e6844144c99:function ()  
##  $ cur_data   : chr "2e6844144c99"
##  $ attrs      :List of 2
##   ..$ 2e6844144c99:List of 3
##   .. ..$ alpha_stroke: num 1
##   .. ..$ sizes       : num [1:2] 10 100
##   .. ..$ spans       : num [1:2] 1 20
##   ..$ 2e6844144c99:List of 8
##   .. ..$ alpha_stroke: num 1
##   .. ..$ sizes       : num [1:2] 10 100
##   .. ..$ spans       : num [1:2] 1 20
##   .. ..$ x           : chr [1:3] "a" "b" "c"
##   .. ..$ y           : num [1:3] 1 3 2
##   .. ..$ type        : chr "scatter"
##   .. ..$ mode        : chr "lines"
##   .. ..$ inherit     : logi TRUE
##   .. ..- attr(*, "class")= chr [1:2] "plotly_line" "list"
##  $ layout     :List of 3
##   ..$ width : NULL
##   ..$ height: NULL
##   ..$ margin:List of 4
##   .. ..$ b: num 40
##   .. ..$ l: num 60
##   .. ..$ t: num 25
##   .. ..$ r: num 10
##  $ source     : chr "A"
##  $ config     :List of 2
##   ..$ modeBarButtonsToAdd: chr [1:2] "hoverclosest" "hovercompare"
##   ..$ showSendToCloud    : logi FALSE
##  $ layoutAttrs:List of 1
##   ..$ 2e6844144c99:List of 4
##   .. ..$ title       : chr "sample figure"
##   .. ..$ xaxis       :List of 1
##   .. .. ..$ title: chr "x"
##   .. ..$ yaxis       :List of 1
##   .. .. ..$ title: chr "y"
##   .. ..$ plot_bgcolor: chr "#c7daec"
##  - attr(*, "TOJSON_FUNC")=function (x, ...)
fig

3.1.1.2 Biểu đồ dưới dạng Cây thuộc tính

Plotly.js hỗ trợ các đầu vào tuân thủ một lược đồ được xác định rõ ràng, có kiến ​​trúc tổng thể được giải thích trong trang này và được ghi lại đầy đủ trong Tham chiếu hình (bản thân lược đồ này được tạo từ biểu diễn JSON có thể đọc được bằng máy của lược đồ ). Các hình được biểu diễn dưới dạng cây với các nút được đặt tên gọi là “thuộc tính”. Các thuộc tính được nhắc đến trong văn bản và trong Tham chiếu Hình theo tên của chúng. Ví dụ “layout = list(width = NULL)”: đề cập đến thuộc tính có khóa nằm “width”trong danh sách là giá trị được liên kết với khóa “layout”ở gốc của hình.

Khi thao tác với một plotly đối tượng, các thuộc tính có thể được đặt trực tiếp bằng cách sử dụng các thuộc tính đối tượng R, ví dụ: fig.layout.title.font.family=“Open Sans”hoặc sử dụng fig %>% layout(title = list(font = ‘Open Sans’)).

Khi xây dựng một hình, không nhất thiết phải điền mọi thuộc tính của mọi đối tượng. Tại thời điểm kết xuất, lớp JavaScript sẽ tính toán các giá trị mặc định cho từng thuộc tính không xác định được yêu cầu, tùy thuộc vào các thuộc tính được chỉ định, như được ghi trong Tham chiếu Hình . Một ví dụ về điều này sẽ là layout.xaxis.range, có thể được chỉ định rõ ràng, nhưng nếu không sẽ được tính toán dựa trên phạm vi xgiá trị cho mọi dấu vết được liên kết với trục đó. Lớp JavaScript sẽ bỏ qua các thuộc tính không xác định hoặc giá trị không đúng định dạng, mặc dù plotlymô-đun cung cấp xác thực phía R cho các giá trị thuộc tính.

3.1.2 Tạo và cập nhật số liệu trong R

Gói plotly R tồn tại để tạo, thao tác và hiển thị các số liệu đồ họa (tức là biểu đồ, sơ đồ, bản đồ và sơ đồ) được biểu thị bằng cấu trúc dữ liệu còn được gọi là số liệu. Quá trình kết xuất sử dụng thư viện JavaScript Plotly.js mặc dù các nhà phát triển R sử dụng mô-đun này rất hiếm khi cần tương tác trực tiếp với thư viện Javascript, nếu có. Các hình có thể được biểu diễn trong R dưới dạng danh sách hoặc dưới dạng phiên bản của Hình vẽ theo sơ đồ và được đánh số thứ tự thành văn bản trong Ký hiệu đối tượng JavaScript (JSON) trước khi được chuyển đến Plotly.js.

3.1.2.1 Số liệu dưới dạng danh sách

Các số liệu có thể được biểu diễn dưới dạng Danh sách và được hiển thị bằng plotly_build chức năng. Danh fig sách trong ví dụ dưới đây mô tả một hình. Nó chứa một bar dấu vết duy nhất và một tiêu đề.

library(plotly)
fig1 = list(
  data = list(
    list(
      x = c(1, 2, 3),
      y = c(1, 3, 2),
      type = 'bar'
    )
  ),
  layout = list(
    title = 'A Figure Specified By R List',
    plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff')
  )
)
# To display the figure defined by this list, use the plotly_build function

plotly_build(fig1)

3.1.2.2 Số liệu plotly

Hàm này plot_lycung cấp một hệ thống phân cấp các lớp được tạo tự động có thể được sử dụng để biểu diễn các số liệu.

plot_lysố liệu có một số lợi ích so với Danh sách R đơn giản.

plot_lysố liệu cung cấp xác nhận dữ liệu chính xác. Nếu bạn cung cấp tên thuộc tính không hợp lệ hoặc giá trị thuộc tính không hợp lệ làm khóa cho Hình vẽ sơ đồ, một ngoại lệ sẽ được đưa ra với thông báo lỗi hữu ích mô tả sự cố. Đây không phải là trường hợp nếu bạn sử dụng danh sách R đơn giản để xây dựng số liệu của mình. plot_lycác hình chứa các mô tả của từng thuộc tính hợp lệ dưới dạng R docstrings. Bạn có thể sử dụng các chuỗi tài liệu này trong môi trường phát triển mà bạn chọn để tìm hiểu về các thuộc tính có sẵn thay thế cho việc tham khảo Tài liệu tham khảo đầy đủ trực tuyến . Các thuộc tính của plot_lyhình có thể được truy cập bằng cách sử dụng cả tra cứu khóa kiểu từ điển (ví dụ: fig$x). plot_lycác số liệu hỗ trợ các chức năng tiện lợi cấp cao hơn để cập nhật các số liệu đã được xây dựng ( .layout(), .add_trace()v.v.). plot_lycác hình hỗ trợ các chức năng kết xuất và xuất kèm theo tự động gọi các chức năng thích hợp. Dưới đây, bạn có thể tìm thấy ví dụ về một cách mà hình trong ví dụ trên có thể được chỉ định bằng cách sử dụng hình plot_lythay vì danh sách.

library(plotly) 

fig2 <- plot_ly(x = c(1, 2, 3), y = c(1, 3, 2), type = 'bar')%>% 
  layout(title = 'A Plotly Figure',
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff')) 
fig2

3.1.2.3 Tạo hình

3.1.2.3.1 Scatter plots (Biểu đồ scatter)
library(plotly)
data(iris)

fig3 <- plot_ly(data = iris, x = ~Sepal.Width, y = ~Sepal.Length, color = ~Species, 
               type = "scatter", mode = "markers")%>%
  layout(title="A Plotly Figure", legend=list(title=list(text='species')),
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))
fig3
3.1.2.3.2 Make subplots (Thực hiện subplots)

Hàm subplots() tạo ra một plot_ly hình được cấu hình sẵn với một lưới các ô con có thể thêm dấu vết vào.

library(plotly)

fig4 <- plot_ly(y = c(4, 2, 1), type = "scatter", mode = "lines") %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))
fig5 <- plot_ly(y = c(2, 1, 3), type = "bar") %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

figs <- subplot(fig4, fig5)
figs
3.1.2.3.3 Cập nhật số liệu

Bất kể một plot_ly hình được xây dựng như thế nào, nó có thể được cập nhật bằng cách thêm các dấu vết bổ sung vào nó và sửa đổi các thuộc tính của nó.

3.1.2.3.4 Thêm điểm dữ liệu

Các dấu vết mới có thể được thêm vào một plot_ly hình bằng add_trace() phương pháp này. Phương pháp này chấp nhận một plot_ly dấu vết hình và thêm nó vào hình. Điều này cho phép bạn bắt đầu với một hình trống và thêm dấu vết vào nó một cách tuần tự.

library(plotly) 

fig7 <- plot_ly()%>%
  add_trace(x = c(1, 2, 3), y = c(1, 3, 2), type = 'bar') %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))
fig7
library(plotly)
data(iris)

fig8 <- plot_ly()%>%
  add_trace(data = iris, x = ~Sepal.Width, y = ~Sepal.Length, color = ~Species, 
               type = "scatter", mode = "markers")%>%
  layout(title="Biểu đồ mối tương quan",  legend=list(title=list(text='loài hoa')),
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))%>%
  add_trace(x = c(2, 4), y = c(4, 8), type = "scatter", mode = "lines", line = list(color = 'grey')
            , showlegend = FALSE)
fig8
3.1.2.3.5 Cập nhật điểm dữ liệu

plot_ly hỗ trợ phương thức style() và có thể được sử dụng để cập nhật nhiều thuộc tính lồng nhau của một hoặc nhiều dấu vết của hình.

Để hiển thị một số ví dụ, chúng tôi sẽ bắt đầu với một biểu đồ có chứa bar và scatter theo dõi hai ô subplots.

library(plotly)

fig1 <-  plot_ly(x = c(0,1, 2), y = c(2, 1, 3), type = 'bar', name = 'b', color = I("red")) %>%
  add_trace(x = c(0,1, 2), y = c(4, 2, 3.5), type = 'scatter', mode = 'markers', name = 'a',
            marker = list(size = 20, color = 'rgb(51, 204, 51)')) %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig2 <-  plot_ly(x = c(0,1, 2), y = c(1, 3, 2), type = 'bar', name = 'c', color = I("#33cc33")) %>%
  add_trace(x = c(0,1, 2), y = c(2, 3.5, 4), type = 'scatter', mode = 'markers', name = 'd',
            marker = list(size = 20, color = 'rgb(255, 0, 0)')) %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig <- subplot(fig1, fig2)
fig

Lưu ý rằng cả dữ liệu scatter và bar đều có marker.color thuộc tính để kiểm soát màu sắc của chúng. Đây là một ví dụ về cách sử dụng style() để sửa đổi màu của tất cả các dấu vết.

library(plotly)

fig8 <-  plot_ly(x = c(0,1, 2), y = c(2, 1, 3), type = 'bar', name = 'b', color = I("red")) %>%
  add_trace(x = c(0,1, 2), y = c(4, 2, 3.5), type = 'scatter', mode = 'markers', name = 'a',
            marker = list(size = 20, color = 'rgb(51, 204, 51)')) %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig8 <- style(fig1, marker = list(size = 20, color = "blue"))

fig9 <-  plot_ly(x = c(0,1, 2), y = c(1, 3, 2), type = 'bar', name = 'c', color = I("#33cc33")) %>%
  add_trace(x = c(0,1, 2), y = c(2, 3.5, 4), type = 'scatter', mode = 'markers', name = 'd',
            marker = list(size = 20, color = 'rgb(255, 0, 0)')) %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig9 <- style(fig1, marker = list(size = 20, color = "blue"))

figd <- subplot(fig8, fig9)
fig

Phương pháp style() hỗ trợ một traces để kiểm soát dấu vết nào sẽ được cập nhật. Chỉ dấu vết được đưa ra sẽ được cập nhật. Dưới đây là một ví dụ về việc sử dụng dấu vết để chỉ cập nhật màu của dấu vết.

library(plotly)

fig1 <-  plot_ly(x = c(0,1, 2), y = c(2, 1, 3), type = 'bar', name = 'b', color = I("red")) %>%
  add_trace(x = c(0,1, 2), y = c(4, 2, 3.5), type = 'scatter', mode = 'markers', name = 'a',
            marker = list(size = 20, color = 'rgb(51, 204, 51)')) %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig1 <- style(fig1, marker = list(color = "blue"), traces = c(1))

fig2 <-  plot_ly(x = c(0,1, 2), y = c(1, 3, 2), type = 'bar', name = 'c', color = I("#33cc33")) %>%
  add_trace(x = c(0,1, 2), y = c(2, 3.5, 4), type = 'scatter', mode = 'markers', name = 'd',
            marker = list(size = 20, color = 'rgb(255, 80, 80)')) %>%
  layout(plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig2 <- style(fig2, marker = list(color = "blue"), traces = c(1))

fig <- subplot(fig1, fig2)
fig
3.1.2.3.6 Cập nhật hình trục

Phương pháp hỗ trợ hình vẽ theo sơ đồ layout có thể được sử dụng để cập nhật nhiều thuộc tính lồng nhau của một hoặc nhiều trục của hình. Dưới đây là một ví dụ về việc sử dụng layout để vô hiệu hóa các đường lưới dọc trên tất cả các ô con trong một hình do Plotly tạo ra.

library(plotly)
data(iris)

fig <- iris%>%
  group_by(Species) %>%
  do(p=plot_ly(., x = ~Sepal.Width, y = ~Sepal.Length, color = ~Species, type = "scatter", mode = "markers")) %>%
  subplot(nrows = 1, shareX = TRUE, shareY = TRUE)
fig <- fig%>%
  layout(title = "Updating x axis in a Plotly Figure", legend=list(title=list(text='species')),
         xaxis = list(showgrid = F), 
         xaxis2 = list(showgrid = F), 
         xaxis3 = list(showgrid = F),
         annotations = list(  
           list(  
             x = 0.16,   
             y = 0.95,   
             font = list(size = 10),   
             text = "species=setosa",   
             xref = "paper",   
             yref = "paper",   
             xanchor = "center",   
             yanchor = "bottom",   
             showarrow = FALSE  
           ),   
           list(  
             x = 0.5,   
             y = 0.95,   
             font = list(size = 10),   
             text = "species=versicolor",   
             xref = "paper",   
             yref = "paper",   
             xanchor = "center",   
             yanchor = "bottom",   
             showarrow = FALSE  
           ),   
           list(  
             x = 0.85,   
             y = 0.95,   
             font = list(size = 10),   
             text = "species=virginica",   
             xref = "paper",   
             yref = "paper",   
             xanchor = "center",   
             yanchor = "bottom",   
             showarrow = FALSE  
           )),
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig

3.1.3 Hiển thị số liệu trong R

Thư viện vẽ đồ thị R của Plotly cung cấp cho bạn nhiều tùy chọn về cách thức và vị trí hiển thị các số liệu của bạn.

Nói chung, có bốn cách tiếp cận khác nhau mà bạn có thể thực hiện để hiển thị plotlysố liệu:

Sử dụng rendererskhung trong ngữ cảnh của tập lệnh hoặc sổ ghi chép (chủ đề chính của trang này)

Sử dụng Dash trong ngữ cảnh ứng dụng web

Bằng cách xuất sang tệp HTML và tải tệp đó trong trình duyệt ngay lập tức hoặc sau đó bằng cách hiển thị hình thành tệp hình ảnh tĩnh bằng Kaleido, chẳng hạn như PNG, JPEG, SVG, PDF hoặc EPS và tải tệp kết quả trong bất kỳ trình xem nào

Mỗi trong số hai cách tiếp cận đầu tiên được thảo luận dưới đây.

3.1.3.1 Hiển thị số liệu bằng rendererskhung

Khung trình kết xuất là một cách tiếp cận linh hoạt để hiển thị plotlysố liệu trong nhiều ngữ cảnh khác nhau. Để hiển thị một hình bằng cách sử dụng khung trình kết xuất, bạn gọi print()phương thức trên hình đối tượng biểu đồ. Nó sẽ hiển thị hình bằng cách sử dụng (các) trình kết xuất mặc định hiện tại.

Trong hầu hết các trường hợp, bạn có thể bỏ qua cuộc gọi đến print()và cho phép hình tự hiển thị.

library(plotly)

fig <-  plot_ly(x = c(0,1, 2), y = c(2, 1, 3), type = 'bar') %>%
  layout(title = 'A Figure Displaying Itself',
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig

Nói chính xác, các số liệu sẽ tự hiển thị bằng cách sử dụng trình kết xuất mặc định hiện tại khi biểu thức cuối cùng trong một ô phải đánh giá thành một số liệu.

Trong nhiều ngữ cảnh, trình kết xuất phù hợp sẽ được chọn tự động và bạn sẽ không cần thực hiện bất kỳ cấu hình bổ sung nào.

Tiếp theo, chúng tôi sẽ trình bày cách định cấu hình trình kết xuất mặc định. Sau đó, chúng tôi sẽ mô tả tất cả các trình kết xuất tích hợp sẵn và thảo luận về lý do tại sao bạn có thể chọn sử dụng từng trình kết xuất.

3.1.3.2 Ghi đè Trình kết xuất mặc định

Cũng có thể tạm thời ghi đè trình kết xuất mặc định bằng cách chuyển ‘toWebGL()’ sang hình. Dưới đây là một ví dụ về hiển thị hình bằng webgltrình kết xuất (được mô tả bên dưới) mà không thay đổi trình kết xuất mặc định.

library(plotly)

fig <-  plot_ly(x = c(0,1, 2), y = c(2, 1, 3), type = 'bar') %>%
  layout(title = "A Figure Displayed with 'webgl' Renderer",
         plot_bgcolor='#e5ecf6', 
         xaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'), 
         yaxis = list( 
           zerolinecolor = '#ffff', 
           zerolinewidth = 2, 
           gridcolor = 'ffff'))

fig <- fig %>% toWebGL()

fig

3.1.3.3 Các trình kết xuất khác

JSON: Trong các trình chỉnh sửa hỗ trợ nó , trình kết xuất này hiển thị biểu diễn JSON của một hình trong cấu trúc cây tương tác có thể thu gọn. Điều này có thể rất hữu ích để kiểm tra cấu trúc của các hình phức tạp. Chúng ta phải sử dụng hàm toJSON() để vẽ hình.

3.1.3.4 Nhiều trình kết xuất

Bạn có thể chỉ định nhiều trình kết xuất bằng cách thêm các chức năng tương ứng của chúng một cách riêng biệt. Điều này hữu ích khi viết mã cần hỗ trợ nhiều ngữ cảnh.

3.2 Các biểu đồ cơ bản trong R

Cách tạo biểu đồ đường và phân tán trong R. Ví dụ về biểu đồ phân tán cơ bản và nâng cao, biểu đồ đường chuỗi thời gian, biểu đồ màu và biểu đồ mật độ.

3.2.1 Scatter plot (Biểu đồ phân tán)

library(plotly)

fig <- plot_ly(data = iris, x = ~Sepal.Length, y = ~Petal.Length,
               marker = list(size = 10,
                             color = 'rgba(255, 182, 193, .9)',
                             line = list(color = 'rgba(152, 0, 0, .8)',
                                         width = 2)))
fig <- fig %>% layout(title = 'Styled Scatter',
         yaxis = list(zeroline = FALSE),
         xaxis = list(zeroline = FALSE))

fig

3.2.1.1 Vẽ các điểm đánh dấu và đường kẻ

library(plotly)

trace_0 <- rnorm(100, mean = 5)
trace_1 <- rnorm(100, mean = 0)
trace_2 <- rnorm(100, mean = -5)
x <- c(1:100)

data <- data.frame(x, trace_0, trace_1, trace_2)

fig <- plot_ly(data, x = ~x)
fig <- fig %>% add_trace(y = ~trace_0, name = 'trace 0',mode = 'lines')
fig <- fig %>% add_trace(y = ~trace_1, name = 'trace 1', mode = 'lines+markers')
fig <- fig %>% add_trace(y = ~trace_2, name = 'trace 2', mode = 'markers')

fig

3.2.1.2 Thang màu định tính

library(plotly)

fig <- plot_ly(data = iris, x = ~Sepal.Length, y = ~Petal.Length, color = ~Species)

fig

3.2.1.3 Biến đổi dữ liệu thành ký hiệu

library(plotly)

fig <- plot_ly(data = iris, x = ~Sepal.Length, y = ~Petal.Length, type = 'scatter',
  mode = 'markers', symbol = ~Species, symbols = c('circle','x','o'),
  color = I('black'), marker = list(size = 10))

fig

3.2.1.4 Thêm màu và kích thước

library(plotly)

d <- diamonds[sample(nrow(diamonds), 1000), ]

fig <- plot_ly(
  d, x = ~carat, y = ~price,
  color = ~carat, size = ~carat
)

fig

3.2.2 Bar chart (Biểu đồ cột)

Biểu đồ cột thường được sử dụng để thể hiện sự biến đổi hoặc so sánh giữa các giá trị, nhóm, hoặc thể hiện xu hướng trong dữ liệu. Cách tạo biểu đồ thanh trong R. Ví dụ về biểu đồ thanh được nhóm, xếp chồng.

3.2.2.1 Biểu đồ cột được nhóm

library(plotly)

Animals <- c("hươu cao cổ", "đười ươi", "khỉ")
SF_Zoo <- c(20, 14, 23)
LA_Zoo <- c(12, 18, 29)
data <- data.frame(Animals, SF_Zoo, LA_Zoo)

fig <- plot_ly(data, x = ~Animals, y = ~SF_Zoo, type = 'bar', name = 'SF Zoo')
fig <- fig %>% add_trace(y = ~LA_Zoo, name = 'LA Zoo')
fig <- fig %>% layout(yaxis = list(title = 'Count'), barmode = 'group')

fig

Ta thấy rằng số lượng khỉ và đười ươi của sở thú LA chiếm số lượng nhiều hơn sở thú SF, còn hươu cao cổ của sở thú SF chiếm số lượng nhiều hơn sở thú LA

3.2.2.2 Biểu đồ cột xếp chồng lên nhau

library(plotly)

Animals <- c("hươu cao cổ", "đười ươi", "khỉ")
SF_Zoo <- c(20, 14, 23)
LA_Zoo <- c(12, 18, 29)
data <- data.frame(Animals, SF_Zoo, LA_Zoo)

fig <- plot_ly(data, x = ~Animals, y = ~SF_Zoo, type = 'bar', name = 'SF Zoo')
fig <- fig %>% add_trace(y = ~LA_Zoo, name = 'LA Zoo')
fig <- fig %>% layout(yaxis = list(title = 'Count'), barmode = 'stack')

fig

3.2.2.3 Biểu đồ cột được nhóm với các nhãn trực tiếp

library(plotly)

x <- c('Product A', 'Product B', 'Product C')
y <- c(20, 14, 23)
y2 <- c(16,12,27)
text <- c('27% market share', '24% market share', '19% market share')
data <- data.frame(x, y, y2, text)

fig <- data %>% plot_ly()
fig <- fig %>% add_trace(x = ~x, y = ~y, type = 'bar',
             text = y, textposition = 'auto',
             marker = list(color = 'rgb(158,202,225)',
                           line = list(color = 'rgb(8,48,107)', width = 1.5)))
fig <- fig %>% add_trace(x = ~x, y = ~y2, type = 'bar',
            text = y2, textposition = 'auto',
            marker = list(color = 'rgb(58,200,225)',
                          line = list(color = 'rgb(8,48,107)', width = 1.5)))
fig <- fig %>% layout(title = "January 2013 Sales Report",
         barmode = 'group',
         xaxis = list(title = "Sản phẩm"),
         yaxis = list(title = "Số lượng"))

fig

Ta thấy rằng các cột trong biểu đồ được dán số lên từng cột để có thể dễ dàng so sánh với số liệu cụ thể

3.2.3 Pie chart (Biểu đồ hình tròn)

Biểu đồ hình tròn thường được sử dụng để thể hiện mối quan hệ phần trăm giữa các nhóm dữ liệu khác nhau. Đây là một cách hữu ích để trực quan hóa sự phân chia và cân bằng giữa các thành phần trong tập dữ liệu.

3.2.3.1 Biểu đồ hình tròn cơ bản

library(plotly)

USPersonalExpenditure <- data.frame("Categorie"=rownames(USPersonalExpenditure), USPersonalExpenditure)
data <- USPersonalExpenditure[,c('Categorie', 'X1960')]

fig <- plot_ly(data, labels = ~Categorie, values = ~X1960, type = 'pie')
fig <- fig %>% layout(title = 'Chỉ số tiêu dùng cá nhân của người dân Mỹ vào năm 1960',
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))

fig

Ta thấy rằng chỉ số tiêu dùng đồ ăn và thuốc lá chiếm hơn phân nửa là 53,2%,chỉ số tiêu dùng cho gia đình chiếm 28,3%, chỉ số tiêu dùng cho y tế và sức khỏe chiếm 12,9%, chỉ số tiêu dùng cho sức khỏe và giáo dục chiếm ít nhất với tỉ lệ lần lượt là 3,31% và 2,23%

3.2.3.2 Biểu đồ tròn có subplot

Để tạo các ô con biểu đồ hình tròn, bạn cần sử dụng thuộc tính miền . Điều quan trọng cần lưu ý là X mảng đặt vị trí nằm ngang trong khi Y mảng đặt vị trí dọc. Ví dụ: x=[0,0.5], y=[0, 0.5] có nghĩa là vị trí dưới cùng bên trái của cốt truyện.

library(plotly)
library(dplyr)

fig <- plot_ly()
fig <- fig %>% add_pie(data = count(diamonds, cut), labels = ~cut, values = ~n,
          name = "Cut", domain = list(x = c(0, 0.4), y = c(0.4, 1)))
fig <- fig %>% add_pie(data = count(diamonds, color), labels = ~color, values = ~n,
          name = "Color", domain = list(x = c(0.6, 1), y = c(0.4, 1)))
fig <- fig %>% add_pie(data = count(diamonds, clarity), labels = ~clarity, values = ~n,
          name = "Clarity", domain = list(x = c(0.25, 0.75), y = c(0, 0.6)))
fig <- fig %>% layout(title = "Pie Charts with Subplots", showlegend = F,
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))

fig

3.2.3.3 Donut chart (Biểu đồ dạng donut)

library(plotly)
library(dplyr)

# Get Manufacturer
mtcars$manuf <- sapply(strsplit(rownames(mtcars), " "), "[[", 1)

df <- mtcars
df <- df %>% group_by(manuf)
df <- df %>% summarize(count = n())
fig <- df %>% plot_ly(labels = ~manuf, values = ~count)
fig <- fig %>% add_pie(hole = 0.6)
fig <- fig %>% layout(title = "Số lượng dòng xe tự động hóa của các hãng xe",  showlegend = F,
                      xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
                      yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))

fig

3.2.4 Bubble chart (Biểu đồ bong bóng)

Đây là một loại biểu đồ dùng để hiển thị thông tin đồ họa cho hai hoặc ba biến. Biểu đồ bong bóng thể hiện dữ liệu bằng cách sử dụng các điểm (bong bóng) trên mặt phẳng. Mỗi bong bóng biểu thị một quan sát và có kích thước và vị trí xác định bởi giá trị của các biến.

Cách tạo biểu đồ bong bóng trong R. Biểu đồ bong bóng là một biểu đồ phân tán có các điểm đánh dấu có màu sắc và kích thước thay đổi.

3.2.4.1 Biểu đồ bong bóng đơn giản

library(plotly)

data <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/school_earnings.csv")

fig <- plot_ly(data, x = ~Women, y = ~Men, text = ~School, type = 'scatter', mode = 'markers',
        marker = list(size = ~Gap, opacity = 0.5))
fig <- fig %>% layout(title = 'Khoảng cách thu nhập giữa nam và nữ của các trường đại học',
         xaxis = list(showgrid = FALSE),
         yaxis = list(showgrid = FALSE))

fig

Qua biểu đồ ta thấy rằng khoảng cách thu nhập ngày tăng đặc biệt là tăng rõ rệt ở những trường đứng đầu

3.2.4.2 Biểu đồ bong bóng theo nhóm

library(plotly)

data <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")

data_2007 <- data[which(data$year == 2007),]
data_2007 <- data_2007[order(data_2007$continent, data_2007$country),]
slope <- 2.666051223553066e-05
data_2007$size <- sqrt(data_2007$pop * slope)
colors <- c('#4AC6B7', '#1972A4', '#965F8A', '#FF7070', '#C61951')

fig <- plot_ly(data_2007, x = ~gdpPercap, y = ~lifeExp, color = ~continent, size = ~size, colors = colors,
        type = 'scatter', mode = 'markers', sizes = c(min(data_2007$size), max(data_2007$size)),
        marker = list(symbol = 'circle', sizemode = 'diameter',
                      line = list(width = 2, color = '#FFFFFF')),
        text = ~paste('Country:', country, '<br>Life Expectancy:', lifeExp, '<br>GDP:', gdpPercap,
                      '<br>Pop.:', pop))
fig <- fig %>% layout(title = 'sự tương quan giữa tuổi thọ trung bình so với GDP năm 2007 ',
         xaxis = list(title = 'GDP per capita (2000 dollars)',
                      gridcolor = 'rgb(255, 255, 255)',
                      range = c(2.003297660701705, 5.191505530708712),
                      type = 'log',
                      zerolinewidth = 1,
                      ticklen = 5,
                      gridwidth = 2),
         yaxis = list(title = 'Life Expectancy (years)',
                      gridcolor = 'rgb(255, 255, 255)',
                      range = c(36.12621671352166, 91.72921793264332),
                      zerolinewidth = 1,
                      ticklen = 5,
                      gridwith = 2),
         paper_bgcolor = 'rgb(243, 243, 243)',
         plot_bgcolor = 'rgb(243, 243, 243)')

fig

4 Ứng dụng package plotly vào thực tế

4.1 Biểu đồ thống kê

4.1.1 Biểu đồ phân phối

Biểu đồ phân phối (distribution plot) kết hợp với phân phối chuẩn (normal distribution plot) trong R Studio thường được sử dụng để so sánh phân phối dữ liệu thực tế với phân phối chuẩn (normal distribution). Điều này giúp bạn kiểm tra xem dữ liệu của bạn có tuân theo phân phối chuẩn không và có thể phát hiện các sự khác biệt.

library(ggplot2)    
library(plotly) 
set.seed(1)    
x1 <- rnorm(200, mean = 0, sd = 1)  
x2 <- rnorm(200, mean = 0, sd = 1) + 2 

group_labels = c('Group 1', 'Group 2')  

df1 <- data.frame(x1, group_labels[1])  
colnames(df1) <- c('x', 'Group') 
df2 <- data.frame(x2, group_labels[2]) 
colnames(df2) <- c('x', 'Group') 

df <- rbind(df1,df2) 
colnames(df) <- c('x', 'Group') 

gg <- ggplot(data = df , aes(x=x)) +  
  geom_histogram(aes(y = ..density.., fill=Group),bins = 30, alpha = 0.7)+ 
  geom_density(aes(color=Group))+  
  geom_rug(aes(color=Group))+ 
  labs(x = '',  
       y = '',  
       title = 'Distplot with Normal Distribution')  

ggplotly(gg)%>% 
  layout(plot_bgcolor='#e5ecf6',   
             xaxis = list(   
               title='Time', 
               zerolinecolor = '#ffff',   
               zerolinewidth = 2,   
               gridcolor = 'ffff'),   
             yaxis = list(   
               title='Value A', 
               zerolinecolor = '#ffff',   
               zerolinewidth = 2,   
               gridcolor = 'ffff')) 

4.1.2 Biểu đồ violin

Biểu đồ sử dụng để trực quan hóa phân phối của một biến dữ liệu theo các nhóm khác nhau. Biểu đồ này cho phép bạn so sánh phân phối dữ liệu giữa các nhóm và thấy được sự phân bố và tương quan giữa các biến.

library(plotly)

df <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv")

fig <- df %>%
  plot_ly(type = 'violin') 
fig <- fig %>%
  add_trace(
    x = ~day,
    y = ~total_bill,
    legendgroup = 'M',
    scalegroup = 'M',
    name = 'M',
    box = list(
      visible = T
    ),
    meanline = list(
      visible = T
    ),
    color = I("blue")
  ) 
fig <- fig %>%
  add_trace(
    x = ~day,
    y = ~total_bill
    ,
    legendgroup = 'F',
    scalegroup = 'F',
    name = 'F',
    box = list(
      visible = T
    ),
    meanline = list(
      visible = T
    ),
    color = I("pink")
  ) 

fig <- fig %>%
  layout(
    yaxis = list(
      zeroline = F
    ),
    violinmode = 'group'
  )

fig

Biểu đồ trên thể hiện các giá trị như trung vị, lớn nhất nhỏ nhất, trung bình, tứ phân vị của biến total_bill với biến giới tính là nam và nữ trong các ngày. Phần thân của biểu đồ lớn thể hiện mật độ phân phối tập trung đông.

4.2 Biểu đồ tài chính

4.2.1 Biểu đồ chuỗi thời gian

Biểu đồ chuỗi thời gian (Time Series Chart) là một công cụ quan trọng trong phân tích dữ liệu và thống kê, được sử dụng để hiển thị sự thay đổi của dữ liệu theo thời gian. Biểu đồ này thường được sử dụng để thấy rõ xu hướng, mô hình, sự biến đổi và các biến đổi theo chu kỳ trong dữ liệu theo thời gian.

library(tidyquant)
library(plotly)

getSymbols("GOOG",
             from = "2021-01-01",
             to = "2022-12-31")
## [1] "GOOG"
## [1] "GOOG"
stock <- data.frame(GOOG$GOOG.Adjusted)
stock$GOOG.Adjusted <- stock$GOOG.Adjusted/stock$GOOG.Adjusted[1]
stock <- data.frame(stock,rownames(stock))
colnames(stock) <- append('GOOG','date')

fig <- plot_ly(stock, type = 'scatter', mode = 'lines')%>%
  add_trace(x = ~date, y = ~GOOG, name = 'GOOG')%>%
  layout(showlegend = F)
options(warn = -1)

fig <- fig %>%
  layout(
         xaxis = list(zerolinecolor = '#ffff',
                      zerolinewidth = 2,
                      gridcolor = 'ffff'),
         yaxis = list(zerolinecolor = '#ffff',
                      zerolinewidth = 2,
                      gridcolor = 'ffff'),
         plot_bgcolor='#e5ecf6', width = 900)


fig

4.2.2 Biểu đồ dạng miền

Biểu đồ dạng miền (Area Chart) là một loại biểu đồ được sử dụng để hiển thị phân phối hoặc biến đổi của dữ liệu qua thời gian hoặc qua các biến số khác.

library(tidyquant)
library(plotly)
tickers = c("GOOG", "AAPL", "AMZN", "NFLX", "MSFT")
for (i in tickers){
  getSymbols(i,
             from = "2018-01-01",
             to = "2019-12-31")}

x <- list(
  title = "date"
)
y <- list(
  title = "value"
)

stock <- data.frame(GOOG$GOOG.Adjusted,
                    AAPL$AAPL.Adjusted,
                    AMZN$AMZN.Adjusted,
                    NFLX$NFLX.Adjusted,
                    MSFT$MSFT.Adjusted)
stock$GOOG.Adjusted <- stock$GOOG.Adjusted/stock$GOOG.Adjusted[1]
stock$AAPL.Adjusted <- stock$AAPL.Adjusted/stock$AAPL.Adjusted[1]
stock$AMZN.Adjusted <- stock$AMZN.Adjusted/stock$AMZN.Adjusted[1]
stock$NFLX.Adjusted <- stock$NFLX.Adjusted/stock$NFLX.Adjusted[1]
stock$MSFT.Adjusted <- stock$MSFT.Adjusted/stock$MSFT.Adjusted[1]
stock <- data.frame(stock,rownames(stock))
colnames(stock) <- append(tickers,'Dates')

ax <- list(
  title = "",
  zeroline = FALSE,
  showline = FALSE,
  showticklabels = FALSE
)

fig1 <- plot_ly(stock, type = 'scatter', mode = 'lines', fill = 'tonexty')%>%
  add_trace(x = ~Dates, y = ~GOOG, name = 'GOOG')%>%
  layout(legend=list(title=list(text='company')), xaxis = ax, yaxis = list(range = c(0.5,2), title = 'value'))


fig2 <- plot_ly(stock, type = 'scatter', mode = 'lines', fill = 'tonexty')%>%
  add_trace(x = ~Dates, y = ~AAPL, name = 'AAPL')%>%
  layout(legend=list(title=list(text='company')), xaxis = ax, yaxis = list(range = c(0.5,2),title = '', showticklabels = FALSE))


fig3 <- plot_ly(stock, type = 'scatter', mode = 'lines', fill = 'tonexty')%>%
  add_trace(x = ~Dates, y = ~AMZN, name = 'AMZN')%>%
  layout(legend=list(title=list(text='company')), xaxis = ax, yaxis = list(range = c(0.5,2), title = 'value'))




fig4 <- plot_ly(stock, type = 'scatter', mode = 'lines', fill = 'tonexty')%>%
  add_trace(x = ~Dates, y = ~NFLX, name = 'NFLX')%>%
  layout(legend=list(title=list(text='company')), xaxis = list(title = 'Date'), yaxis = list(range = c(0.5,2), title = 'value'))


fig5 <- plot_ly(stock, type = 'scatter', mode = 'lines', fill = 'tonexty')%>%
  add_trace(x = ~Dates, y = ~MSFT, name = 'MSFT')%>%
  layout( legend=list(title=list(text='company')), yaxis = list(range = c(0.5,2) ,showticklabels = FALSE, title =''),  xaxis = list(title = 'Date'))


fig <- subplot(fig1, fig2, fig3, fig4, fig5,
               nrows = 3, titleY = TRUE, titleX = TRUE) %>% layout(
                 xaxis = list(zerolinecolor = '#ffff',
                              zerolinewidth = 2,
                              gridcolor = 'ffff'),
                 yaxis = list(zerolinecolor = '#ffff',
                              zerolinewidth = 2,
                              gridcolor = 'ffff'),
                 plot_bgcolor='#e5ecf6')
annotations = list(
  list(
    x = 0.225,
    y = 1.0,
    font = list(size = 10),
    text = "company=GOOG",
    xref = "paper",
    yref = "paper",
    xanchor = "center",
    yanchor = "bottom",
    showarrow = FALSE
  ),
  list(
    x = 0.775,
    y = 1,
    font = list(size = 10),
    text = "company=AAPL",
    xref = "paper",
    yref = "paper",
    xanchor = "center",
    yanchor = "bottom",
    showarrow = FALSE
  ),
  list(
    x = 0.225,
    y = 0.64,
    font = list(size = 10),
    text = "company=AMZN",
    xref = "paper",
    yref = "paper",
    xanchor = "center",
    yanchor = "bottom",
    showarrow = FALSE
  ),
  list(
    x = 0.225,
    y = 0.315,
    font = list(size = 10),
    text = "company=NFLX",
    xref = "paper",
    yref = "paper",
    xanchor = "center",
    yanchor = "bottom",
    showarrow = FALSE
  ),
  list(
    x = 0.775,
    y = 0.315,
    font = list(size = 10),
    text = "company=MSFT",
    xref = "paper",
    yref = "paper",
    xanchor = "center",
    yanchor = "bottom",
    showarrow = FALSE
  )
)

fig <- fig %>%layout(annotations = annotations, width = 900)
options(warn = -1)
fig

5 KẾT LUẬN

Qua bài nghiên cứu trên ta thấy Plotly hỗ trợ nhiều loại biểu đồ như biểu đồ đường, biểu đồ cột, biểu đồ phân tán, biểu đồ bong bóng và rất nhiều biểu đồ khác. Nó còn tích hợp tốt với R, biểu đồ tương tác mạnh, đa nền tảng và sự hỗ trợ hướng dẫn từ cộng đồng cực kỳ lớn.

Tóm lại, Plotly là một công cụ mạnh mẽ cho việc trực quan hóa dữ liệu trong R, cung cấp các tính năng tương tác và đồ họa đa dạng. Nó là lựa chọn phổ biến cho những ai muốn hiển thị dữ liệu của mình một cách thú vị và trực quan.

6 TÀI LIỆU THAM KHẢO

Interactive Web-Based Data Visualization with R, Plotly, and Shiny của tác giả Carson Sievert.

Mastering Plotly: A Scientific Graphing Package for JavaScript, R, Python, and Julia của tác giả Corey Ryan Matzat