Chuyển đến nội dung chính

15 câu hỏi mà mọi người dùng R đều thắc mắc về biểu đồ

Có nhiều loại biểu đồ R, từ các dạng cơ bản đến các dạng phức tạp. Ở đây, chúng ta tìm hiểu cách tạo chúng.
Đã cập nhật 5 thg 10, 2026  · 15 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity
biểu ngữ khám phá thư viện khóa học R của datacamp

R cho phép bạn tạo nhiều loại biểu đồ khác nhau, từ các dạng cơ bản như biểu đồ mật độ, biểu đồ chấm, hộp biểu đồ và biểu đồ phân tán, đến các dạng phức tạp hơn về mặt thống kê như biểu đồ xác suất.

Ngoài ra, bạn có thể chuyển từ việc tạo các biểu đồ cơ bản với rất ít tùy chỉnh sang vẽ các biểu đồ nâng cao với khả năng tùy biến đầy đủ kết hợp cùng đồ họa tương tác. Tuy vậy, không phải lúc nào chúng ta cũng nhận được kết quả mong muốn với biểu đồ trong R: Stack Overflow tràn ngập các câu hỏi về biểu đồ, với nhiều câu hỏi lặp lại.

Đó là lý do DataCamp quyết định tập hợp tất cả các câu hỏi thường gặp và những câu trả lời được đánh giá cao nhất vào một bài viết blog.

Để luyện tập tạo biểu đồ trong R, hãy thử khóa học trực quan hóa dữ liệu trong R này.

15 Câu Hỏi Về Biểu Đồ Trong R

1. Cách Vẽ Một Biểu Đồ R Trống

Mở Một Khung Biểu Đồ Mới

Bạn có thể mở một khung biểu đồ trống và kích hoạt thiết bị đồ họa trong R như sau:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJwbG90Lm5ldygpXG5cbiMgT3IgdHJ5IG91dCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgXG4jIGZyYW1lKCkifQ==

Lưu ý rằng các hàm plot.new() và frame() định nghĩa một khung biểu đồ mới mà không có trục, nhãn hay đường viền. Chúng cho biết sẽ tạo một biểu đồ mới: một cửa sổ đồ họa mới sẽ mở nếu bạn chưa có, còn nếu đã có thì cửa sổ hiện có sẽ được chuẩn bị để chứa biểu đồ mới. Bạn có thể đọc thêm về các hàm này tại đây.

  • x11() cũng có thể mở một thiết bị cửa sổ mới trong R cho Hệ thống Cửa sổ X (phiên bản 11)!
  • quartz() khởi chạy trình điều khiển thiết bị đồ họa cho hệ thống OS X.

Thiết Lập Kích Thước Cửa Sổ Đồ Họa

Bạn cũng có thể dùng hàm plot.window() để đặt kích thước ngang và dọc cho biểu đồ trống vừa tạo:

plot.new()
pWidth = 3
pHeight = 2
plot.window(c(0,pWidth),
            c(0,pHeight))

Vẽ Một Biểu Đồ Trống Thực Sự

Bạn có thể vẽ một biểu đồ trống với hàm plot(). Ngoài ra, hãy bổ sung trục, nhãn trục và tiêu đề cho biểu đồ trống bằng các hàm mtext() và title().

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERyYXcgYW4gZW1wdHkgcGxvdFxucGxvdCg1LCBcbiAgICAgNSwgXG4gICAgIHR5cGU9XCJuXCIsIFxuICAgICBheGVzPUZBTFNFLCBcbiAgICAgYW5uPUZBTFNFLCBcbiAgICAgeGxpbT1jKDAsIDEwKSwgXG4gICAgIHlsaW0gPSBjKDAsMTApKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB4LWF4aXNcbm10ZXh0KFwieC1heGlzXCIsIFxuICAgICAgc2lkZT0xKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB5LWF4aXNcbm10ZXh0KFwieS1heGlzXCIsXG4gICAgICBzaWRlPTIpIFxuXG4jIEFkZCBhIHRpdGxlXG50aXRsZShcIkFuIFIgUGxvdFwiKSJ9

Bạn cung cấp tọa độ (5,5) cho biểu đồ, nhưng không hiển thị việc vẽ điểm bằng cách đặt đối số type là "n".

Mẹo: thử đặt đối số này thành "p" hoặc "b" và xem điều gì xảy ra!

Thêm nữa, bạn không chú thích cho biểu đồ, nhưng bạn đặt giới hạn từ 0 đến 10 cho cả trục x và trục y.

Cuối cùng, bạn có thể chọn vẽ một khung bao quanh biểu đồ với hàm box() và thêm một số điểm bằng hàm points():

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERyYXcgYW4gZW1wdHkgcGxvdFxucGxvdCg1LCBcbiAgICAgNSwgXG4gICAgIHR5cGU9XCJuXCIsIFxuICAgICBheGVzPUZBTFNFLCBcbiAgICAgYW5uPUZBTFNFLCBcbiAgICAgeGxpbT1jKDAsIDEwKSwgXG4gICAgIHlsaW0gPSBjKDAsMTApKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB4LWF4aXNcbm10ZXh0KFwieC1heGlzXCIsIFxuICAgICAgc2lkZT0xKVxuXG4jIEFkZCB0ZXh0IHRvIHRoZSB5LWF4aXNcbm10ZXh0KFwieS1heGlzXCIsXG4gICAgICBzaWRlPTIpIFxuXG4jIEFkZCBhIHRpdGxlXG50aXRsZShcIkFuIFIgUGxvdFwiKVxuXG4jRHJhdyBhIGJveFxuYm94KClcblxuI1B1dCAocmVkKSBwb2ludCBpbiB0aGUgcGxvdCBhdCAoNSw1KVxucG9pbnRzKDUsXG4gICAgICAgNSwgXG4gICAgICAgY29sPVwicmVkXCIpIFxucG9pbnRzKDUsIFxuICAgICAgIDcsIFxuICAgICAgIGNvbD1cIm9yYW5nZVwiLCBcbiAgICAgICBwY2g9MywgXG4gICAgICAgY2V4PTIpXG5wb2ludHMoYygwLCAwLCAxKSwgXG4gICAgICAgYygyLCA0LCA2KSwgXG4gICAgICAgY29sPVwiZ3JlZW5cIiwgXG4gICAgICAgcGNoPTQpIn0=

Lưu ý rằng bạn có thể đưa các tọa độ x và y vào các vector để vẽ nhiều điểm cùng lúc. Đối số pch cho phép bạn chọn ký hiệu, trong khi đối số cex nhận một giá trị cho biết mức độ phóng to/thu nhỏ của văn bản và ký hiệu so với mặc định.

Mẹo: nếu bạn muốn xem số nào ứng với ký hiệu nào, nhấp vào đây.

2. Cách Đặt Nhãn Trục Và Tiêu Đề Cho Biểu Đồ R

Các trục của biểu đồ R là một trong những chủ đề phổ biến nhất của các câu hỏi trên Stack Overflow; Những câu hỏi liên quan đến chủ đề này rất đa dạng.

Hãy tiếp tục đọc để xem những kiểu câu hỏi nào DataCamp thấy khá phổ biến!

Đặt Tên Trục (Với Chỉ Số Trên Hoặc Dưới) Và Thêm Tiêu Đề Cho Biểu Đồ R?

Bạn có thể dễ dàng đặt tên các trục và thêm tiêu đề để biểu đồ R của bạn cụ thể và dễ hiểu hơn với người xem.

Điều này có thể thực hiện dễ dàng bằng cách thêm các đối số main cho tiêu đề chính, sub cho tiêu đề phụ, xlab cho nhãn trục x và ylab cho nhãn trục y.

Lưu ý rằng nếu bạn muốn có tiêu đề với chỉ số trên hoặc dưới, bạn có thể thêm chúng vào đối số main của hàm plot() một cách dễ dàng. Hãy dùng expression() và ký hiệu ^ cho chỉ số trên hoặc dấu ngoặc vuông cho chỉ số dưới.

Hãy thử trong khối DataCamp Light dưới đây:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIG1haW49ZXhwcmVzc2lvbihcIm1haW4gdGl0bGVcIl4yKSwgXG4gICAgIHN1Yj1leHByZXNzaW9uKFwic3ViLXRpdGxlXCJbMl0pLCBcbiAgICAgeGxhYj1cIngtYXhpcyBsYWJlbFwiLCBcbiAgICAgeWxhYj1cInktYXhpcyBsYWJlbFwiKSJ9

Bạn cũng có thể đảm bảo có chữ cái Hy Lạp trong nhãn trục bằng cách dùng đoạn mã kết hợp các hàm expression() và paste(). Chạy đoạn mã sau:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIHhsYWIgPSBleHByZXNzaW9uKHBhc3RlKFwiR3JlZWsgbGV0dGVyIFwiLCBwaGkpKSxcbiAgICAgeWxhYiA9IGV4cHJlc3Npb24ocGFzdGUoXCJHcmVlayBsZXR0ZXIgXCIsbXUpKSkifQ==

Điều Chỉnh Diện Mạo Của Nhãn Trục

Để điều chỉnh diện mạo nhãn trục x và y, bạn có thể dùng các đối số col.lab và cex.lab. Đối số thứ nhất dùng để thay đổi màu của nhãn trục x và y, trong khi đối số thứ hai dùng để xác định kích thước của nhãn trục x và y so với thiết lập (mặc định) của cex.
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIG1haW49ZXhwcmVzc2lvbihcIm1haW4gdGl0bGVcIl4yKSwgXG4gICAgIHN1Yj1leHByZXNzaW9uKFwic3ViLXRpdGxlXCJbMl0pLCBcbiAgICAgeGxhYj1cIngtYXhpcyBsYWJlbFwiLCBcbiAgICAgeWxhYj1cInktYXhpcyBsYWJlbFwiLFxuICAgICBjb2wubGFiPVwiYmx1ZVwiLFxuICAgICBjZXgubGFiPTAuNzUpIn0=

Để biết thêm thông tin về các đối số này, truy cập trang này.

Xóa Nhãn Trục Và Chú Thích Của Biểu Đồ

Nếu bạn muốn loại bỏ các giá trị trên trục của biểu đồ, trước tiên có thể thêm các đối số xaxt và yaxt, đặt là "n". Các đối số này nhận một ký tự chỉ định kiểu trục x. Nếu bạn truyền "n", như trong lệnh dưới đây, bạn có thể bỏ việc vẽ trục.

Lưu ý rằng nếu truyền bất kỳ ký tự nào khác cho các đối số xaxt và yaxt, các trục x và y sẽ được vẽ.

Tiếp theo, bạn có thể thêm đối số chú thích ann và đặt nó thành FALSE để đảm bảo mọi nhãn trục đều bị xóa.
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIHhheHQ9XCJuXCIsXG4gICAgIHlheHQ9XCJuXCIsXG4gICAgIGFubj1GQUxTRSkifQ==

Mẹo: chưa phải thông tin bạn cần? Hãy đến trang này.

Xoay Nhãn Trục Của Biểu Đồ

Bạn có thể thêm đối số las vào hàm axis() để xoay các con số tương ứng với mỗi trục:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhLCBubyBheGVzXG5wbG90KHgsXG4gICAgIHksIFxuICAgICBheGVzPUZBTFNFKVxuXG4jIERyYXcgYSBib3hcbmJveCgpXG5cbiMgQWRkIChtb2RpZmllZCkgYXhlcyB0byB0aGUgcGxvdFxuYXhpcygyLCBcbiAgICAgbGFzPTIpXG5heGlzKDEsIFxuICAgICBsYXM9MCkifQ==

Lưu ý cách mà điều này thực sự yêu cầu bạn thêm một đối số vào hàm plot() để chỉ ra rằng chưa vẽ trục nào: đây là nhiệm vụ của hai lời gọi hàm axis() tiếp theo.

