Trong thời đại hiện nay, khi Việt Nam tiến hành số hóa và chuyễn đổi số, các văn bản và dữ liệu bằng giấy được chuyển sang lưu trữ trên máy tính. Điều này giúp ích rất lớn cho việc lưu trữ, chỉnh sửa và truy tìm dữ liệu với kích thước lớn với thời gian dài trong nhiều năm trở nên thuận lợi hơn. Công nghệ ngày càng phát triển và máy tính được áp dụng vào nhiều lĩnh vưc khác nhau như khoa học, xã hội, kinh tế,… Mọi lĩnh vực đều tồn tại riêng một bộ dữ liệu và cách thức vận hành riêng cho mình. Có thể nói, khi bạn bắt đầu tìm hiểu về bất cứ ngành nghề hay lĩnh vực nào thì chúng ta phải tiến hành tìm hiểu về khái niệm, thông tin và các dữ liệu của ngành đó. Trong đó, dữ liệu được lưu trữ trên các thiết bị điện tử và thể thực hiện các bước thống kê và tiến hành việc khai thác thông tin bằng các phần mềm như maple, eviews hay sata,… Nhưng khi sử dụng các phần mềm trên chúng ta càn phải trả một lượng phí nhất định. Nên phần lớn người hiện tại đang chọn một phần mềm không cần trả phí là R để tiến hành phân tích dữ liệu. Trên phần mền ngoài việc thực hiện các phân tích và hiển thị kết quả ở dạng chữ hay các con số, chúng ta còn có thể thể hiện trực quan hóa dữ liệu đã phấn tích ở dạng biểu đồ. Trên phần mềm R tồn tại nhiều package để vẽ biểu đồ. Và hiện tại chúng ta sẽ tìm hiểu về một package có tên RGL để vễ biểu đồ 3 chiều. Trong quá trình học tập ở trường và nghiên cứu dữ liệu từ những chương trình giảng dạy của thầy liên quan đến các dữ liệu có trong đời sống mà hiện nay chúng ta đang và thấy được chúng từ nhiều cách thức khác nhau, chúng ta phải luôn đối diện với cả tá dữ liệu, từ dữ liệu vài chục quan sát cho đến hàng trăm hàng nghìn quan sát. Vì vậy mà để có thể nhìn tổng quan và xử lý dữ liệu một cách triệt để hơn trong việc lập trình và phân tích dữ liệu, chúng em đã chọn nghiên cứu package có tên là “rgl”. Với package này, nó sẽ giúp chúng em xử lý dữ liệu được mượt mà hơn, dễ thao tác và phân tích chi tiết hơn. Việc xử lý các dữ liệu phù hợp với nhu cầu giúp ích rất nhiều trong trực quan hóa và phân tích chúng một cách có bài bản và logic hơn. Vẫn có đâu đó những dữ liệu mà ta có được trong quá trình thu thập lại thường không đáp ứng được các mục đích cụ thể của bài phân tích, nghiên cứu mà ta đề ra. Chính vì thế, việc cần có một công cụ để giải quyết vấn đề này sẽ là vô cùng thiết thực và quan trọng. Và để giải quyết được vấn để này, ứng dụng RStudio đã mang lại cho người dùng một số công cụ hiệu quả trong việc phân tích dữ liệu.
Đối tượng: Gói dữ liệu và các hàm vẽ biểu đồ 3D.
Mục đích:
Sử dụng một số chức năng trong gói rgl để xử lý các dữ liệu của dataset đã có sẵn, qua đó làm rõ luận ý về mục đích sử dụng cũng như minh họa rõ các chức năng của package này.
Ứng dụng chức năng của rgl vào việc xử lý dữ liệu, hỗ trợ cho việc trực quan hóa bằng hình ảnh biểu đồ có màu sắc và phân tích dữ liệu.
Khái quát về gói rgl.
Tìm hiêu các chức năng và lợi ích mà gói rgl mang lại cho người sử dụng phần mềm.
Dùng một bộ dữ liệu chạy các câu lệnh dùng hàm trong gói RGL để giới thiệu về các hàm và cách sử dụng chúng.
Gói rgl được sử dụng để tạo các ô 3-D tương tác. Nó chứa các lệnh đồ họa cấp cao được mô hình hóa của đồ họa R cổ điển, nhưng hoạt động ở chế độ ba chiều. Nó cũng chứa cấu trúc cấp thấp lấy cảm hứng từ (nhưng không tương thích với) gói grid . Rgl đã cải thiện một thiếu sót trong phiên bản R trước đây (và hầu hết các gói của phần mềm thống kê khác), cụ thể là có khả năng cho phép người dùng tạo đồ họa 3D tương tác một cách thuận tiện ( Adler, 2003). Gói RGL bao gồm hai phần, một phần dành cho phân tích tương ứng đơn giản, một dành cho phân tích tương ứng nhiều và liên kết. Trong mỗi phần, các chức năng tính toán, tóm tắt và trực quan hóa ở hai và ba chiều được cung cấp, bao gồm các tùy chọn để hiển thị các điểm bổ sung và thực hiện phân tích tập hợp con (Nenadic, 2007). Các dữ liệu này điều được trực hóa 3D, Feng và cộng sự (2008) trình bày các tiện ích R để tính toán và hiển thị các bề mặt đẳng diện, hoặc các bề mặt đường ba chiều, từ một mảng ba chiều các giá trị hàm. Trong một số bài cho rằng: gói package rgl là một công cụ hệ thống thiết bị trực quan cho R, sử dụng OpenGL hoặc WebGL làm phụ trợ kết xuất. Cốt lõi của thiết bị OpenGL rgl là một công cụ 3D thời gian thực được viết bằng C++. Nó cung cấp một phương tiện điều hướng quan điểm tương tác và giao diện lập trình R. Mặt khác, WebGL được hiển thị trong trình duyệt web; rgl tạo tệp đầu vào và trình duyệt hiển thị hình ảnh. Hay nói cách khác package này mang đến cho ta dữ liệu được trực quan hóa bằng hình ảnh một cách trở nên sinh động hơn, dễ nhìn và phân tích dữ liệu được rõ ràng đến người đọc hơn.
Đặc trưng:
Gói portable R sử dụng OpenGL (nếu có) trên macOS, Win32 và X11.
Có thể tạo đồ họa 3D trong các trang web bằng WebGL.
Thực hiện trên lập trình R.
Điều hướng các quan điểm tương tác.
Tập trung dữ liệu tự động.
Hình học đơn giản: điểm, đường thẳng, hình tam giác, hình tứ giác, văn bản, họa tiết điểm.
Hình học theo khối: bề mặt, hình cầu.
Để mô tả dữ liệu bằng một biểu đồ sinh động và trực quan hơn các loại biểu đồ trước như các làm sau đây:
Các plot3d chức năng vẽ các điểm trong một cửa sổ RGL. Nó tương tự như plot chức năng cổ điển, nhưng hoạt động ở 3 chiều.
Có rất nhiều sự linh hoạt trong việc chỉ định tọa độ; chức xyz.coords năng từ gói grDevices được sử dụng cho việc này.
Bạn có thể sử dụng chuột để điều khiển biểu đồ. Mặc định là nếu bạn nhấp và giữ bằng nút chuột trái, bạn có thể xoay đồ thị bằng cách kéo nó. Nút chuột phải được sử dụng để thay đổi kích thước và nút giữa thay đổi phối cảnh theo quan điểm.
Chức năng cấp cao khác là persp3d để vẽ các bề mặt. Nó tương tự như persp trước đât, nhưng linh hoạt hơn. Đầu tiên, bất kỳ x, y hoặc z có thể được chỉ định bằng cách sử dụng ma trận, chứ không phải chỉ z. Điều này cho phép các bề mặt tham số được vẽ.
Gói rgl có đầu ra có thể được thể hiện trong các cửa sổ khác. Cách được đề xuất để làm điều này đã thay đổi nhiều lần trong những năm qua. Chúng tôi sẽ bắt đầu với đề xuất hiện tại, sau đó liệt kê các phương pháp.
Cách ban đầu để chèn rgl vào tài liệu là sử dụng writeWebGL chức năng không dùng nữa để viết mã HTML để chèn vào tài liệu. Sau đó, Sweave và knitr liên kết lệnh này đã được thêm vào file
Hiện tại, cách tốt nhất để kết hợp một rgl cảnh vào tài liệu là tạo tài liệu ở định dạng HTML bằng R Markdown. Ở phần đầu của tài liệu, bạn nên có mã như thế này ở một trong các đoạn mã thiết lập:
library(rgl)
setupKnitr(autoprint = TRUE)
Cuộc gọi đến setupKnitr()sẽ cài đặt một số hook và đặt các tùy chọn knitr để rgl mã được xử lý đúng cách. Đối autoprint = TRUE số làm cho rgl hành động trong tài liệu gần giống như cách nó sẽ hoạt động trong bảng điều khiển hoặc cách đồ họa cơ sở được xử lý bởi knitr: Nếu bạn in giá trị của rgl các hàm cấp cao, một biểu đồ sẽ được chèn vào đầu ra, nhưng có thể chỉ sau sửa đổi cấp thấp cho nó đã hoàn tất.
Ngoài ra, bạn có thể chèn bằng cách thủ công
Bạn có thể không muốn sử dụng setupKnitr(autoprint = TRUE) phương pháp được mô tả ở trên. Nó mới được lập ra và có thể vẫn còn lỗi; bạn có thể có một tài liệu cũ hơn và không muốn chỉnh sửa nó để hoạt động theo cách đó.
Trong trường hợp này, bạn có thể chèn các ô theo cách thủ công. Sử dụng mã thiết lập
library(rgl)
setupKnitr()
và lệnh rglwidget() ở cấp cao nhất bất cứ khi nào bạn muốn chèn một dòng lệnh.
Có một số điểm khác biệt trong hành vi mặc định nếu bạn không sử dụng autoprint:
Theo mặc định, mỗi đoạn mã tiếp tục rgl cửa sổ từ các đoạn trước đó. Bạn sẽ cần một open3d cuộc gọi rõ ràng để có được một cửa sổ sạch sẽ.
Ngoài ra, theo mặc định, của sổ tạo ra trong gói rgl không được đóng ở cuối đoạn. Điều này có thể không thành vấn đề, nhưng bạn có thể thấy mình hết bộ nhớ nếu các cảnh của bạn thực sự lớn.
Mặc dù một số trình xem trước PDF hỗ trợ tương tác với đồ họa 3D, nhưng hầu hết các cấu lệnh tại gói này thì không. Để tạo ảnh chụp màn hình của một gói rgl trong tài liệu R Markdown với đầu ra PDF, chỉ cần làm theo các hướng dẫn ở trên. Tính năng in tự động sẽ phát hiện đầu ra PDF và sử dụng lệnh snapshot3d để tạo tệp PNG để chèn.
rgl.snapshot( filename, fmt = "png", top = TRUE ) snapshot3d( filename = tempfile(fileext = ".png"), fmt = "png", top = TRUE, ..., scene, width = NULL, height = NULL, webshot = as.logical(Sys.getenv("RGL_USE_WEBSHOT", "TRUE")) )
Dựa vào chức năng của gói RGL có thể phân thành 6 loại:
RGL duy trì các cấu trúc bên trong cho tất cả các cảnh mà nó hiển thị. Các chức năng sau đây cho phép người dùng tìm thông tin về chúng và thao tác với chúng.
| Chức năng | Sự miêu tả |
|---|---|
| open3d: | mở một cửa sổ mới |
| close3d: | đóng cửa sổ hiện tại |
| cur3d: | id của thiết bị đang hoạt động |
| set3d: | đặt một thiết bị cụ thể hoạt động |
| pop3d: | xóa đối tượng khỏi hiện trường |
| clear3d: | xóa tất cả các đối tượng của các lớp nhất định |
| ids3d: | id, loại và thẻ của các đối tượng hiện tại |
| tagged3d: | tìm thẻ hoặc đối tượng có thẻ |
Một số chức năng này có tên thay thế để tương thích trở lại: rgl.cur, rgl.ids, rgl.pop. Một trong hai tên sẽ hoạt động, nhưng phiên bản được khuyến nghị cho mã mới. Một số phiên bản không dùng nữa: rgl.clear, rgl.set. Những cái đó không nên được gọi.
Lưu ý: Nếu bạn gọi plot3d, nó sẽ ghi đè lên biểu đồ hiện tại. Để mở một cửa sổ đồ họa mới, hãy sử dụng open3d.
Giống như chúng ta có points và lines trong đồ họa cổ điển, có một số hàm cấp thấp . RGL để thêm các yếu tố đồ họa vào cấu lệnh hiện đang hoạt động. Các hình dạng “nguyên thủy” là những hình dạng có nguồn gốc từ OpenGL:
| Chức năng | Sự miêu tả |
|---|---|
| points3d: | thêm điểm |
| lines3d: | thêm dòng |
| segments3d: | thêm phân đoạn dòng |
| triangles3d: | thêm hình tam giác |
| quads3d: | thêm tứ giác |
Mỗi hàm trên có các đối số x và y một z lần nữa sử dụng xyz.coords để linh hoạt. Họ nhóm các mục liên tiếp khi cần thiết. Ví dụ, \(triangles3d\) hàm lấy từng bộ ba điểm liên tiếp làm đỉnh của một tam giác.
Bạn có thể sử dụng các hàm sau để chú thích biểu đồ hiện tại hoặc để xây dựng một hình từ đầu.
| Tên hàm | Chức năng |
|---|---|
| text3d, texts3d: | thêm văn bản |
| abclines3d: | thêm các đường thẳng vào biểu đồ |
| arc3d: | thêm các cung hình cầu hoặc hình xoắn ốc vào biểu đồ |
| planes3d: | thêm các mặt phẳng để vẽ đồ thị |
| clipplanes3d: | thêm các mặt phẳng cắt vào đồ thị |
| sprites3d, particles3d: | thêm họa tiết vào biểu đồ |
| spheres3d: | thêm hình cầu |
| surface3d, terrain3d: | một bề mặt |
| drape3d: | treo các đường trên một bề mặt hoặc nhiều đối tượng |
| shadow3d: | dự án lưới lên một bề mặt |
| arrow3d: | thêm một mũi tên vào một cảnh |
| pch3d: | vẽ các biểu tượng âm mưu kiểu cơ sở |
| plotmath3d: | được sử dụng bởi text3dcho văn bản toán học |
Các chức năng cấp thấp sau đây kiểm soát giao diện của biểu đồ:
| Tên hàm | Chức năng |
|---|---|
| axes3d, axis3d: | thêm trục vào đồ thị |
| box3d, bbox3d: | thêm hộp xung quanh cốt truyện |
| title3d: | thêm tiêu đề vào cốt truyện |
| mtext3d: | thêm văn bản bên lề vào cốt truyện |
| decorate3d: | thêm nhiều “đồ trang trí” (tỷ lệ, v.v.) vào biểu đồ |
| aspect3d: | đặt tỷ lệ khung hình |
| bg3d, bgplot3d: | thiết lập nền của cảnh |
| show2d: | hiển thị cốt truyện hoặc hình ảnh 2D trong cảnh 3D |
| legend3d: | thiết lập một huyền thoại cho cảnh |
| grid3d: | thêm lưới tham chiếu vào biểu đồ |
| thigmophobe3d: | chọn vị trí nhãn để tránh chồng chéo |
| setAxisCallbacks: | đặt chú thích trục do người dùng xác định |
Ví dụ: để vẽ ba tam giác ngẫu nhiên, người ta có thể sử dụng
triangles3d(cbind(x=rnorm(9), y=rnorm(9), z=rnorm(9)), col = "green")
decorate3d()
bg3d("lightgray")
aspect3d(1,1,1)
Bên cạnh các hàm được đề cập ở trên, còn có một số hàm không được dùng nữa như rgl.abclines, rgl.bbox, rgl.bg, rgl.clipplanes, rgl.lines, rgl.linestrips, rgl.planes, rgl.points, rgl.primitive, rgl.quads, rgl.setAxisCallback, rgl.spheres, rgl.sprites, rgl.surface, rgl.texts. rgl.triangles Bạn nên tránh sử dụng tất cả các chức năng này, những chức năng này có thể không hoạt động đúng với các *3d sẽ sớm bị xóa khỏi rgl.
Chức năng rgl.getAxisCallback cung cấp hỗ trợ cấp thấp cho setAxisCallbacks
Theo mặc định khi bạn mở cửa sổ mới với open3d:
Trục x đi từ trái sang phải.
Trục y đi từ gần máy ảnh ra xa.
Trục z đi từ dưới lên trên.
Bạn có thể thay đổi góc máy ảnh đơn giản bằng cách kéo hình ảnh bằng chuột. Để đặt góc camera theo chương trình, hãy sử dụng view3d. Điều này sử dụng tọa độ cực:
Góc mặc định là khoảng theta = 0, phi = -70. Bắt đầu từ vị trí này:
Khi bạn tăng theta, đồ thị sẽ quay ngược chiều kim đồng hồ theo quan điểm của bạn.
Khi bạn tăng phi lên 0, bạn bắt đầu nhìn xuống cảnh từ trên xuống. Nếu bạn tăng phitrên 0, bạn tiếp tục và bắt đầu thấy đồ thị từ “mặt sau” (và lộn ngược).
Bạn cũng có thể dùng observer3d để thay đổi vị trí camera bằng x,y,z tọa độ. Đặc biệt, tăng z tọa độ cho phép bạn thu nhỏ và giảm tọa độ sẽ phóng to bạn.
Một cách tiếp cận hữu ích là sử dụng chuột để tìm một góc nhìn đẹp. Sau đó, bạn có thể lưu nó bằng cách sử dụng par3d(“userMatrix”)và khôi phục lại cùng một chế độ xem sau:
myview <- par3d("userMatrix")
# ... later ...
par3d(userMatrix = myview)
Trong hầu hết các ảnh, các đối tượng được “thắp sáng”, nghĩa là hình thức của chúng phụ thuộc vào vị trí và hướng của chúng so với ánh sáng trong cảnh. Bản thân ánh sáng thường không xuất hiện, nhưng chúng có tác dụng đối với các vật thể.
Sử dụng lênh light3d đẻ xác định vị trí và đặc tính của nguồn sáng. Nguồn sáng có thể ở xa vô tận hoặc có thể được trộn vào trong cảnh. Các đặc điểm của chúng bao gồm các thành phần là ambient, diffuse và specular, tất cả đều được đặt mặc định là màu trắng. Thành phần ambient xuất hiện giống nhau từ bất kỳ hướng nào diffusephần phụ thuộc vào góc giữa bề mặt và ánh sáng, trong khi thành phần specular cũng tính đến vị trí của người xem.
Trước đây, hàm rgl.light đươc sử dụng phỏ biến nhưng hiện tại không dùng nữa mà sử dụng hàm light3d thay thế.
Mô hình được sử dụng trong rgl là các đối tượng được hiển thị trong các cảnh là các đối tượng vật lý trong không gian, với các đặc tính vật chất ảnh hưởng đến cách ánh sáng phản xạ từ chúng (hoặc do chúng phát ra). Chúng chủ yếu được kiểm soát bởi material3d hoặc bằng các đối số cho các hàm khác được truyền cho nó.
Các thuộc tính vật liệu được nhận dạng trong lệnh gọi material3d được mô tả chi tiết. Ở đây chúng tôi đưa ra một mặc định
| Tên | Mặc | Định Nghĩa |
|---|---|---|
| color | trắng | vectơ màu bề mặt để áp dụng cho các đỉnh liên tiếp |
| alpha | 1 | độ trong suốt: 0 là vô hình, 1 là mờ đục |
| lit | TRUE | liệu tính toán ánh sáng có nên được thực hiện |
| ambient | đen | màu sắc trong ánh sáng xung quanh |
| specular | trắng | màu sắc trong ánh sáng phản chiếu |
| emission | đen | màu phát ra từ bề mặt |
| shininess | 50 | điều khiển ánh sáng phản chiếu: giá trị cao trông sáng bóng |
| smooth | TRUE | liệu bóng có nên được nội suy giữa các đỉnh hay không |
| texture | NULL | đường dẫn tùy chọn đến bitmap “kết cấu” sẽ được hiển thị trên bề mặt |
| front, back | fill | đa giác nên được lấp đầy, hoặc phác thảo |
| size | 3 | kích thước của điểm tính bằng pixel |
| lwd | 1 | chiều rộng của dòng tính bằng pixel |
Các thuộc tính khác bao gồm “texmipmap”, “texmagfilter”, “texminfilter”, “texenvmap”, “fog”, “point_antialias”, “line_antialias”, “depth_mask”, “depth_test”, “polygon_offset”, “margin”, “floating” …
Như đã mô tả trong phần trước, một trong những thuộc tính của vật liệu là texture, tên của tệp bitmap ( .png) chứa hình ảnh sẽ được hiển thị trên bề mặt. Phần này cung cấp thêm chi tiết về kết cấu.
Trong OpenGL, mỗi đỉnh trong đa giác có thể được liên kết với một vị trí cụ thể trong ảnh bitmap. Phần bên trong của đa giác nội suy trong bitmap. Có hai quy ước trong rgl các hàm để quy định các tọa độ này.
Các hàm xác định nguyên hàm ( triangles3d, v.v.) chấp nhận một đối số ma trận texcoords tùy chọn cung cấp các vị trí s(ngang) và t(dọc) trong ảnh bitmap trong các cột có một hàng trên mỗi đỉnh. Các tọa độ (0,0) dành cho phía dưới bên trái và (1,1) phía trên bên phải. Nếu các giá trị nằm ngoài phạm vi này được đưa ra, hình ảnh sẽ lặp lại, tức là (1.1, 1.2) sẽ chỉ định cùng một điểm trong hình ảnh là (0.1, 0.2).
Các chức năng khác chẳng hạn như surface3d lấy ma trận cho mỗi tọa độ đỉnh cũng chấp nhận tọa độ kết cấu dưới dạng ma trận, trong các đối số texture_s và texture_t.
RGL sử dụng các ý tưởng giống như đồ họa cơ bản để vẽ văn bản: có các họ phông chữ có tên “sans”, “serif”và “mono”để vẽ văn bản thuộc các loại đó. Năm rgl, “symbol”gia đình không được hỗ trợ.
Các họ phông chữ mới có thể được xác định bằng chức năng cấp thấp rglFonts hoặc đơn giản hơn là sử dụng chức năng cấp cao hơn rglExtrafonts. Chức năng thứ hai yêu cầu extrafontgói được cài đặt.
Các par3d chức năng, được mô phỏng theo par chức năng đồ họa cổ điển, đặt hoặc đọc nhiều rgltham số bên trong khác nhau, được liệt kê trong rgl.par3d.names Biến đổi. Tất cả chúng có thể được đặt ngoại trừ những cái trong rgl.par3d.readonly. Một số tham số hoàn toàn chỉ đọc; những thứ khác được cố định tại thời điểm cửa sổ được mở và những thứ khác có thể được thay đổi bất cứ lúc nào về: số lượng khử răng cưa phần cứng, kích thước mặc định cho văn bản, phông chữ số nguyên…
Các r3dDefaults danh sách và getr3dDefaults kiểm soát chức năng mặc định trong các cửa sổ mới được mở bởi open3d.
Hàm tìm kiếm biến trong môi trường chung của người dùng và nếu không tìm thấy ở đó, hãy tìm biến đó trong không rglgian tên. Điều này cho phép người dùng ghi đè cài đặt mặc định cho các cửa sổ mới.
Sau khi tìm thấy, r3dDefaultsdanh sách cung cấp các giá trị ban đầu cho par3dcác tham số, cũng như các giá trị mặc định cho material3dvà bg3dtrong các thành phần “material”và “bg”tương ứng.
RGL bao gồm một số chức năng để xây dựng và hiển thị các hình khối khác nhau. Chúng tạo ra các đối tượng của lớp “shape3d”hoặc “mesh3d”. “shapelist3d”Các chi tiết của các lớp được mô tả dưới đây. Chúng tôi bắt đầu với các chức năng để tạo ra chúng.
Các chức năng này tạo ra các hình dạng cụ thể. Các đối số tùy chọn cho phép chỉ định các thuộc tính như màu sắc hoặc các phép biến đổi.
| Tên hàm | Sự miêu tả |
|---|---|
| tetrahedron3d, cube3d, octahedron3d, dodecahedron3d, icosahedron3d: | chất rắn platon |
| cuboctahedron3d, oh3d: | chất rắn khác |
Các hàm này tạo ra các hình dạng mới:
| Tên hàm | Sự miêu tả |
|---|---|
| cylinder3d: | tạo ra một ống hoặc xi lanh |
| polygon3d: | tạo một đa giác phẳng bằng tam giác |
| extrude3d: | tạo ra một “đùn” của một đa giác |
| turn3d: | tạo ra một vật rắn quay |
| ellipse3d: | tạo ra một ellipsoid theo nhiều cách khác nhau |
| mesh3d: | tạo một hình dạng từ các đỉnh được lập chỉ mục |
| shapelist3d: | tạo ra một hình dạng bằng cách kết hợp các hình dạng khác |
| as.mesh3d: | một chức năng chung; xem bên dưới |
Một chức năng liên quan là triangulate, lấy một đa giác hai chiều và chia nó thành các hình tam giác bằng cách sử dụng thuật toán “ear-clipping”.
Lênh as.mesh3d được cung cấp để cho phép các cấu trúc dữ liệu do mã khác tạo ra được chuyển đổi thành cấu trúc lưới.
Mặc định as.mesh3d.default phương pháp là một cách đơn giản để xây dựng lưới từ ma trận các đỉnh; nó có thể sử dụng mergeVertices (cũng có thể được sử dụng riêng) để hợp nhất các đỉnh lặp lại trong ma trận, cho phép addNormals được sử dụng để mang lại vẻ ngoài mượt mà.
Các as.tmesh3d chung chung là một biến thể đảm bảo đối tượng kết quả sẽ không có mục nhập quad. Nhưng câu lệnh tmesh3d, qmesh3d hiện đã lỗi thời; sử dụng mesh3d thay thế.
Các chức năng này tính toán và vẽ các đường viền của các chức năng trên các bề mặt hoặc cắt các đối tượng dọc theo một đường viền của một chức năng.
| Tên hàm | Sự miêu tả |
|---|---|
| contourLines3d: | vẽ các đường đồng mức trên bề mặt |
| filledContour3d: | điền vào giữa các đường viền trên bề mặt |
| clipMesh3d: | clip lưới đối tượng sử dụng ranh giới cong |
| clipObj3d: | clip đối tượng chung sử dụng ranh giới cong |
Các lệnh này thao tác và sửa đổi các đối tượng lưới:
| Tên hàm | Sự miêu tả |
|---|---|
| addNormals: | thêm các vectơ bình thường để làm cho hình dạng trông mượt mà |
| subdivision3d: | thêm các đỉnh phụ để làm cho nó trông mượt mà hơn |
| merge: | hợp nhất các đối tượng lưới |
| facing3d: | tập hợp con của lưới đối mặt với “lên” |
| getBoundary3d: | lấy ranh giới của một đối tượng lưới |
Các bước riêng lẻ trong subdivision3dc ũng có sẵn: deform.mesh3d, divide.mesh3d, normalize.mesh3d. Chúng chủ yếu dành cho sử dụng nội bộ.
Rg lcó một số hàm hỗ trợ hiển thị nhiều “scenes” khác nhau trong cùng một cửa sổ. Các hàm cấp cao là
| Tên hàm | Chức năng |
|---|---|
| mfrow3d: | Nhiều số liệu (như par(“mfrow”) |
| layout3d: | Nhiều số liệu (như layout) |
| next3d: | Di chuyển đến hình tiếp theo (thích plot.new hoặc frame) |
| subsceneList: | Liệt kê tất cả các cảnh phụ trong bố cục hiện tại |
| clearSubsceneList: | Xóa danh sách hiện tại và trở lại danh sách trước đó |
Ngoài ra còn có các hàm cấp thấp hơn.
| Tên hàm | Chức năng |
|---|---|
| newSubscene3d: | Tạo một subscene mới, với khả năng kiểm soát tốt đối với những gì được kế thừa từ cha mẹ |
| currentSubscene3d: | Báo cáo về subscene đang hoạt động |
| subsceneInfo: | Nhận thông tin về subscene hiện tại |
| useSubscene3d: | Kích hoạt một subscene khác |
| addToSubscene3d, delFromSubscene3d: | Thêm các đối tượng vào một subscene hoặc xóa chúng |
| gc3d: | Thực hiện “gom rác”: xóa các đối tượng không được hiển thị trong bất kỳ subscene nào |
Theo mặc định, rgl phát hiện và xử lý các lần nhấp chuột trong cảnh của bạn và sử dụng chúng để kiểm soát sự xuất hiện của nó. Bạn có thể tìm ra các trình xử lý hiện tại bằng mã sau:
par3d("mouseMode")
Các nhãn c(“left”, “right”, “middle”)đ ề cập đến các nút trên chuột ba nút hoặc mô phỏng của chúng trên các con chuột khác. “wheel”đề cập đến con lăn chuột và “none” đề cập đến các hành động diễn ra khi di chuyển chuột mà không cần nhấn bất kỳ nút nào.
Các chức năng sau sử dụng chuột để lựa chọn trong một cảnh.
| Tên hàm | Sự miêu tả |
|---|---|
| identify3d: | identify giống như chức năng đồ họa cổ điển |
| select3d: | trả về một hàm kiểm tra xem một tọa độ đã được chọn chưa |
| selectpoints3d: | chọn từ các đối tượng cụ thể |
| hover3d: | hiển thị thông tin “di chuột” về điểm |
selectionFunction3d tạo chức năng lựa chọn từ thông tin về vùng chiếu và vùng chọn chuột; nó được sử dụng nội bộ trong các chức năng trên.
Hàm không dùng nữa rgl.select3d là phiên bản lỗi thời của select3d, và rgl.select là chức năng hỗ trợ cấp thấp.
rgl có một số hàm có thể được sử dụng để xây dựng hình ảnh động. Chúng dựa trên các chức năng cập nhật cảnh theo thời gian hiện tại trong thế giới thực và các lệnh gọi lặp lại đến các chức năng đó. Các hàm là:
| Tên hàm | Chức năng |
|---|---|
| play3d: | Liên tục gọi chức năng cập nhật |
| spin3d: | Cập nhật màn hình bằng cách xoay với tốc độ không đổi |
| par3dinterp: | Tính giá trị mới của một số par3d tham số bằng phép nội suy theo thời gian |
movie3d là hàm để biết cách xuất hoạt ảnh thành một tệp trên đĩa.
Có ba chức năng trong rgl đó hỗ trợ điều khiển cảnh rglbằng cách sử dụng khung TCL/TK.
| Tên hàm | Sự miêu tả |
|---|---|
| tkspin3d: | Thiết lập các nút trong cửa sổ để điều khiển cảnh |
| tkspinControl: | Nhúng các nút điều khiển vào khung TCL/TK riêng |
| tkpar3dsave: | Tạo hộp thoại để lưu hành động chuột một cách tương tác |
Các chức năng này trước đây được chứa (không có tk tiền tố trên tên của chúng) trong tkrglgói. Gói đó hiện không được dùng nữa.
Bộ dữ liệu Iris đã được sử dụng trong bài báo cổ điển năm 1936 của RA Fisher
Nó bao gồm ba loài diên vĩ với 50 mẫu mỗi mẫu cũng như một số đặc tính về mỗi loài hoa. Bộ data này bao gồm 150 quan sát và 5 biến được nghiên cứu khảo sát dựa trên 3 loài hoa.
Các cột trong tập dữ liệu này là:
SepalLengthCm: vách ngăn Chiều dài(Cm)
SepalWidthCm: vách ngăn Chiều rộng(Cm)
PetalLengthCm: Cánh Hoa Chiều Dài(Cm)
PetalWidthCm: Cánh Hoa Chiều Rộng(Cm)
Species: Giống loài
library(rgl)
## Warning: package 'rgl' was built under R version 4.2.3
library(RColorBrewer)
data("iris")
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
data <- iris
x <- sep.l <- iris$Sepal.Length
y <- pet.l <- iris$Petal.Length
z <- sep.w <- iris$Sepal.Width
Hàm rgl.points() được sử dụng để vẽ biểu đồ phân tán 3D
Trong đó:
x, y, z : Vectơ số xác định tọa độ điểm cần vẽ. Các đối số y và z là tùy chọn khi: x là ma trận hoặc khung dữ liệu chứa ít nhất 3 cột sẽ được sử dụng làm tọa độ x, y và z. Ví dụ: rgl.points(iris)
x là công thức có dạng zvar ~ xvar + yvar (xem ?xyz.coords ). Ví dụ: rgl.points( z ~ x + y) .
points3d(x,y,z,color="red",size=5)
rglwidget()
Chức năng rgl.bg(color) có thể được sử dụng để thiết lập môi trường nền của cảnh
Màu đối số được sử dụng trong hàm rgl.points() để thay đổi màu của điểm
Ngoài ra, chúng ta cũng có thể thay đổi kích thước của điểm bằng kích thước đối số vd: là tụi em để size trong câu lệnh là 5.
rgl.bg(color="pink")
## Warning: 'rgl.bg' is deprecated.
## Use 'bg3d' instead.
## See help("Deprecated")
points3d(x,y,z,color="red",size=5)
rglwidget()
Ở hình vẽ thứ 2 này, chúng em đã sử dụng hàm rgl.bg đây là hàm chức năng để ta tô màu màu nền cho nó, (bg là viết tắt cho từ background)
Cụ thể hàm này giúp chúng ta có thể vẽ hình cầu
Hàm rgl.spheres() vẽ hình cầu có tâm(x,y,z) và bán kính r.
x, y, z : Vectơ số xác định tọa độ cho tâm của mỗi mặt cầu. Các đối số y và z là tùy chọn khi:
x là ma trận hoặc khung dữ liệu chứa ít nhất 3 cột sẽ được sử dụng làm tọa độ x, y và z. Ví dụ: rgl.spheres(mống mắt, r = 0,3)
x là công thức có dạng zvar ~ xvar + yvar (xem ?xyz.coords ). Ví dụ: rgl.spheres( z ~ x + y, r = 0,3) .
bán kính : một vectơ hoặc giá trị đơn cho biết bán kính của hình cầu
rgl.spheres(x, y, z, r = 0.2, color = "grey",bg3d(color = "white"))
rglwidget()
Hàm rgl_init() sẽ tạo một thiết bị RGL mới nếu được yêu cầu hoặc nếu không có thiết bị nào được mở:
rgl_init <- function(new.device = FALSE, bg = "white", width = 640) {
if( new.device | rgl.cur() == 0 ) {
par3d(windowRect = 50 + c( 0, 0, width, width ) )
bg3d(color = bg )
}
clear3d(type = c("shapes", "bboxdeco"))
view3d(theta = 15, phi = 20, zoom = 0.7)
}
Mô tả các chức năng RGL được sử dụng :
rgl.open() : mở một thiết bị mới
rgl.cur() : trả về ID thiết bị đang hoạt động
par3d(windowRect) : đặt kích thước cửa sổ
rgl.viewpoint(theta, phi, fov, zoom) : thiết lập quan điểm. Các đối số theta và phi là tọa độ cực.
theta và phi là tọa độ cực. Giá trị mặc định lần lượt là 0 và 15
fov là góc trường nhìn tính bằng độ. Giá trị mặc định là 60
zoom là hệ số thu phóng. Giá trị mặc định là 1
rgl.bg(color) : xác định màu nền của thiết bị
rgl.clear(type) : Xóa cảnh khỏi ngăn xếp đã chỉ định (“shapes”, “lights”, “bboxdeco”, “background”)
Ngoài ra, trong mã Rstudio ở trên, chúng em đã sử dụng chức năng rgl.viewpoint() để tự động đặt hướng quan điểm và thu phóng tùy ý. Như mọi người đã biết với phần trình bày lý thuyết mà chúng em đã soạn ở trên, thiết bị RGL có tính tương tác và chúng ta có thể điều chỉnh góc nhìn và thu phóng biểu đồ bằng chuột.
Để làm được chức năng này ta sử dụng hàm rgl.bbox()
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
bbox3d(color = "#333377")
rglwidget()
xlen , ylen , zlen : các giá trị chỉ định số lượng dấu tích trên các trục x, y và Z tương ứng marklen : giá trị chỉ định độ dài của dấu tích … : các thuộc tính vật liệu rgl khác bao gồm: color : một vector màu. Màu đầu tiên được sử dụng cho màu nền của hộp giới hạn. Màu thứ hai được sử dụng cho các nhãn đánh dấu. phát xạ , phản quang , shininess : các thuộc tính để tính toán ánh sáng alpha : giá trị chỉ định độ trong suốt của màu. Giá trị phải nằm trong khoảng từ 0,0 (hoàn toàn trong suốt) đến 1,0 (mờ đục)
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
bbox3d(color=c("#333377","black"), emission="#333377", specular="#3333FF", shininess=5, alpha=0.8 )
rglwidget()
Hàm rgl.lines(x, y = NULL, z = NULL,…) có thể được sử dụng để thêm các đường trục.
Hàm rgl.texts(x, y = NULL, z = NULL, text) dùng để thêm nhãn trục
Đối với hàm rgl.lines() , các đối số x, y và z là các vectơ số có độ dài 2 (nghĩa là : x = c(x1,x2), y = c(y1, y2), z = c(z1 , z2) ).
Các giá trị x1, y1 và y3 là tọa độ 3D của điểm bắt đầu đường thẳng.
Các giá trị x2, y2 và y3 tương ứng với tọa độ 3D của điểm kết thúc đường thẳng.
Để vẽ một trục, bạn nên chỉ định phạm vi (tối thiểu và tối đa) của trục cho hàm rgl.lines() :
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
lines3d(c(min(x), max(x)), c(0, 0), c(0, 0), color = "black")
lines3d(c(0, 0), c(min(y),max(y)), c(0, 0), color = "red")
lines3d(c(0, 0), c(0, 0), c(min(z),max(z)), color = "green")
rglwidget()
Có hai giải pháp để xử lý tình trạng này:
Chia tỷ lệ dữ liệu để làm cho mọi thứ dễ dàng. Biến đổi các biến x, y và z sao cho min = 0 và max = 1
Sử dụng c(-max, +max) làm phạm vi của các trục
x1 <- (x - min(x))/(max(x) - min(x))
y1 <- (y - min(y))/(max(y) - min(y))
z1 <- (z - min(z))/(max(z) - min(z))
rgl_init()
rgl.spheres(x1, y1, z1, r = 0.02, color = "yellow")
lines3d(c(0, 1), c(0, 0), c(0, 0), color = "black")
lines3d(c(0, 0), c(0,1), c(0, 0), color = "red")
lines3d(c(0, 0), c(0, 0), c(0,1), color = "green")
rglwidget()
Hãy xác định hàm trợ giúp để tính giới hạn trục:
lim <- function(x){c(-max(abs(x)), max(abs(x))) * 1.1}
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
lines3d(lim(x), c(0, 0), c(0, 0), color = "black")
lines3d(c(0, 0), lim(y), c(0, 0), color = "red")
lines3d(c(0, 0), c(0, 0), lim(z), color = "green")
rglwidget()
rgl_add_axes <- function(x, y, z, axis.col = "grey",
xlab = "", ylab="", zlab="", show.plane = TRUE,
show.bbox = FALSE, bbox.col = c("#333377","black"))
{
lim <- function(x){c(-max(abs(x)), max(abs(x))) * 1.1}
xlim <- lim(x); ylim <- lim(y); zlim <- lim(z)
lines3d(xlim, c(0, 0), c(0, 0), color = axis.col)
lines3d(c(0, 0), ylim, c(0, 0), color = axis.col)
lines3d(c(0, 0), c(0, 0), zlim, color = axis.col)
axes <- rbind(c(xlim[2], 0, 0), c(0, ylim[2], 0),
c(0, 0, zlim[2]))
points3d(axes, color = axis.col, size = 3)
texts3d(axes, text = c(xlab, ylab, zlab), color = axis.col,
adj = c(0.5, -0.8), size = 2)
if(show.plane)
xlim <- xlim/1.1; zlim <- zlim /1.1
quads3d( x = rep(xlim, each = 2), y = c(0, 0, 0, 0),
z = c(zlim[1], zlim[2], zlim[2], zlim[1]))
if(show.bbox){
bbox3d(color=c(bbox.col[1],bbox.col[2]), alpha = 0.5,
emission=bbox.col[1], specular=bbox.col[1], shininess=5,
xlen = 3, ylen = 3, zlen = 3)
}
}
*rgl.quads(x, y, z) được sử dụng để thêm các mặt phẳng. x, y và z là các vectơ số có độ dài bốn chỉ định tọa độ của bốn nút của quad.
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
rgl_add_axes(x, y, z)
rglwidget()
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
rgl_add_axes(x, y, z)
axis3d('x', pos=c( NA, 0, 0 ), col = "darkgrey")
axis3d('y', pos=c( 0, NA, 0 ), col = "darkgrey")
axis3d('z', pos=c( 0, 0, NA ), col = "darkgrey")
rglwidget()
thêm một trang trí hộp giới hạn:
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
rgl_add_axes(x, y, z, show.bbox = TRUE)
rglwidget()
Trong biểu đồ trên, hộp giới hạn được hiển thị dưới dạng hình chữ nhật. Tất cả các tọa độ được hiển thị ở cùng một tỷ lệ ( iso-metric ).
Hàm khía cạnh3d(x, y = NULL, z = NULL) có thể được sử dụng để đặt tỷ lệ rõ ràng của các trục x, y và z cho biểu đồ hiện tại.
x, y và z lần lượt là tỷ lệ cho các trục x, y và z. x có thể là một vectơ có độ dài 3, chỉ định tỷ lệ cho 3 trục.
Nếu tỷ lệ là (1, 1, 1), hộp giới hạn sẽ được hiển thị dưới dạng khối lập phương.
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
rgl_add_axes(x, y, z, show.bbox = TRUE)
aspect3d(1,1,1)
rglwidget()
Các giá trị của tỷ lệ có thể được đặt lớn hơn hoặc nhỏ hơn để thu phóng trên một trục nhất định:
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = "yellow")
rgl_add_axes(x, y, z, show.bbox = TRUE)
aspect3d(2,1,1)
rglwidget()
get_colors <- function(groups, group.col = palette()){
groups <- as.factor(groups)
ngrps <- length(levels(groups))
if(ngrps > length(group.col))
group.col <- rep(group.col, ngrps)
color <- group.col[as.numeric(groups)]
names(color) <- as.vector(groups)
return(color)
}
Thay đổi màu sắc theo nhóm:
rgl_init()
rgl.spheres(x, y, z, r = 0.2,
color = get_colors(iris$Species))
rgl_add_axes(x, y, z, show.bbox = TRUE)
aspect3d(1,1,1)
rglwidget()
Sử dụng màu tùy chỉnh:
cols <- get_colors(iris$Species, c("#999999", "#E69F00", "#56B4E9"))
rgl_init()
rgl.spheres(x, y, z, r = 0.2, color = cols)
rgl_add_axes(x, y, z, show.bbox = TRUE)
aspect3d(1,1,1)
rglwidget()
6 đối tượng lưới có sẵn trong gói RGL và có thể được sử dụng làm hình dạng điểm:
khối lập phương3d()
tứ diện3d()
bát diện3d()
icosahedron3d()
khối mười hai mặt3d()
khối lập phương ba mặt ()
Để tạo biểu đồ bằng cách sử dụng các đối tượng trên, hàm shapelist3d() có thể được sử dụng như sau:
shapelist3d(shapes, x, y, z)
hình dạng : một đối tượng shape3d (ví dụ: hình dạng = cube3d()) hoặc danh sách của chúng (ví dụ: hình dạng = danh sách(cube3d(), icosahedron3d()))
x, y, z : tọa độ các điểm cần vẽ
rgl_init()
shapelist3d(tetrahedron3d(), x, y, z, size = 0.15,
color = get_colors(iris$Species))
rgl_add_axes(x, y, z, show.bbox = TRUE)
aspect3d(1,1,1)
rglwidget()
Gói rgl rõ ràng là một công cụ để tạo đồ họa 3D rất tốt. Trên thực tế, vì chức năng của nó rất giống với thư viện đồ họa cơ bản trong R, nên gói này giúp dễ dàng tạo đồ họa 3D chất lượng cao. Ngoài ra, đồ họa linh hoạt đến mức bạn có thể dễ dàng chơi với các tùy chọn về màu sắc, hình dạng, kích thước điểm,… Các biểu đồ thu được đẹp, rõ ràng và có tính tương tác, cho phép khám phá dữ liệu tốt. Trên thực tế, chúng có thể được thu nhỏ và xoay để hỗ trợ trực quan hóa. Gói này cũng cho phép bạn thêm một số loại điều khiển tùy chỉnh để tăng tính tương tác của các cảnh được tạo bằng gói, đây là một lợi thế không thể phủ nhận.
Tuy nhiên, nó cũng có một số nhược điểm gây khó chịu khi sử dụng. Gói không hỗ trợ các ký tự đặc biệt như dấu trọng âm và dấu xuống dòng khi cần thêm tiêu đề hoặc trục vào biểu đồ. Ngoài ra, phụ đề không mở rộng nếu bạn thay đổi kích thước của ảnh, vì vậy chúng bị kéo dài hoặc nén và trở nên xấu đi đồ họa ban đầu. Cuối cùng, việc thêm các điều khiển khác nhau từ cái này sang cái khác cần phải nghiên cứu trước khi sử dụng một số trong số chúng. Tài liệu thường không rõ ràng, điều này làm cho các chức năng phức tạp hơn khó sử dụng.
Adler, D., Nenadic, O., & Zucchini, W. (2003, March). Rgl: A r-library for 3d visualization with opengl. In Proceedings of the 35th symposium of the interface: computing science and statistics, Salt Lake City (Vol. 35, pp. 1-11).
Nenadic, O., & Greenacre, M. (2007). Correspondence analysis in R, with two-and three-dimensional graphics: the ca package. Journal of statistical software, 20, 1-13.
Feng, D., & Tierney, L. (2008). Computing and displaying isosurfaces in R. Journal of Statistical Software, 28, 1-24.