Đối số las có thể có ba giá trị được gán cho nó. Tùy theo lựa chọn, vị trí nhãn sẽ khác nhau: nếu chọn 0, nhãn sẽ luôn song song với trục (mặc định); Nếu chọn 1, nhãn sẽ được đặt theo phương ngang. Chọn 2 nếu bạn muốn vuông góc với trục và 3 nếu bạn muốn đặt theo phương dọc.

Vẫn còn nữa. Nếu bạn muốn biết thêm về khả năng của hàm axis(), hãy tiếp tục đọc!

Di Chuyển Nhãn Trục Của Biểu Đồ R

Vậy, bạn muốn di chuyển các nhãn trục?

Đừng lo, bạn có thể làm điều này với hàm axis(); Như bạn có thể đã thấy trước đó trong hướng dẫn này, hàm này cho phép bạn chỉ định nơi muốn vẽ các trục. Giả sử bạn muốn vẽ trục x phía trên vùng biểu đồ và trục y bên phải nó.

Nhớ rằng nếu bạn truyền 1 hoặc 2 vào hàm axis(), trục sẽ được vẽ ở phía dưới và bên trái của vùng biểu đồ. Cuộn lên một chút để xem ví dụ trong đoạn mã trước!

Điều này có nghĩa là bạn sẽ muốn truyền 3 và 4 vào hàm axis():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54PC1zZXEoMCwyKnBpLDAuMSlcbnk8LXNpbih4KVxuXG4jIFBsb3QgdGhlIGRhdGEsIGJ1dCBkb24ndCBwbG90IGF4ZXMgb3IgYW5ub3RhdGlvbnNcbnBsb3QoeCxcbiAgICAgeSxcbiAgICAgYXhlcz1GQUxTRSwgXG4gICAgIGFubj1GQUxTRSlcblxuIyBEcmF3IHRoZSB4LWF4aXMgYWJvdmUgdGhlIHBsb3QgYXJlYVxuYXhpcygzKVxuXG4jIERyYXcgdGhlIHktYXhpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHBsb3QgYXJlYVxuYXhpcyg0KVxuXG4jIERyYXcgYSBib3hcbmJveCgpIn0=

Như bạn thấy, đầu tiên, bạn vẽ x và y, nhưng bỏ qua trục và chú thích. Sau đó, bạn thêm các trục muốn hiển thị và chỉ định vị trí của chúng so với biểu đồ.

Tính linh hoạt mà hàm axis() mang lại cho bạn ngày càng nhiều! Xem câu hỏi thường gặp tiếp theo để biết còn có thể giải quyết gì với hàm R cơ bản này.

Mẹo: đến câu hỏi cuối để xem thêm cách di chuyển văn bản trong nhãn trục với hjust và vjust!

3. Cách Thêm Và Thay Đổi Khoảng Cách Dấu Gạch Trên Trục Của Biểu Đồ R

Cách Thay Đổi Khoảng Cách Dấu Gạch Trên Trục Của Biểu Đồ R

Để R tự quyết định dấu gạch trên trục có thể khá phiền, và sẽ có lúc bạn muốn điều chỉnh chúng.

1. Dùng hàm axis() để xác định dấu gạch trên trục của biểu đồ

Xem đoạn mã sau:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERlZmluZSB0aGUgcG9zaXRpb24gb2YgdGljayBtYXJrc1xudjEgPC0gYygwLHBpLzIscGksMypwaS8yLDIqcGkpXG5cbiMgRGVmaW5lIHRoZSBsYWJlbHMgb2YgdGljayBtYXJrc1xudjIgPC0gYyhcIjBcIixcIlBpLzJcIixcIlBpXCIsXCIzKlBpLzJcIixcIjIqUGlcIilcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwyKnBpLDAuMSlcbnkgPC0gc2luKHgpXG5cbiMgUGxvdCB0aGUgZGF0YVxucGxvdCh4LFxuICAgICB5LFxuICAgICB4YXh0ID0gXCJuXCIpXG5cbiMgQWRkIGFuIGF4aXMgdG8gdGhlIHBsb3QgXG5heGlzKHNpZGUgPSAxLCBcbiAgICAgYXQgPSB2MSwgXG4gICAgIGxhYmVscyA9IHYyLFxuICAgICB0Y2s9LS4wNSkifQ==

Như bạn thấy, trước hết bạn xác định vị trí của các dấu gạch và nhãn của chúng. Sau đó, bạn vẽ biểu đồ, chỉ định kiểu trục x là "n" để không vẽ trục.

Rồi công việc chính bắt đầu:

  • Hàm axis() cho phép bạn chỉ định cạnh của biểu đồ nơi vẽ trục. Ở đây, đối số là 1, nghĩa là trục sẽ vẽ ở phía dưới. Nếu giá trị là 2, trục sẽ vẽ bên trái, còn 3 hoặc 4 tương ứng là phía trên hoặc bên phải;
  • Đối số at cho phép bạn chỉ ra các điểm nơi cần vẽ dấu gạch. Ở đây, bạn dùng các vị trí đã định trong V1;
  • Tương tự, các labels bạn muốn dùng là những nhãn đã chỉ định trong V2;
  • Bạn điều chỉnh hướng của dấu gạch thông qua tck: bằng cách truyền giá trị âm, bạn chỉ định các dấu gạch sẽ xuất hiện bên dưới trục.

Mẹo: thử truyền một giá trị dương cho đối số tck và xem điều gì xảy ra!

Bạn có thể tiếp tục chỉ định kích thước của dấu gạch qua tcl và diện mạo của nhãn dấu gạch được điều khiển bởi cex.axis, col.axis và font.axis.
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERlZmluZSB0aGUgcG9zaXRpb24gb2YgdGljayBtYXJrc1xudjEgPC0gYygwLHBpLzIscGksMypwaS8yLDIqcGkpXG5cbiMgRGVmaW5lIHRoZSBsYWJlbHMgb2YgdGljayBtYXJrc1xudjIgPC0gYyhcIjBcIixcIlBpLzJcIixcIlBpXCIsXCIzKlBpLzJcIixcIjIqUGlcIilcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwyKnBpLDAuMSlcbnkgPC0gc2luKHgpXG5cbiMgUGxvdCB0aGUgZGF0YVxucGxvdCh4LFxuICAgICB5LFxuICAgICB4YXh0ID0gXCJuXCIpXG5cbiMgQWRkIGF4aXMgdG8gdGhlIHBsb3QgXG5heGlzKHNpZGUgPSAxLCBcbiAgICAgYXQgPSB2MSwgXG4gICAgIGxhYmVscyA9IHYyLFxuICAgICB0Y2s9LS4xLFxuICAgICB0Y2wgPSAtMC41LFxuICAgICBjZXguYXhpcz0xLjA1LFxuICAgICBjb2wuYXhpcz1cImJsdWVcIixcbiAgICAgZm9udC5heGlzPTUpIn0=

2. Dùng các hàm khác để xác định dấu gạch trên trục của biểu đồ R

Bạn cũng có thể dùng các hàm par() và plot() để định vị trí các dấu gạch và số khoảng giữa chúng.

Lưu ý rằng khi đó bạn dùng đối số xaxp, trong đó bạn truyền vị trí của các dấu gạch ở hai đầu trục x, theo sau là số khoảng giữa các dấu gạch:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLDIqcGksMC4xKVxueSA8LSBzaW4oeClcblxuIyBQbG90IHRoZSBkYXRhXG5wbG90KHgsXG4gICAgIHksXG4gICAgIHhheHAgPSBjKDAsIDIqcGksIDUpKSJ9

Bạn cũng có thể chạy đoạn mã sau để về cơ bản có cùng kết quả:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhIFxueCA8LSBzZXEoMCwyKnBpLDAuMSlcbnkgPC0gc2luKHgpXG5cbiMgUGxvdCB0aGUgZGF0YSBcbnBsb3QoeCwgXG4gICAgIHksIFxuICAgICB4YXh0PVwiblwiKVxuXG4jIFVzZSBgcGFyKClgIHRvIHNldCBncmFwaGljYWwgYHhheHBgIHBhcmFtZXRlclxucGFyKHhheHA9IGMoMCwgMipwaSwgMikpIFxuXG4jIEFkZCBhbiBheGlzIHRvIHRoZSBwbG90IFxuYXhpcygxKSJ9

Lưu ý rằng điều này chỉ hoạt động nếu bạn không dùng thang đo logarit. Nếu tọa độ log được bật, hay nói cách khác, nếu par(xlog=T), ba giá trị bạn truyền cho xaxp sẽ có ý nghĩa khác: với khoảng nhỏ, n là số âm. Ngược lại, n thuộc 1:3, chỉ ra số trường hợp, và x1, x2 là lũy thừa thấp nhất và cao nhất của 10 trong tọa độ người dùng, 10 ^ par("usr")[1:2].

Ví dụ:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJuIDwtIDFcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwgMTAwMDAsIDEpXG55IDwtIGV4cChuKS8oZXhwKG4pK3gpXG5cbiMgU2V0IGdyYXBoaWNhbCBwYXJhbWV0ZXJzIGB4bG9nYCBhbmQgYHhheHBgXG5wYXIoeGxvZz1UUlVFLCBcbiAgICB4YXhwPSBjKDEsIDQsIDMpKVxuXG4jIFBvdCB0aGUgZGF0YSBcbnBsb3QoeCwgXG4gICAgIHksIFxuICAgICBsb2c9XCJ4XCIpICJ9

Trong ví dụ này, bạn dùng hàm par(): bạn đặt xlog là TRUE và thêm đối số xaxp để cung cấp tọa độ của các dấu gạch ngoài cùng và số khoảng giữa chúng. Ở đây, bạn đặt giá trị nhỏ nhất là 1, giá trị lớn nhất là 4 và thêm rằng số khoảng giữa mỗi dấu gạch là 3.

Sau đó, bạn vẽ x và y, thêm đối số log để chỉ định có vẽ trục x hoặc y hoặc cả hai theo thang log hay không. Bạn có thể truyền các giá trị "x", "y" và "xy" cho đối số log để làm điều này.

Ví dụ với cả hai trục theo thang logarit là:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJuIDwtIDFcblxuIyBUaGUgZGF0YVxueCA8LSBzZXEoMCwgMjAsIDEpXG55IDwtIGV4cCh4KS8oeClcblxuIyBTZXQgZ3JhcGhpY2FsIHBhcmFtZXRlcnMgYHhsb2dgIGFuZCBgeWF4cGBcbnBhcih4bG9nPVRSVUUsIFxuICAgIHhheHA9IGMoMSwgNCwgMykpXG4jIFNldCBncmFwaGljYWwgcGFyYW1ldGVycyBgeWxvZ2AgYW5kIGB5YXhwYFxucGFyKHlsb2c9VFJVRSwgXG4gICAgeWF4cD0gYygxLCAxMSwgMikpIFxuXG4jIFBsb3QgdGhlIGRhdGEgXG5wbG90KHgsIFxuICAgICB5LCBcbiAgICAgbG9nPVwieHlcIikifQ==

Cách Thêm Dấu Gạch Nhỏ Cho Biểu Đồ R

Bạn có thể nhanh chóng thêm các dấu gạch nhỏ cho biểu đồ với hàm minor.tick() từ gói Hmisc:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIEltcG9ydCBgSG1pc2NgIGxpYnJhcnlcbmxpYnJhcnkoSG1pc2MpXG5cbiMgTWFrZSBhIG5ldyBwbG90XG5wbG90Lm5ldygpXG5cbiMgU2V0IG1pbm9yIHRpY2sgbWFya1xubWlub3IudGljayhueCA9IDEuNSwgXG4gICAgICAgICAgIG55ID0gMiwgXG4gICAgICAgICAgIHRpY2sucmF0aW89MC43NSkifQ==
  • Đối số nx cho phép bạn chỉ định số khoảng muốn chia giữa các dấu gạch lớn trên trục. Nếu truyền giá trị 1, các dấu gạch nhỏ sẽ bị loại bỏ;
  • ny cho phép bạn làm điều tương tự như nx, nhưng cho trục y;
  • tick.ratio cho biết tỷ lệ độ dài giữa dấu gạch nhỏ và dấu gạch lớn. Độ dài của dấu gạch lớn lấy từ par(tck=x).

4. Cách Tạo Hai Trục X Hoặc Y Khác Nhau

Tùy chọn đầu tiên là tạo biểu đồ thứ nhất và gọi hàm par() với đối số new đặt là TRUE để ngăn R xóa thiết bị đồ họa:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFNldCBhIHNlZWQgXG5zZXQuc2VlZCgxMDEpXG5cbiMgVGhlIGRhdGFcbnggPC0gMToxMFxueSA8LSBybm9ybSgxMClcbnogPC0gcnVuaWYoMTAsIG1pbj0xMDAwLCBtYXg9MTAwMDApXG5cbiMgUGxvdCB0aGUgZGF0YVxucGxvdCh4LCB5KSBcblxuIyBEb24ndCBjbGVhbiB0aGUgZnJhbWUgYmVmb3JlIGRyYXdpbmdcbnBhcihuZXcgPSBUUlVFKSJ9

Sau đó, bạn tạo biểu đồ thứ hai với plot(). Truyền dữ liệu vào, và đảm bảo điều chỉnh một số đối số như type, axes, bty, xlab và ylab:

  • type: bạn có thể truyền l để vẽ bằng đường;
  • axes đặt là FALSE để không vẽ trục;
  • bty ẩn việc vẽ khung quanh biểu đồ;
  • xlab đặt là chuỗi rỗng, tức là không có nhãn trên trục x, và
  • ylab cũng đặt là chuỗi rỗng, nên trục y cũng không có nhãn.

Xem tất cả trong khối DataCamp Light sau. Lưu ý rằng đoạn mã phía trên đã được nạp sẵn vào môi trường làm việc của bạn. Bạn có thể kiểm tra bằng bảng điều khiển R ở bên phải hộp DataCamp Light:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6InNldC5zZWVkKDEwMSlcbnggPC0gMToxMFxueSA8LSBybm9ybSgxMClcbnogPC0gcnVuaWYoMTAsIG1pbj0xMDAwLCBtYXg9MTAwMDApXG5wbG90KHgsIHkpIFxucGFyKG5ldyA9IFRSVUUpIiwic2FtcGxlIjoicGxvdCh4LCBcbiAgICAgeiwgXG4gICAgIHR5cGUgPSBcImxcIiwgXG4gICAgIGF4ZXMgPSBGQUxTRSxcbiAgICAgYnR5ID0gXCJuXCIsIFxuICAgICB4bGFiID0gXCJcIiwgXG4gICAgIHlsYWIgPSBcIlwiKSJ9

Tiếp theo, đến lúc thêm một trục và ghi chữ vào lề biểu đồ với axis() và mtext() tương ứng.

Bạn có thể thêm một trục mới ở bên phải bằng cách thêm đối số side và gán giá trị 4 cho hàm axis(). Sau đó, bạn chỉ định đối số at để cho biết các điểm cần vẽ dấu gạch. Ở đây, bạn tính một dãy gồm n+1 giá trị “đẹp” cách đều bao phủ khoảng giá trị trong z với hàm pretty(). Điều này đảm bảo bạn thực sự có các số từ trục y của biểu đồ thứ hai, mà bạn đã đặt tên là z.

Hãy thử tất cả dưới đây:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6InNldC5zZWVkKDEwMSlcbnggPC0gMToxMFxueSA8LSBybm9ybSgxMClcbnogPC0gcnVuaWYoMTAsIG1pbj0xMDAwLCBtYXg9MTAwMDApXG5wbG90KHgsIHkpIFxucGFyKG5ldyA9IFRSVUUpXG5wbG90KHgsIFxuICAgICB6LCBcbiAgICAgdHlwZSA9IFwibFwiLCAjUGxvdCB3aXRoIGxpbmVzXG4gICAgIGF4ZXMgPSBGQUxTRSwgI05vIGF4ZXNcbiAgICAgYnR5ID0gXCJuXCIsICNCb3ggYWJvdXQgcGxvdCBpcyBzdXBwcmVzc2VkXG4gICAgIHhsYWIgPSBcIlwiLCAgI05vIGxhYmVscyBvbiB4LWFuZCB5LWF4aXNcbiAgICAgeWxhYiA9IFwiXCIpIiwic2FtcGxlIjoiYXhpcyhzaWRlPTQsIFxuICAgICBhdCA9IHByZXR0eShyYW5nZSh6KSkpXG5tdGV4dChcInpcIiwgXG4gICAgICBzaWRlPTQsIFxuICAgICAgbGluZT0zKSJ9

Lưu ý rằng đối số side có thể nhận ba giá trị: 1 để đặt chữ ở dưới, 2 ở bên trái, 3 ở trên và 4 để đặt chữ ở bên phải. Đối số line cho biết dòng lề mà chữ bắt đầu.

Kết quả cuối cùng của đoạn mã của bạn sẽ như sau:

set.seed(101)
x <- 1:10
y <- rnorm(10)
z <- runif(10, min=1000, max=10000)
plot(x, y) 
par(new = TRUE)
plot(x, 
     z, 
     type = "l", 
     axes = FALSE, 
     bty = "n", 
     xlab = "", 
     ylab = "")
axis(side=4, 
     at = pretty(range(z)))
mtext("z", 
      side=4, 
      line=3)

Bài tập thêm: hãy thử dựng một biểu đồ R với hai trục x khác nhau! Thực hiện điều này trong khối DataCamp Light dưới đây:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJwbG90Lm5ldygpXG5zZXQuc2VlZCgxMDEpXG54IDwtIDE6MTBcbnkgPC0gcm5vcm0oMTApXG56IDwtIHJ1bmlmKDEwLCBtaW49MTAwMCwgbWF4PTEwMDAwKSBcbnBhcihtYXIgPSBjKDUsIDQsIDQsIDQpICsgMC4zKVxucGxvdCh4LCB5KVxucGFyKG5ldyA9IFRSVUUpXG5wbG90KHosIHksIHR5cGUgPSBcImxcIiwgYXhlcyA9IEZBTFNFLCBidHkgPSBcIm5cIiwgeGxhYiA9IFwiXCIsIHlsYWIgPSBcIlwiKVxuYXhpcyhzaWRlPTMsIGF0ID0gcHJldHR5KHJhbmdlKHopKSlcbm10ZXh0KFwielwiLCBzaWRlPTMsIGxpbmU9MykifQ==

Lưu ý rằng, dù bạn có thể tự làm thủ công tất cả điều này với các hàm cơ bản plot(), axis() và mtext(), vẫn có các gói tự động hóa: hàm twoord.plot() của gói plotrix và hàm doubleYScale() của gói latticeExtra khá tiện và có lẽ nhanh hơn nếu bạn muốn làm điều tương tự:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIEltcG9ydCBgbGF0dGljZUV4dHJhYFxubGlicmFyeShsYXR0aWNlRXh0cmEpXG5cbiMgVGhlIGRhdGFcbmNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbkFnZSA8LSBjaG9sJEFHRVxuQ2hvbCA8LSBjaG9sJENIT0xcblNtb2tlIDwtIGNob2wkU01PS0VcblN0YXRlIDwtIGNob2wkTU9SVFxuXG4jIENyZWF0ZSBhIGJpdmFyaWF0ZSBzY2F0dGVycGxvdCBgYWAgXG5hIDwtIHh5cGxvdChDaG9sIH4gQWdlfFN0YXRlKVxuXG4jIENyZWF0ZSBhIGJpdmFyaWF0ZSBzY2F0dGVycGxvdCBgYmAgXG5iIDwtIHh5cGxvdChTbW9rZSB+IEFnZXxTdGF0ZSlcblxuIyBEcmF3IHRoZSB0d28gcGxvdHMgd2l0aCBkaWZmZXJlbnQgeSBzY2FsZXMgXG5kb3VibGVZU2NhbGUoYSwgYiwgc3R5bGUxID0gMCwgc3R5bGUyID0gMywgYWRkLnlsYWIyID0gVFJVRSwgY29sdW1ucz0zKSJ9

Lưu ý rằng ví dụ trên được tạo với bộ dữ liệu này. Nếu bạn còn băn khoăn về việc nhập dữ liệu hay hàm read.table(), hãy xem hướng dẫn của DataCamp về nhập dữ liệu trong R.

5. Cách Thêm Hoặc Thay Đổi Chú Giải (Legend) Của Biểu Đồ R

Thêm Và Thay Đổi Chú Giải Của Biểu Đồ R Với R Cơ Bản

Bạn có thể dễ dàng thêm chú giải vào biểu đồ R với hàm legend():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLHBpLDAuMSlcbnkxIDwtIGNvcyh4KVxueTIgPC0gc2luKHgpXG5cbiMgUGxvdCBcbnBsb3QoYygwLDMpLCBjKDAsMyksIHR5cGU9XCJuXCIsIHhsYWI9XCJ4XCIsIHlsYWI9XCJ5XCIpXG5cbiMgRHJhdyBsaW5lc1xubGluZXMoeCwgeTEsIGNvbD1cInJlZFwiLCBsd2Q9MilcbmxpbmVzKHgsIHkyLCBjb2w9XCJibHVlXCIsIGx3ZD0yKVxuXG4jIEFkZCBsZWdlbmQgdG8gcGxvdCBcbmxlZ2VuZChcInRvcHJpZ2h0XCIsIFxuICAgICAgIGluc2V0PS4wNSwgXG4gICAgICAgY2V4ID0gMSwgXG4gICAgICAgdGl0bGU9XCJMZWdlbmRcIiwgXG4gICAgICAgYyhcIkNvc2ludXNcIixcIlNpbnVzXCIpLCBcbiAgICAgICBob3Jpej1UUlVFLCBcbiAgICAgICBsdHk9YygxLDEpLCBcbiAgICAgICBsd2Q9YygyLDIpLCBcbiAgICAgICBjb2w9YyhcInJlZFwiLFwiYmx1ZVwiKSwgXG4gICAgICAgYmc9XCJncmV5OTZcIikifQ==

Lưu ý rằng các đối số pt.cex và title.cex được mô tả trong tài liệu của legend() thực ra không hoạt động tốt. Có một số cách xử lý:

  1. Đặt tiêu đề hoặc nhãn của chú giải bằng phông khác bằng cách thêm đối số text.font vào legend():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLHBpLDAuMSlcbnkxIDwtIGNvcyh4KVxueTIgPC0gc2luKHgpXG5cbiMgUGxvdCBcbnBsb3QoYygwLDMpLCBjKDAsMyksIHR5cGU9XCJuXCIsIHhsYWI9XCJ4XCIsIHlsYWI9XCJ5XCIpXG5cbiMgRHJhdyBsaW5lc1xubGluZXMoeCwgeTEsIGNvbD1cInJlZFwiLCBsd2Q9MilcbmxpbmVzKHgsIHkyLCBjb2w9XCJibHVlXCIsIGx3ZD0yKVxuXG4jIEFkZCBsZWdlbmRcbmxlZ2VuZChcInRvcHJpZ2h0XCIsIFxuICAgICAgIGluc2V0PS4wNSwgXG4gICAgICAgY2V4ID0gMSwgXG4gICAgICAgdGl0bGU9XCJMZWdlbmRcIiwgXG4gICAgICAgYyhcIkNvc2ludXNcIixcIlNpbnVzXCIpLCBcbiAgICAgICBob3Jpej1UUlVFLCBcbiAgICAgICBsdHk9YygxLDEpLCBcbiAgICAgICBsd2Q9YygyLDIpLCBcbiAgICAgICBjb2w9YyhcInJlZFwiLFwiYmx1ZVwiKSwgXG4gICAgICAgYmc9XCJncmV5OTZcIixcbiAgICAgICB0ZXh0LmZvbnQ9MykifQ==
  1. Vẽ chú giải hai lần với các giá trị đối số cex khác nhau
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFRoZSBkYXRhXG54IDwtIHNlcSgwLHBpLDAuMSlcbnkxIDwtIGNvcyh4KVxueTIgPC0gc2luKHgpXG5cbiMgUGxvdFxucGxvdChjKDAsMyksIGMoMCwzKSwgdHlwZT1cIm5cIiwgeGxhYj1cInhcIiwgeWxhYj1cInlcIilcblxuIyBEcmF3IGxpbmVzXG5saW5lcyh4LCB5MSwgY29sPVwicmVkXCIsIGx3ZD0yKVxubGluZXMoeCwgeTIsIGNvbD1cImJsdWVcIiwgbHdkPTIpXG5cbiMgQWRkIHN1YnRpdGxlcyBmb3IgbGVnZW5kXG5sZWdlbmQoXCJ0b3ByaWdodFwiLFxuICAgICAgIGluc2V0PS4wNSxcbiAgICAgICBjZXggPSAwLjc1LFxuICAgICAgIGMoXCJDb3NpbnVzXCIsXCJTaW51c1wiKSxcbiAgICAgICB0aXRsZT1cIlwiLFxuICAgICAgIGhvcml6PVRSVUUsXG4gICAgICAgbHR5PWMoMSwxKSwgXG4gICAgICAgbHdkPWMoMiwyKSwgXG4gICAgICAgY29sPWMoXCJyZWRcIixcImJsdWVcIikpXG5cbiMgQWRkIHRpdGxlIHRvIGxlZ2VuZCBcbmxlZ2VuZCgyLjA1LCAyLjk3LCBcbiAgICAgICBpbnNldD0uMDUsXG4gICAgICAgYyhcIlwiLFwiXCIpLFxuICAgICAgIHRpdGxlPVwiTGVnZW5kXCIsXG4gICAgICAgY2V4PTEuMTUsIFxuICAgICAgIGJ0eT1cIm5cIikifQ==

Mẹo: nếu bạn quan tâm đến các màu có thể dùng trong R, hãy xem tài liệu PDF rất hữu ích này.

Cách Thêm Và Thay Đổi Chú Giải Và Nhãn Của Biểu Đồ R Trong ggplot2

Việc thêm chú giải vào biểu đồ ggplot2 khá dễ. Bạn chỉ cần chạy lệnh sau:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgUmVhZCBpbiB0aGUgZGF0YVxuY2hvbCA8LSByZWFkLnRhYmxlKHVybChcImh0dHA6Ly9hc3NldHMuZGF0YWNhbXAuY29tL2Jsb2dfYXNzZXRzL2Nob2wudHh0XCIpLCBcbiAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKVxuXG4jIFBsb3QgdGhlIGRhdGEgXG5nZ3Bsb3QoY2hvbCwgYWVzKHg9Y2hvbCRXRUlHSFQsIFxuICAgICAgICAgICAgICAgICB5PWNob2wkSEVJR0hUKSkgKyBcbiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gZmFjdG9yKGNob2wkTU9SVCksIFxuICAgICAgICAgICAgICAgICBzaGFwZT1jaG9sJFNNT0tFKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICJ9

Và nó sẽ tạo một chú giải mặc định. Nhưng trong hầu hết trường hợp, bạn sẽ muốn điều chỉnh diện mạo chú giải thêm nữa.

Có hai cách để thay đổi tiêu đề và nhãn của chú giải trong ggplot2:

  1. Bảo với thang đo dùng tiêu đề và nhãn khác
Nếu bạn đã chỉ định các đối số như colour hoặc shape, hay các thẩm mỹ khác, bạn cần đổi tên và nhãn thông qua các hàm scale_color_discrete() và scale_shape_discrete() tương ứng:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgUmVhZCBpbiBkYXRhXG5jaG9sIDwtIHJlYWQudGFibGUodXJsKFwiaHR0cDovL2Fzc2V0cy5kYXRhY2FtcC5jb20vYmxvZ19hc3NldHMvY2hvbC50eHRcIiksIFxuICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpXG5cbiMgUGxvdCB0aGUgZGF0YVxuZ2dwbG90KGNob2wsIGFlcyh4PWNob2wkV0VJR0hULCBcbiAgICAgICAgICAgICAgICAgeT1jaG9sJEhFSUdIVCkpICsgXG4gIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGZhY3RvcihjaG9sJE1PUlQpLCBcbiAgICAgICAgICAgICAgICAgc2hhcGUgPSBjaG9sJFNNT0tFKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICsgXG4gIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDEsMC41KSxcbiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygxLDEpKSArIFxuICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID1cIkNvbmRpdGlvblwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoXCJBbGl2ZVwiLCBcIkRlYWRcIikpICtcbiAgc2NhbGVfc2hhcGVfZGlzY3JldGUobmFtZT1cIlNtb2tlclwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoXCJOb24tc21va2VyXCIsIFwiU2lnYXJlXCIsIFwiUGlwZVwiICkpIn0=

Lưu ý rằng biểu đồ trông hơi bị bó trong thẻ Plot của khối DataCamp Light, nhưng điều này sẽ không thành vấn đề nếu bạn chạy mã trong RStudio.

Lưu ý rằng bạn có thể tạo hai chú giải nếu bạn thêm đối số shape vào hàm geom_point() và vào các đối số labels!

Nếu bạn muốn chuyển chú giải xuống dưới biểu đồ, bạn có thể đặt legend.position là "bottom". Mặt khác, đối số legend.justification cho phép bạn đặt chú giải bên trong biểu đồ.

Mẹo: xem đủ loại thang đo có thể dùng để báo cho ggplot biết nên dùng tên và nhãn khác tại đây.

  1. Thay đổi khung dữ liệu để factor có dạng mong muốn
Ví dụ:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIFJlYWQgaW4gZGF0YVxuY2hvbCA8LSByZWFkLnRhYmxlKHVybChcImh0dHA6Ly9hc3NldHMuZGF0YWNhbXAuY29tL2Jsb2dfYXNzZXRzL2Nob2wudHh0XCIpLCBoZWFkZXIgPSBUUlVFKVxuXG4jIE1hbmlwdWxhdGUgdGhlIGRhdGFcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuXG4jIEluc3BlY3QgcmVzdWx0IFxuaGVhZChjaG9sKSJ9

Sau đó bạn có thể dùng các tên factor mới để vẽ biểu đồ trong ggplot2, tránh việc phải “động chạm” đổi tên và nhãn bằng các dòng mã phụ trong quá trình vẽ.

Mẹo: để xem một tờ phao đầy đủ về ggplot2, bạn có thể đến đây.

6. Cách vẽ lưới trong biểu đồ R của bạn

Vẽ lưới trong biểu đồ R với Basic R

Với một số mục đích, bạn có thể thấy cần thêm lưới vào biểu đồ. Bạn có thể dễ dàng thêm lưới bằng hàm grid():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gYygxLDIsMyw0LDUpXG55IDwtIDIqeFxuXG4jIFBsb3RcbnBsb3QoeCx5KVxuXG4jIEdyaWRcbmdyaWQoMTAsMTApIn0=

Vẽ lưới trong biểu đồ R với ggplot2

Khối mã dưới đây cho bạn thấy cách đảm bảo biểu đồ có lưới với gói ggplot2. Lưu ý rằng dữ liệu chol đã được nạp sẵn và các bước xử lý dữ liệu ở trên đã được áp dụng.

Nếu bạn chưa chắc dữ liệu trông như thế nào, hãy in ra vài dòng đầu của data frame trong R Console của khối DataCamp Light:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IGRhdGEgXG5nZ3Bsb3QoY2hvbCwgYWVzKHg9Y2hvbCRXRUlHSFQsIHk9Y2hvbCRIRUlHSFQpKSArIFxuICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBmYWN0b3IoY2hvbCRNT1JUKSwgc2hhcGUgPSBjaG9sJFNNT0tFKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICsgXG4gIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIiksXG4gICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIikpIn0=

Mẹo: nếu bạn không muốn có các đường lưới phụ, chỉ cần truyền element_blank() vào panel.grid.minor.

Nếu bạn muốn tô màu nền, hãy thêm panel.background = element_rect(fill = "navy") vào mã của bạn. Bạn có thể xem cách thực hiện trong khối DataCamp Light bên dưới. Dữ liệu chol đã được nạp và xử lý nhẹ, giống như trước. Hãy tự thử nghiệm!

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6ImxpYnJhcnkoZ2dwbG90MilcbmdncGxvdChjaG9sLCBhZXMoeD1jaG9sJFdFSUdIVCwgeT1jaG9sJEhFSUdIVCkpICsgXG4gIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGZhY3RvcihjaG9sJE1PUlQpLCBzaGFwZSA9IGNob2wkU01PS0VSKSkgKyBcbiAgeGxhYihcIldlaWdodFwiKSArIFxuICB5bGFiKFwiSGVpZ2h0XCIpICsgXG4gIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPVwiQ29uZGl0aW9uXCIsIGxhYmVscz1jKFwiQWxpdmVcIiwgXCJEZWFkXCIpKSArXG4gIHNjYWxlX3NoYXBlX2Rpc2NyZXRlKG5hbWU9XCJTbW9rZXJcIiwgbGFiZWxzPWMoXCJOb24tc21va2VyXCIsIFwiU2lnYXJlXCIsIFwiUGlwZVwiICkpICtcbiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMSwwLjUpLFxuICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMSksXG4gICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIiksXG4gICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXCJncmV5NDBcIiksXG4gICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IFwibmF2eVwiKVxuICAgICAgICApIn0=

7. Cách vẽ biểu đồ với PNG làm nền

Bạn có thể nhanh chóng vẽ một biểu đồ với tệp .png làm nền nhờ gói png. Hãy cài đặt gói nếu cần, kích hoạt để sử dụng trong không gian làm việc qua hàm library() và bạn có thể bắt đầu vẽ!

Đầu tiên, bạn cần nạp ảnh. Dùng hàm readPNG() để chỉ định đường dẫn đến bức ảnh!

mẹo: bạn có thể kiểm tra thư mục làm việc hiện tại và thay đổi nó bằng cách chạy các lệnh sau.

Nếu ảnh được lưu trong thư mục làm việc, bạn chỉ cần ghi readPNG("picture.png") thay vì truyền toàn bộ đường dẫn.

Tiếp theo, bạn thiết lập vùng vẽ và gọi hàm par() để đặt các tham số đồ họa trong rasterImage(). Bạn dùng đối số usr để xác định biên của hệ tọa độ người dùng của vùng vẽ. Trong ví dụ này, bạn đặt 1, 3, 2 và 4.

Sau đó, bạn vẽ một lưới và thêm vài đường:

install.packages("png")
library(png)
image <- readPNG("<path to your picture>")

getwd()
setwd("<path to a folder>")

plot(1:2, type='n', main="Plotting Over an Image", xlab="x", ylab="y")

lim <- par()

rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])

grid()
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")

Điều này có thể cho ra kết quả sau nếu bạn dùng logo DataCamp:

library(png)
image <- readPNG("datacamp.png")
plot(1:2, type="n", main="Plotting Over an Image", xlab="x", ylab="y", asp=1)
lim <- par()
rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1.5, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")

Vẽ chồng lên logo DataCamp

Lưu ý rằng bạn cần cung cấp tệp .png làm đầu vào cho readPNG() và nếu muốn, bạn cũng có thể làm tương tự với ảnh jpg. Tất nhiên, khi đó bạn cần nạp thư viện jpeg!

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERvd25sb2FkIGFuIGltYWdlXG5kb3dubG9hZC5maWxlKFwiaHR0cHM6Ly9ob2x0enlhbi5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMTAvY3JvcHBlZC1wMTA5MDUxOC5qcGdcIiAsIGRlc3RmaWxlPVwibXlfaW1hZ2UuanBnXCIpXG5cbiMgTG9hZCBganBlZ2AgXG5saWJyYXJ5KGpwZWcpXG5cbiMgUmVhZCBpbiB0aGUganBnIGZpbGUgXG5teV9pbWFnZT1yZWFkSlBFRyhcIm15X2ltYWdlLmpwZ1wiKVxuXG4jIFNldCB1cCBhIHBsb3QgYXJlYSB3aXRoIG5vIHBsb3RcbnBsb3QoMToyLCB0eXBlPSduJywgbWFpbj1cIlwiLCB4bGFiPVwieFwiLCB5bGFiPVwieVwiKVxuXG4jIEdldCB0aGUgcGxvdCBpbmZvcm1hdGlvblxubGltIDwtIHBhcigpXG5yYXN0ZXJJbWFnZShteV9pbWFnZSwgbGltJHVzclsxXSwgbGltJHVzclszXSwgbGltJHVzclsyXSwgbGltJHVzcls0XSlcbmdyaWQoKVxuXG4jQWRkIHlvdXIgcGxvdFxubGluZXMoYygxLCAxLjIsIDEuNCwgMS42LCAxLjgsIDIuMCksIGMoMSwgMS4zLCAxLjcsIDEuNiwgMS43LCAxLjApLCB0eXBlPVwiYlwiLCBsd2Q9NSwgY29sPVwid2hpdGVcIikifQ==

Lưu ý trong ví dụ này, bạn tải một ảnh từ web về để dùng trong biểu đồ, nhưng bạn cũng có thể chỉ cần lưu một ảnh và truyền đường dẫn tệp vào readJPEG() để dùng khi vẽ.

Cũng lưu ý rằng ví dụ này được lấy từ R Graph Gallery, nơi cung cấp rất nhiều cảm hứng cho trực quan hóa dữ liệu R, vì bạn có thể tìm cả mã và bản vẽ ở cùng một nơi! Rất lý tưởng khi bạn cần cảm hứng hoặc cách nhanh chóng để tìm đoạn mã cần cho biểu đồ của mình!

8. Cách chỉnh kích thước điểm trong biểu đồ R

Chỉnh kích thước điểm trong biểu đồ R với Basic R

Để chỉnh kích thước điểm với Basic R, bạn có thể đơn giản dùng đối số cex:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJ4IDwtIGMoMSwyLDMsNCw1KVxueSA8LSBjKDYsNyw4LDksMTApXG5cbnBsb3QoeCx5LGNleD0yLGNvbD1cInJlZFwiKSJ9
Hãy nhớ rằng R cho phép bạn kiểm soát nhiều hơn nữa các ký hiệu qua hàm symbols():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJkZiA8LSBkYXRhLmZyYW1lKHgxPTE6MTAsIFxuICAgICAgICAgICAgICAgICB4Mj1zYW1wbGUoMTA6OTksIDEwKSwgXG4gICAgICAgICAgICAgICAgIHgzPTEwOjEpXG5zeW1ib2xzKHg9ZGYkeDEsIFxuICAgICAgICB5PWRmJHgyLCBcbiAgICAgICAgY2lyY2xlcz1kZiR4MywgXG4gICAgICAgIGluY2hlcz0xLzMsIFxuICAgICAgICBhbm49RiwgXG4gICAgICAgIGJnPVwic3RlZWxibHVlMlwiLCBcbiAgICAgICAgZmc9TlVMTCkifQ==

Các hình tròn trong biểu đồ này nhận giá trị của df$x3 làm bán kính, trong khi đối số inches điều khiển kích thước ký hiệu. Khi đối số này nhận một số dương, các ký hiệu sẽ được co giãn sao cho kích thước lớn nhất bằng giá trị này (tính theo inch).

Chỉnh kích thước điểm trong biểu đồ R của bạn với ggplot2

Trong trường hợp này, bạn sẽ muốn chỉnh kích thước điểm trong biểu đồ phân tán. Bạn có thể làm điều này với đối số size. Lưu ý rằng dữ liệu chol đã được nạp sẵn cho bạn:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6ImxpYnJhcnkoZ2dwbG90MilcblxuZ2dwbG90KGNob2wsIFxuICAgICAgIGFlcyh4PWNob2wkV0VJR0hULCB5PWNob2wkSEVJR0hUKSwgXG4gICAgICAgc2l6ZSA9IDIpICsgXG4gIGdlb21fcG9pbnQoKSJ9

Lưu ý rằng bạn cũng có thể truyền đối số size vào hàm geom_point():

ggplot(chol, 
       aes(x=chol$WEIGHT, y=chol$HEIGHT)) + 
  geom_point(size = 2)

Bạn sẽ nhận được cùng một kết quả, nhưng đừng chỉ tin lời tôi! Hãy thử thay đoạn mã cuối trong khối DataCamp Light bằng khối mã này.

9. Cách khớp một đường cong trơn cho dữ liệu R của bạn

Hàm loess() có lẽ là giải pháp ưa thích của mọi lập trình viên R cho kiểu câu hỏi này. Thực chất, nó “khớp một bề mặt đa thức được xác định bởi một hoặc nhiều biến dự báo số, sử dụng phép khớp cục bộ”.

Tóm lại, bạn có dữ liệu và dùng hàm loess(), trong đó bạn liên hệ y với x. Qua đó, bạn chỉ định biến phản hồi dạng số và từ một đến bốn biến dự báo dạng số.

Tiếp theo, bạn vẽ x và y rồi vẽ các đường lên biểu đồ gốc tại nơi bạn dự đoán các giá trị của lo:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJ4IDwtIDE6MTBcbnkgPC0gYygyLDQsNiw4LDcsMTIsMTQsMTYsMTgsMjApXG5cbiNFc3RpbWF0aW9ucyBiZXR3ZWVuIGRhdGFcbmxvIDwtIGxvZXNzKHl+eClcblxucGxvdCh4LHkpXG5cbmxpbmVzKHByZWRpY3QobG8pKSJ9

10. Cách thêm thanh sai số (Error Bars) trong biểu đồ R

Vẽ thanh sai số với Basic R

Tin xấu: R không thể vẽ thanh sai số ngay lập tức. Tin tốt: bạn vẫn có thể vẽ thanh sai số mà không cần cài đặt thêm gói!

Trước tiên, bạn sẽ cần định nghĩa hàm sau để tính một số thống kê tóm tắt của data frame:

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) {
    library(plyr)

    # New version of length which can handle NA's: if na.rm==T, don't count them
    length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
    }

    # This does the summary. For each group's data frame, return a vector with
    # N, mean, and sd
    datac <- ddply(data, groupvars, .drop=.drop,
      .fun = function(xx, col) {
        c(N    = length2(xx[[col]], na.rm=na.rm),
          mean = mean   (xx[[col]], na.rm=na.rm),
          sd   = sd     (xx[[col]], na.rm=na.rm)
        )
      },
      measurevar
    )

    # Rename the "mean" column    
    datac <- rename(datac, c("mean" = measurevar))

    datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean

    # Confidence interval multiplier for standard error
    # Calculate t-statistic for confidence interval: 
    # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
    ciMult <- qt(conf.interval/2 + .5, datac$N-1)
    datac$ci <- datac$se * ciMult

    return(datac)
}

Lưu ý rằng định nghĩa hàm được lấy từ nguồn này và cũng có sẵn qua thư viện Rmisc.

Tiếp theo, bạn có thể dùng hàm này để tính một số thống kê của dữ liệu chol, vốn đã được nạp sẵn. Sau đó, bạn có thể dùng các con số thu được để vẽ biểu đồ.

Hãy kiểm tra dữ liệu trước khi bắt đầu bài tập này!

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGBjaG9sYCBkYXRhc2V0XG5jaG9sYyA8LSBzdW1tYXJ5U0UoY2hvbCwgXG4gICAgICAgICAgICAgICAgICAgbWVhc3VyZXZhcj1cIkNIT0xcIiwgXG4gICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoXCJNT1JUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTTU9LRVJcIikpXG4jUGxvdCB0aGUgZGF0YVxucGxvdChjaG9sYyROLCBcbiAgICAgY2hvbGMkQ0hPTCxcbiAgICAgeWxpbT1yYW5nZShjKGNob2xjJENIT0wtY2hvbGMkc2QsIFxuICAgICAgICAgICAgICAgICAgY2hvbGMkQ0hPTCtjaG9sYyRzZCkpLFxuICAgICBwY2g9MTksIFxuICAgICB4bGFiPVwiQ2hvbGVzdGVyb2wgTWVhc3VyZW1lbnRzXCIsIFxuICAgICB5bGFiPVwiQ2hvbGVzdGVyb2wgTWVhbiArLy0gU0RcIixcbiAgICAgbWFpbj1cIlNjYXR0ZXJwbG90IFdpdGggc2QgRXJyb3IgQmFyc1wiXG4pXG5cbiNEcmF3IGFycm93cyBvZiBhIFwic3BlY2lhbFwiIHR5cGVcbmFycm93cyhjaG9sYyROLCBcbiAgICAgICBjaG9sYyRDSE9MLWNob2xjJHNkLCBcbiAgICAgICBjaG9sYyROLCBcbiAgICAgICBjaG9sYyRDSE9MK2Nob2xjJHNkLCBcbiAgICAgICBsZW5ndGg9MC4wNSwgXG4gICAgICAgYW5nbGU9OTAsIFxuICAgICAgIGNvZGU9MykifQ==

Nếu bạn muốn xem tất cả các đối số mà arrows() có thể nhận, hãy vào đây.

Vẽ thanh sai số với ggplot2

Thanh sai số biểu diễn sai số chuẩn của trung bình

Trước tiên, hãy tóm tắt dữ liệu của bạn bằng hàm summarySE() từ gói Rmisc hoặc dùng hàm đã định nghĩa ở trên. Sau đó, bạn có thể dùng data frame thu được để vẽ một số biến và đồng thời vẽ các thanh sai số cho chúng, ví dụ với sai số chuẩn của trung bình.

Vì tiện lợi, dữ liệu cũng như hàm đã được nạp sẵn cho bạn:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLCBcbiAgICAgICAgICAgICAgICAgIGNvbG91cj1NT1JUKSkgKyBcbiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2UsIFxuICAgICAgICAgICAgICAgICAgICAgIHltYXg9Q0hPTCtzZSwgXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9TU9SVCksIFxuICAgICAgICAgICAgICAgICAgd2lkdGg9LjEpICtcbiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPU1PUlQpKSArXG4gICAgZ2VvbV9wb2ludCgpIn0=
Nếu bạn muốn thay đổi vị trí của các thanh sai số, ví dụ khi chúng chồng lên nhau, bạn có thể cân nhắc dùng hàm position_dodge():
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxucGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4xKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLCBcbiAgICAgICAgICAgICAgICAgIGNvbG91cj1NT1JUKSkgKyBcbiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2UsXG4gICAgICAgICAgICAgICAgICAgICAgeW1heD1DSE9MK3NlLCBcbiAgICAgICAgICAgICAgICAgICAgICBncm91cD1NT1JUKSwgXG4gICAgICAgICAgICAgICAgICB3aWR0aD0uMSwgXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wZCkgK1xuICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TU9SVCkpICtcbiAgICBnZW9tX3BvaW50KCkifQ==

Mẹo: nếu bạn gặp lỗi như “geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?”, thường là bạn cần điều chỉnh thuộc tính group.

Thanh sai số biểu diễn khoảng tin cậy

Tiếp tục từ phần tóm tắt dữ liệu mà bạn đã tạo với hàm summarySE() của thư viện Rmisc hoặc ở mục trước, bạn cũng có thể vẽ các thanh sai số biểu diễn khoảng tin cậy. Ở đây, biểu đồ với các thanh sai số mức tin cậy 95% được vẽ.

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxucGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4xKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLFxuICAgICAgICAgICAgICAgICAgY29sb3VyPU1PUlQpKSArIFxuICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q0hPTC1jaSwgXG4gICAgICAgICAgICAgICAgICAgICAgeW1heD1DSE9MK2NpLCBcbiAgICAgICAgICAgICAgICAgICAgICBncm91cD1NT1JUKSwgXG4gICAgICAgICAgICAgICAgICB3aWR0aD0uMSwgXG0gICAgICAgICAgICAgICAgICBjb2xvdXI9XCJibGFja1wiLFxuICAgICAgICAgICAgICAgICAgcG9zaXRpb249cGQpICtcbiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPU1PUlQpKSArXG4gICAgZ2VvbV9wb2ludCgpIn0=

Lưu ý cách màu của các thanh sai số hiện được đặt thành màu đen với đối số colour.

Thanh sai số biểu diễn độ lệch chuẩn

Cuối cùng, bạn cũng có thể dùng kết quả của hàm summarySE() trong gói Rmisc hoặc từ định nghĩa hàm mà bạn đã sao chép ở một trong các mục trước để vẽ các thanh sai số biểu diễn độ lệch chuẩn.

Cụ thể, bạn chỉ cần điều chỉnh các đối số ymin và ymax mà bạn truyền vào geom_errorbar():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIlxuc3VtbWFyeVNFIDwtIGZ1bmN0aW9uKGRhdGE9TlVMTCwgbWVhc3VyZXZhciwgZ3JvdXB2YXJzPU5VTEwsIG5hLnJtPUZBTFNFLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWw9Ljk1LCAuZHJvcD1UUlVFKSB7XG4gICAgbGlicmFyeShwbHlyKVxuXG4gICAgIyBOZXcgdmVyc2lvbiBvZiBsZW5ndGggd2hpY2ggY2FuIGhhbmRsZSBOQSdzOiBpZiBuYS5ybT09VCwgZG9uJ3QgY291bnQgdGhlbVxuICAgIGxlbmd0aDIgPC0gZnVuY3Rpb24gKHgsIG5hLnJtPUZBTFNFKSB7XG4gICAgICAgIGlmIChuYS5ybSkgc3VtKCFpcy5uYSh4KSlcbiAgICAgICAgZWxzZSAgICAgICBsZW5ndGgoeClcbiAgICB9XG5cbiAgICAjIFRoaXMgZG9lcyB0aGUgc3VtbWFyeS4gRm9yIGVhY2ggZ3JvdXAncyBkYXRhIGZyYW1lLCByZXR1cm4gYSB2ZWN0b3Igd2l0aFxuICAgICMgTiwgbWVhbiwgYW5kIHNkXG4gICAgZGF0YWMgPC0gZGRwbHkoZGF0YSwgZ3JvdXB2YXJzLCAuZHJvcD0uZHJvcCxcbiAgICAgIC5mdW4gPSBmdW5jdGlvbih4eCwgY29sKSB7XG4gICAgICAgIGMoTiAgICA9IGxlbmd0aDIoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgbWVhbiA9IG1lYW4gICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSksXG4gICAgICAgICAgc2QgICA9IHNkICAgICAoeHhbW2NvbF1dLCBuYS5ybT1uYS5ybSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG1lYXN1cmV2YXJcbiAgICApXG5cbiAgICAjIFJlbmFtZSB0aGUgXCJtZWFuXCIgY29sdW1uICAgIFxuICAgIGRhdGFjIDwtIHJlbmFtZShkYXRhYywgYyhcIm1lYW5cIiA9IG1lYXN1cmV2YXIpKVxuXG4gICAgZGF0YWMkc2UgPC0gZGF0YWMkc2QgLyBzcXJ0KGRhdGFjJE4pICAjIENhbGN1bGF0ZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhblxuXG4gICAgIyBDb25maWRlbmNlIGludGVydmFsIG11bHRpcGxpZXIgZm9yIHN0YW5kYXJkIGVycm9yXG4gICAgIyBDYWxjdWxhdGUgdC1zdGF0aXN0aWMgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWw6IFxuICAgICMgZS5nLiwgaWYgY29uZi5pbnRlcnZhbCBpcyAuOTUsIHVzZSAuOTc1IChhYm92ZS9iZWxvdyksIGFuZCB1c2UgZGY9Ti0xXG4gICAgY2lNdWx0IDwtIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBkYXRhYyROLTEpXG4gICAgZGF0YWMkY2kgPC0gZGF0YWMkc2UgKiBjaU11bHRcblxuICAgIHJldHVybihkYXRhYylcbn0iLCJzYW1wbGUiOiIjQ2FsY3VsYXRlIHNvbWUgc3RhdGlzdGljcyBmb3IgdGhlIGNob2wgZGF0YXNldFxuY2hvbGMgPC0gc3VtbWFyeVNFKGNob2wsIFxuICAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxubGlicmFyeShnZ3Bsb3QyKVxucGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4xKVxuZ2dwbG90KGNob2xjLCBhZXMoeD1TTU9LRVIsIFxuICAgICAgICAgICAgICAgICAgeT1DSE9MLCBcbiAgICAgICAgICAgICAgICAgIGNvbG91cj1NT1JUKSkgKyBcbiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2QsIFxuICAgICAgICAgICAgICAgICAgICAgIHltYXg9Q0hPTCtzZCwgXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9TU9SVCksIFxuICAgICAgICAgICAgICAgICAgd2lkdGg9LjEsXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wZCkgK1xuICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TU9SVCkpICtcbiAgICBnZW9tX3BvaW50KCkifQ==

Mẹo lớn*: hãy xem thêm trang này để có các ví dụ chi tiết hơn về cách vẽ trung bình và thanh sai số.

11. Cách lưu biểu đồ thành ảnh trên đĩa

Bạn có thể dùng dev.copy() để sao chép biểu đồ của bạn, được tạo trên thiết bị đồ họa hiện tại, sang thiết bị hoặc thư mục mà bạn chỉ định.

x <- seq(0,2*pi,0.1)
y <- sin(x)
plot(x,y)
dev.copy(jpeg,
         filename="<path to your file/name.jpg>");
dev.off();
(x)
(y)

12. Cách vẽ hai biểu đồ R cạnh nhau

Vẽ hai biểu đồ cạnh nhau bằng R cơ bản

Bạn có thể làm điều này với các lệnh R cơ bản:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbmQwIDwtIG1hdHJpeChybm9ybSgxNSksIG5jb2w9MylcbmQxIDwtIG1hdHJpeChybm9ybSgxNSksIG5jb2w9MylcblxuIyBTZXQgbGltaXRzIFxubGltaXRzIDwtIHJhbmdlKGQwLGQxKVxuXG4jIFNldCBncmFwaGljYWwgcGFyYW1ldGVyIGBtZnJvd2BcbnBhcihtZnJvdyA9IGMoMSwgMikpIFxuXG4jIE1ha2UgMiBib3hwbG90c1xuYm94cGxvdChkMCxcbiAgICAgICAgeWxpbT1saW1pdHMpXG5ib3hwbG90KGQxLFxuICAgICAgICB5bGltPWxpbWl0cykifQ==

Bằng cách thêm hàm par() với đối số mfrow, bạn chỉ định một vector, trong trường hợp này gồm 1 và 2: tất cả hình sẽ được vẽ trong một mảng 1x2 trên thiết bị theo hàng (mfrow).

Nói cách khác, các boxplot phía trên sẽ được in trên một hàng gồm hai cột.

Vẽ hai biểu đồ cạnh nhau bằng ggplot2

Nếu bạn muốn đặt các biểu đồ cạnh nhau và không muốn tự đặt giới hạn, bạn có thể cân nhắc dùng gói ggplot2 để vẽ các biểu đồ cạnh nhau.

Dữ liệu của bạn chol và hàm summarySE() đã được nạp sẵn. Hãy kiểm tra chúng trong R Console nếu bạn chưa rõ trông chúng như thế nào:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuI0NhbGN1bGF0ZSBzb21lIHN0YXRpc3RpY3MgZm9yIHRoZSBjaG9sIGRhdGFzZXRcbmNob2xjIDwtIHN1bW1hcnlTRShjaG9sLCBcbiAgICAgICAgICAgICAgICAgIG1lYXN1cmV2YXI9XCJDSE9MXCIsIFxuICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKFwiTU9SVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU01PS0VSXCIpKVxuXG4jUGxvdCB0aGUgY2hvbGMgZGF0YXNldFxuZ2dwbG90KGNob2wsIGFlcyh4PVNNT0tFUiwgXG4gICAgICAgICAgICAgICAgICB5PUNIT0wsIFxuICAgICAgICAgICAgICAgICAgY29sb3VyPU1PUlQpKSArIFxuICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNIT0wtc2QsIFxuICAgICAgICAgICAgICAgICAgICB5bWF4PUNIT0wrc2QsIFxuICAgICAgICAgICAgICAgICAgICBncm91cD1NT1JUKSwgXG4gICAgICAgICAgICAgICAgd2lkdGg9LjEsIFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBkKSArIFxuICBnZW9tX2xpbmUoYWVzKGdyb3VwPU1PUlQpKSArIFxuICBnZW9tX3BvaW50KCkgKyBcbiAgZmFjZXRfZ3JpZCguIH4gTU9SVCkifQ==

Lưu ý cách bạn chỉ cần thêm hàm facet_grid() để chỉ ra rằng bạn muốn hai biểu đồ đặt cạnh nhau. Yếu tố được dùng để quyết định cách các biểu đồ được vẽ là MORT, như bạn có thể thấy ở trên!

Vẽ nhiều biểu đồ cạnh nhau bằng gridExtra

Để in các biểu đồ cạnh nhau, bạn có thể dùng gói gridExtra; Hãy đảm bảo bạn đã cài và kích hoạt gói trong không gian làm việc, rồi chạy lệnh như sau:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdyaWRFeHRyYWAgYW5kIGBnZ3Bsb3QyYFxubGlicmFyeShncmlkRXh0cmEpXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgUGxvdFxucGxvdDEgPC0gcXBsb3QoMSlcbnBsb3QyIDwtIHFwbG90KDEpXG5cbiMgQXJyYW5nZSBgcGxvdDFgIGFuZCBgcGxvdDJgXG5ncmlkLmFycmFuZ2UocGxvdDEsIFxuICAgICAgICAgICAgIHBsb3QyLCBcbiAgICAgICAgICAgICBuY29sPTIpIn0=

Lưu ý lần nữa rằng bạn quyết định cách hai biểu đồ hiển thị nhờ đối số ncol.

Vẽ nhiều biểu đồ cạnh nhau bằng lattice

Tương tự cách làm với gói ggplot2, gói lattice cũng không yêu cầu bạn chỉ định giới hạn hay cách bạn muốn in các biểu đồ cạnh nhau.

Thay vào đó, bạn dùng bwplot() để tạo các biểu đồ trellis với kiểu đồ thị là box plot. Biểu đồ trellis hiển thị một biến hoặc mối quan hệ giữa các biến, có điều kiện theo một hoặc nhiều biến khác.

Trong trường hợp này, nếu bạn dùng bộ dữ liệu chol (bạn có thể tìm tại đây hoặc nạp bằng hàm read.table()), bạn sẽ hiển thị biến CHOL riêng biệt cho từng tổ hợp mức của các nhân tố SMOKE và MORT.

Lưu ý dữ liệu đã được nạp sẵn cho bạn trong khối DataCamp Light dưới đây!

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgXG4gICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6IiMgTG9hZCBgbGF0dGljZWBcbmxpYnJhcnkobGF0dGljZSlcblxuI1Bsb3QgdHdvIHBsb3RzIHNpZGUgYnkgc2lkZVxuYndwbG90KH4gQ0hPTHxTTU9LRVIrTU9SVCxcbiAgICAgICBjaG9sKSJ9

Vẽ các biểu đồ cạnh nhau với gridBase

Một cách khác để đặt hai biểu đồ cạnh nhau là dùng gói gridBase, gói này xử lý “tích hợp đồ họa base và grid”. Cách này hữu ích khi bạn muốn đặt một biểu đồ R cơ bản và một ggplot cạnh nhau.

Cách làm như sau: trước hết, kích hoạt các gói cần thiết trong không gian làm việc. Ở đây, bạn cần sẵn sàng gridBase để đặt hai biểu đồ cạnh nhau, và grid cùng ggplot2 để thực sự tạo biểu đồ:

library(grid)
library(gridBase)
library(ggplot2)

plot.new()

gl <- grid.layout(nrow=1, 
                  ncol=2)
vp.1 <- viewport(layout.pos.col=1, 
                 layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, 
                 layout.pos.row=1)
                 
pushViewport(viewport(layout=gl))
pushViewport(vp.1)

par(new=TRUE, 
    fig=gridFIG())
plot(x = 1:10, 
     y = 10:1)
     
popViewport()

pushViewport(vp.2)

ggplotted <- qplot(x=1:10,y=10:1, 'point')
print(ggplotted, newpage = FALSE)

popViewport(1)

Nếu muốn và cần, bạn có thể bắt đầu bằng một biểu đồ trống rồi thiết lập bố cục. Lưu ý rằng vì bạn muốn hai biểu đồ được tạo cạnh nhau, bạn cần tạo một bố cục lưới gồm một hàng và hai cột.

Giờ bạn muốn lấp đầy các ô của lưới bằng các viewport. Chúng xác định các vùng hình chữ nhật trên thiết bị đồ họa với sự trợ giúp của các tọa độ trong các vùng đó. Trong trường hợp này, thuận tiện hơn nhiều khi dùng các thông số của lưới như vừa mô tả ở trên thay vì tọa độ x hoặc y thực. Đó là lý do bạn nên dùng các đối số layout.pos.col và layout.pos.row.

Vì các viewport chỉ là mô tả hoặc định nghĩa, các đối tượng kiểu này cần được “đẩy” vào cây viewport trước khi bạn thấy bất kỳ hiệu ứng nào trên hình vẽ. Bạn nên dùng hàm pushViewport() để thực hiện điều này.

Giờ bạn có thể tiếp tục thêm vùng chữ nhật đầu tiên vp.1 vào cây ViewPort, sau đó báo cho R bằng gridFig() vẽ một biểu đồ base trong một viewport của grid (tức vp.1). Đối số fig thường nhận các tọa độ của vùng hình vẽ trong vùng hiển thị của thiết bị. Ở đây, bạn dùng đối số fig để bắt đầu một biểu đồ mới, thêm nó vào một biểu đồ hiện có bằng cách thêm new = TRUE trong hàm par(). Bạn vẽ đồ họa base và loại bỏ viewport khỏi cây:

plot.new()

gl <- grid.layout(nrow=1, 
                  ncol=2)

vp.1 <- viewport(layout.pos.col=1, 
                 layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, 
                 layout.pos.row=1)

pushViewport(viewport(layout=gl))

pushViewport(vp.1)

par(new=TRUE, 
    fig=gridFIG())
plot(x = 1:10, 
     y = 10:1)
popViewport()

Vì bạn muốn hai biểu đồ được tạo cạnh nhau, bạn sẽ đặt một biểu đồ ở cột thứ nhất và biểu đồ còn lại ở cột thứ hai, cả hai đều nằm trên hàng thứ nhất.

Lưu ý rằng hàm pushViewport() nhận hàm viewport(), bản thân nó chứa đối số layout. Đối số này chỉ ra “một đối tượng bố cục lưới chia viewport thành các vùng con”.

Cũng lưu ý rằng bạn có thể chỉ định trong hàm popViewport() một đối số để chỉ ra số lượng viewport bạn muốn loại khỏi cây. Nếu giá trị này là 0, điều đó có nghĩa là bạn muốn loại bỏ các viewport cho đến tận viewport gốc. Giá trị mặc định của đối số này là 1.

Hãy thêm vùng chữ nhật thứ hai vp.2 vào cây ViewPort. Sau đó bạn có thể tạo ggplot và loại viewport khỏi cây.

pushViewport(vp.2)
ggplotted <- qplot(x=1:10,
                   y=10:1, 
                   'point')
print(ggplotted, 
      newpage = FALSE)
popViewport(1)

Lưu ý rằng bạn cần in (print) đối tượng đồ họa được tạo bởi qplot() để thực sự vẽ và hiển thị nó. Đồng thời, bạn cũng cần đặt newpage = FALSE, nếu không bạn sẽ chỉ thấy qplot()…

Thêm nữa, hãy nhớ rằng giá trị mặc định của số viewport cần loại trong hàm popViewport() là 1. Điều này khiến việc ghi popViewport(1) trong mã trở nên hơi dư thừa.

13. Cách vẽ nhiều đường hoặc điểm

Dùng R cơ bản để vẽ nhiều đường hoặc điểm trong cùng một biểu đồ

Để vẽ hai hoặc nhiều đồ thị trên cùng một biểu đồ, về cơ bản bạn bắt đầu bằng cách tạo một biểu đồ cơ bản điển hình trong R. Sau đó, bạn thêm nhiều đường hoặc điểm vào biểu đồ. Trong trường hợp này, bạn thêm nhiều đường, nên bạn sẽ xác định thêm các trục y:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAscGksMC4xKVxueTEgPC0gY29zKHgpXG5cbiMgUGxvdFxucGxvdCh4LFxuICAgICB5MSxcbiAgICAgdHlwZT1cImxcIixcbiAgICAgY29sID0gXCJyZWRcIilcblxuIyBNb3JlIGRhdGFcbnkyIDwtIHNpbih4KVxueTMgPC0gdGFuKHgpXG55NCA8LSBsb2coeClcblxuIyBMaW5lc1xubGluZXMoeCx5Mixjb2w9XCJncmVlblwiKVxubGluZXMoeCx5Mixjb2w9XCJncmVlblwiKVxubGluZXMoeCx5Myxjb2w9XCJibGFja1wiKVxubGluZXMoeCx5NCxjb2w9XCJibHVlXCIpIn0=

Tiếp theo, bạn thấy rằng các đường này được vẽ bằng hàm lines().

Điều này cho kết quả như sau:

Lưu ý rằng hàm lines() nhận ba đối số: trục x và trục y bạn muốn vẽ, và màu (được biểu diễn bằng đối số col) mà bạn muốn dùng để vẽ. Bạn cũng có thể thêm các thuộc tính sau:

Tính năng Đối số Giá trị nhập
Kiểu đường lty Số nguyên hoặc chuỗi ký tự
Bề rộng đường lwd Số nguyên
Kiểu ký hiệu vẽ pch Số nguyên hoặc ký tự đơn
Kiểu đầu mút đường lend Số nguyên hoặc chuỗi
Kiểu nối đoạn ljoin Số nguyên hoặc chuỗi
Giới hạn góc mài (mitre) lmitre Số nguyên < 1

Ví dụ về các đối số này như sau:

lines(x,y2,col="green", lty = 2, lwd = 3)
lines(x,y2,col="green", lty = 5, lwd = 2, pch = 2)
lines(x,y3,col="black", lty = 3, lwd = 5, pch = 3, lend = 0, ljoin = 2)
lines(x,y4,col="blue", lty = 1, lwd = 2, pch = 3, lend = 2, ljoin = 1, lmitre = 2)

Lưu ý rằng đối số pch không hoạt động tốt với hàm lines() và tốt nhất nên chỉ dùng với points().

Mẹo: nếu bạn muốn vẽ các điểm trên cùng một biểu đồ, bạn có thể dùng hàm points():
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAscGksMC4xKVxueTUgPC0geF4zXG5cbiMgUG9pbnRzXG5wb2ludHMoeCxcbiAgICAgICB5NSxcbiAgICAgICBjb2w9XCJ5ZWxsb3dcIikifQ==

Bạn có thể thêm các đối số tương tự vào hàm points() như đã làm với hàm lines() và được liệt kê ở trên. Tuy nhiên, có một vài bổ sung:

Tính năng Đối số Giá trị nhập
Màu nền (tô) bg Chỉ khi pch = 21:25
Độ nở ký tự (biểu tượng) cex Số nguyên

Ví dụ mã cho các đối số này như sau:

points(x,y4,col="blue", pch=21, bg = "red") 
points(x, y5, col="yellow", pch = 5, bg = "blue") 
Nếu bạn thêm các thay đổi này vào biểu đồ ở trên, bạn sẽ nhận được kết quả như sau:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAscGksMC4xKVxueTEgPC0gY29zKHgpXG5cbiNiYXNpYyBncmFwaGljYWwgb2JqZWN0XG5wbG90KHgseTEsdHlwZT1cImxcIiAsY29sID0gXCJyZWRcIilcblxuIyBNb3JlIGRhdGFcbnkyIDwtIHNpbih4KVxueTMgPC0gdGFuKHgpXG55NCA8LSBsb2coeClcbnk1IDwtIHheM1xuXG4jZmlyc3QgbGF5ZXJcbmxpbmVzKHgseTIsY29sPVwiZ3JlZW5cIiwgbHR5ID0gMSwgbHdkID0gMykgXG4jc2Vjb25kIGxheWVyXG5saW5lcyh4LHkyLGNvbD1cImdyZWVuXCIsIGx0eSA9IDMsIGx3ZCA9IDIsIHBjaCA9IDIpIFxuI3RoaXJkIGxheWVyXG5saW5lcyh4LHkzLGNvbD1cImJsYWNrXCIsIGx0eSA9IDIsIGx3ZCA9IDEsIHBjaCA9IDMsIGxlbmQgPSAwLCBsam9pbiA9IDIpIFxuI2ZvdXJ0aCBsYXllclxucG9pbnRzKHgseTQsY29sPVwiYmx1ZVwiLCBwY2g9MjEsIGJnID0gXCJyZWRcIikgXG4jZmlmdGggbGF5ZXJcbnBvaW50cyh4LCB5NSwgY29sPVwieWVsbG93XCIsIHBjaCA9IDI0LCBiZyA9IFwiYmx1ZVwiKSAifQ==

Dùng ggplot2 để vẽ nhiều đường hoặc điểm trong một biểu đồ R

Gói ggplot2 cũng rất tiện lợi khi cho phép bạn tạo các lớp (layer), nhờ đó bạn có thể vẽ hai hoặc nhiều đồ thị trên cùng một biểu đồ R mà không gặp khó khăn và khá dễ dàng:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgRGF0YVxueCA8LSAxOjEwXG55MSA8LSBjKDIsNCw2LDgsNywxMiwxNCwxNiwxOCwyMClcbnkyIDwtIHJub3JtKDEwLCBtZWFuID0gNSlcbmRmIDwtIGRhdGEuZnJhbWUoeCwgeTEsIHkyKVxuXG4jIGJhc2ljIGdyYXBoaWNhbCBvYmplY3RcbmdncGxvdChkZiwgYWVzKHgpKSArICBcbiAgIyBmaXJzdCBsYXllclxuICBnZW9tX2xpbmUoYWVzKHk9eTEpLCBcbiAgICAgICAgICAgIGNvbG91cj1cInJlZFwiKSArIFxuICAjIHNlY29uZCBsYXllclxuICBnZW9tX2xpbmUoYWVzKHk9eTIpLCAgICAgIFxuICAgICAgICAgICAgY29sb3VyPVwiZ3JlZW5cIikgIn0=

14. Cách cố định tỷ lệ khung hình (aspect ratio) cho biểu đồ R

Nếu bạn muốn lưu biểu đồ R thành ảnh trong đó các trục tỷ lệ thuận với kích thước của chúng, đó là dấu hiệu bạn muốn cố định tỷ lệ khung hình.

Điều chỉnh tỷ lệ khung hình với R cơ bản

Khi bạn dùng các lệnh R cơ bản để tạo biểu đồ, bạn có thể thêm đối số asp của hàm plot(), kèm một số nguyên, để đặt tỷ lệ khung hình. Xem ví dụ đầu tiên này khi chưa định nghĩa tỷ lệ khung hình:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAsMipwaSwwLjEpXG55IDwtIHNpbih4KVxuXG4jIFBsb3RcbnBsb3QoeCx5KSJ9
Và so sánh với biểu đồ dưới đây nơi tỷ lệ khung hình được định nghĩa với đối số asp:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIERhdGFcbnggPC0gc2VxKDAsMipwaSwwLjEpXG55IDwtIHNpbih4KVxuXG4jIFBsb3RcbnBsb3QoeCxcbiAgICAgeSwgXG4gICAgIGFzcD0yKSJ9

Điều chỉnh tỷ lệ khung hình cho biểu đồ với ggplot2

Để cố định tỷ lệ khung hình cho các biểu đồ ggplot2, bạn chỉ cần thêm hàm coord_fixed(), hàm này cung cấp “hệ tọa độ có tỉ lệ cố định [buộc] một tỷ lệ xác định giữa đơn vị dữ liệu được biểu diễn trên các trục”.

Nói cách khác, hàm này cho phép bạn chỉ định số đơn vị trên trục y tương đương với một đơn vị trên trục x. Mặc định luôn là 1, nghĩa là một đơn vị trên trục x có cùng độ dài với một đơn vị trên trục y. Nếu tỷ lệ đặt cao hơn, đơn vị trên trục y dài hơn đơn vị trên trục x và ngược lại.

So sánh các ví dụ sau:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgRGF0YVxuZGYgPC0gZGF0YS5mcmFtZSh4ID0gcnVuaWYoMTAwLCAwLCA1KSxcbiAgICAgICAgICAgICAgICAgeSA9IHJ1bmlmKDEwMCwgMCwgNSkpXG5cbiMgUGxvdFxuZ2dwbG90KGRmLCBhZXMoeD14LCB5PXkpKSArIGdlb21fcG9pbnQoKSJ9
so với
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIExvYWQgaW4gYGdncGxvdDJgXG5saWJyYXJ5KGdncGxvdDIpXG5cbiMgRGF0YVxuZGYgPC0gZGF0YS5mcmFtZSh4ID0gcnVuaWYoMTAwLCAwLCA1KSxcbiAgICAgICAgICAgICAgICAgeSA9IHJ1bmlmKDEwMCwgMCwgNSkpXG5cbiMgUGxvdFxuZ2dwbG90KGRmLCBhZXMoeD14LCB5PXkpKSArIFxuICBnZW9tX3BvaW50KCkgKyBcbiAgY29vcmRfZml4ZWQocmF0aW89MSkifQ==

Điều chỉnh tỷ lệ khung hình cho biểu đồ với MASS

Bạn cũng có thể cân nhắc dùng gói MASS, gói này có hàm eqscplot(): nó tạo các biểu đồ với tỉ lệ hình học bằng nhau. Hàm này áp dụng cho scatterplot:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImNob2wgPC0gcmVhZC50YWJsZSh1cmwoXCJodHRwOi8vYXNzZXRzLmRhdGFjYW1wLmNvbS9ibG9nX2Fzc2V0cy9jaG9sLnR4dFwiKSwgaGVhZGVyID0gVFJVRSlcbmxldmVscyhjaG9sJFNNT0tFKVtsZXZlbHMoY2hvbCRTTU9LRSk9PVwiTm9uLXNtb2tlclwiXSA8LSBcIk5vbi1zbW9rZXJcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJTaWdhcmVcIl0gPC0gXCJTaWdhcmVcIlxubGV2ZWxzKGNob2wkU01PS0UpW2xldmVscyhjaG9sJFNNT0tFKT09XCJQaXBlXCJdIDwtIFwiUGlwZVwiXG5uYW1lcyhjaG9sKVtuYW1lcyhjaG9sKT09XCJTTU9LRVwiXSAgPC0gXCJTTU9LRVJcIiIsInNhbXBsZSI6IiMgTG9hZCBpbiBgTUFTU2BcbmxpYnJhcnkoTUFTUylcblxuIyBEYXRhXG54ID0gY2hvbCRIRUlHSFRcbnkgPSBjaG9sJFdFSUdIVFxueiA9IGFzLm51bWVyaWMoY2hvbCRNT1JUKVxuXG4jIFBsb3QgXG5lcXNjcGxvdCh4LCBcbiAgICAgICAgIHksIFxuICAgICAgICAgcmF0aW8gPSAxLCBcbiAgICAgICAgIGNvbD1jKFwicmVkXCIsIFwiZ3JlZW5cIiksIFxuICAgICAgICAgcGNoPWMoMSwyKSkifQ==

Mẹo: bạn có thể nên bắt đầu một khung biểu đồ mới trước khi chạy đoạn mã trên!

Lưu ý rằng bạn có thể truyền thêm các đối số cho hàm eqscplot() để tùy chỉnh giao diện của scatterplot!

15. Chức năng của hjust và vjust trong ggplot2 là gì

Về cơ bản, bạn dùng các đối số này khi muốn đặt vị trí văn bản trong ggplot. hjust cho phép bạn xác định căn lề ngang, trong khi vjust dùng để điều khiển căn lề dọc. Xem tài liệu của geom_text() để biết thêm.

Để minh họa điều gì xảy ra, bạn có thể tạo một data frame từ mọi tổ hợp của các nhân tố với hàm expand.grid():

hjustvjust <- expand.grid(hjust=c(0, 0.5, 1),
                          vjust=c(0, 0.5, 1),
                          angle=c(0, 45, 90),
                          text="Text"
                          )

Lưu ý rằng hjust và vjust chỉ nhận giá trị từ 0 đến 1.

  • 0 nghĩa là văn bản căn trái; Nói cách khác, toàn bộ văn bản thẳng hàng với lề trái. Đây thường là những gì bạn thấy khi làm việc với các trình soạn thảo văn bản như Microsoft Word.
  • 1 nghĩa là văn bản căn phải: toàn bộ văn bản thẳng hàng với lề phải.
Sau đó, bạn có thể vẽ data frame vừa tạo với hàm ggplot(), định nghĩa trục x và y lần lượt là hjust và vjust:
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6ImhqdXN0dmp1c3QgPC0gZXhwYW5kLmdyaWQoaGp1c3Q9YygwLCAwLjUsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdD1jKDAsIDAuNSwgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlPWMoMCwgNDUsIDkwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIiwic2FtcGxlIjoibGlicmFyeShnZ3Bsb3QyKVxuZ2dwbG90KGhqdXN0dmp1c3QsIGFlcyh4PWhqdXN0LCBcbiAgICAgICAgICAgICAgIHk9dmp1c3QpKSArIFxuICAgIGdlb21fcG9pbnQoKSArXG4gICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD10ZXh0LCBcbiAgICAgICAgICAgICAgICAgIGFuZ2xlPWFuZ2xlLCBcbiAgICAgICAgICAgICAgICAgIGhqdXN0PWhqdXN0LCBcbiAgICAgICAgICAgICAgICAgIHZqdXN0PXZqdXN0KSkgKyBcbiAgICBmYWNldF9ncmlkKH5hbmdsZSkgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9YygwLCAwLjUsIDEpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kPWMoMCwgMC4yKSkgK1xuICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLCAwLjUsIDEpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kPWMoMCwgMC4yKSkifQ==

Cũng lưu ý cách các đối số hjust và vjust được thêm vào geom_text(), hàm chịu trách nhiệm thêm chú thích văn bản vào biểu đồ.

Trong biểu đồ trên, bạn thấy văn bản tại điểm (0,0) được căn trái, cả theo chiều ngang lẫn chiều dọc. Ngược lại, văn bản tại điểm (1,1) được căn phải theo cả hai hướng. Điểm (0.5,0.5) nằm chính giữa: không thực sự căn trái hay căn phải theo cả hai hướng.

Lưu ý rằng khi các đối số này được định nghĩa để thay đổi văn bản trục, căn lề ngang cho văn bản trục được xác định tương quan với toàn bộ biểu đồ, không phải với trục x!
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJsaWJyYXJ5KGdncGxvdDIpXG5kZiA8LSBkYXRhLmZyYW1lKHg9TEVUVEVSU1sxOjNdLFxuICAgICAgICAgICAgICAgICB5PTE6MylcbnAgPC0gZ2dwbG90KGRmLCBhZXMoeCx5KSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgXG4gIHlsYWIoXCJWZXJ5IGxvbmcgbGFiZWwgZm9yIHlcIikgKyBcbiAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChhbmdsZT0wKSlcblxuXG5wMSA8LSBwICsgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChoanVzdD0wKSkgKyB4bGFiKFwiWC1heGlzIGF0IGhqdXN0PTBcIilcbnAyIDwtIHAgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsgeGxhYihcIlgtYXhpcyBhdCBoanVzdD0wLjVcIilcbnAzIDwtIHAgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGhqdXN0PTEpKSArIHhsYWIoXCJYLWF4aXMgYXQgaGp1c3Q9MVwiKVxuXG5saWJyYXJ5KGdyaWRFeHRyYSlcbmdyaWQuYXJyYW5nZShwMSwgcDIsIHAzKSJ9
Ngoài ra, hãy tự thử xem việc đặt đối số vjust để thay đổi văn bản trục sẽ ảnh hưởng thế nào đến cách hiển thị biểu đồ của bạn:
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJsaWJyYXJ5KGdncGxvdDIpXG5kZiA8LSBkYXRhLmZyYW1lKHg9YyhcImFcXG5hXCIsXCJiXCIsXCJjZGVmZ2hpamtcIixcImxcIiksXG4gICAgICAgICAgICAgICAgIHk9MTo0KVxucCA8LSBnZ3Bsb3QoZGYsIGFlcyh4LHkpKSArIGdlb21fcG9pbnQoKVxuXG5wMSA8LSBwICsgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHZqdXN0PTAsIGNvbG91cj1cInJlZFwiKSkgKyBcbiAgICAgICAgeGxhYihcIlgtYXhpcyBsYWJlbHMgYWxpZ25lZCB3aXRoIHZqdXN0PTBcIilcbnAyIDwtIHAgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQodmp1c3Q9MC41LCBjb2xvdXI9XCJyZWRcIikpICsgXG4gICAgICAgIHhsYWIoXCJYLWF4aXMgbGFiZWxzIGFsaWduZWQgd2l0aCB2anVzdD0wLjVcIilcbnAzIDwtIHAgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQodmp1c3Q9MSwgY29sb3VyPVwicmVkXCIpKSArIFxuICAgICAgICB4bGFiKFwiWC1heGlzIGxhYmVscyBhbGlnbmVkIHdpdGggdmp1c3Q9MVwiKVxuXG5cbmxpYnJhcnkoZ3JpZEV4dHJhKVxuZ3JpZC5hcnJhbmdlKHAscDEscDIscDMpIn0=

Để đọc cuộc thảo luận gốc xuất sắc, nơi mã trên được tham khảo, hãy nhấp vào đây.

Lời kết…

Đáng để xem qua bài viết này, liệt kê 10 mẹo để giúp đồ họa R của bạn trông đẹp nhất!

Ngoài ra, nếu bạn muốn biết thêm về trực quan hóa dữ liệu, bạn có thể cân nhắc khóa học tương tác trực quan hóa dữ liệu với ggvis của DataCamp, do Garrett Grolemund, tác giả của Hands on Programming with R và Data Science with R, giảng dạy.

Hoặc có thể bạn sẽ hứng thú với khóa học về báo cáo với R Markdown của chúng tôi!

Chủ đề
R
Khoa học Dữ liệu
Trực quan hóa Dữ liệu

Tìm hiểu thêm về R

Khóa học

Nhập môn trực quan hóa dữ liệu với ggplot2

4 giờ
191.2K
Học cách tạo ra các biểu đồ dữ liệu có ý nghĩa và đẹp mắt bằng ggplot2 thông qua việc nắm vững ngữ pháp đồ họa.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm