Kiểm soát độ dày đường viền của điểm trong ggplot


78

Khi sử dụng ggplot, tôi có thể đặt shapethành 21-25 để có được các hình dạng có cài đặt độc lập cho màu bên trong ( fill) và đường viền ( col), như sau:

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(fill=id, size=id), colour="black", shape=21)

nhập mô tả hình ảnh ở đây

Tuy nhiên, tôi không thể tìm ra cách kiểm soát độ dày của đường viền hình dạng, đặt chúng hoàn toàn hoặc như một ánh xạ thẩm mỹ. Tôi lưu ý rằng nếu tôi đặt một lwdgiá trị, nó sẽ ghi đè lên giá trị size:

ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(fill=id, size=id), colour="black", shape=21, lwd=2)

nhập mô tả hình ảnh ở đây

Làm cách nào để kiểm soát độ dày của đường viền?

Câu trả lời:


107

Bắt đầu từ phiên bản 2.0.0 của ggplot2 , có một đối số để kiểm soát độ dày đường viền của điểm. Từ NEWS.mdtệp:

geom_point () có được nét thẩm mỹ kiểm soát chiều rộng đường viền của các hình dạng 21-25 (# 1133, @SeySayux). kích thước và nét vẽ là phụ gia nên một điểm có kích thước = 5 và nét vẽ = 5 sẽ có đường kính là 10mm. (# 1142)

Vì vậy, giải pháp chính xác cho điều này bây giờ là:

df <- data.frame(id=runif(12), x=1:12, y=runif(12))
ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(fill=id, size=id), colour="black", shape=21, stroke = 2)

Đầu ra


1
Bạn có thể thêm đầu ra?
Thomas

3
Để có khả năng tương thích và rõ ràng trong tương lai, sẽ tốt hơn nếu bạn nói "Bắt đầu từ phiên bản x.xx" chứ không phải "phiên bản mới nhất".
Gregor Thomas

Có cách nào để kiểm soát độ dày của nét vẽ dựa trên các biến số không? Điều gì đó dọc theo dòng "scale_stroke_manual"?
Bánh gạo

2
Để trả lời cho nhận xét của riêng tôi ở trên, chúng ta có thể sử dụng scale_discrete_manual. Xem liên kết tại đây: github.com/tidyverse/ggplot2/issues/3507#issuecomment-526212978
Ricecakes

17

Nó có cảm giác hơi khó hiểu nhưng bạn có thể thêm một tập hợp các chấm " nền " với kích thước được đặt thành ánh xạ thẩm mỹ cộng với một số hằng số nhỏ để phóng to đường viền của các chấm. Chơi với hằng số để có được chiều rộng đường viền mong muốn.

Bạn cũng sẽ phải tắt chú giải kích thước để ngăn nó hiển thị chú giải trên biểu đồ ...

ggplot(df, aes(x=x, y=y)) + 
  geom_point(aes(size=id+0.5), colour="black" , show_guide = FALSE )+
  scale_size( guide = "none" )+
  geom_point(aes(fill=id, size=id), colour="black", shape=21)

nhập mô tả hình ảnh ở đây


2
Có lẽ hackey, nhưng Hadley tán thành phương pháp này trên Twitter
Noam Ross

1
@NoamRoss bạn có liên kết cho điều đó không?
Simon O'Hanlon

1

Một giải pháp khác là tạo âm mưu trong R và sau đó xuất nó thành tệp .svg. Sau đó, có thể thay đổi độ rộng dòng bằng phần mềm chỉnh sửa đồ họa vector (ví dụ: Inkscape). Phương pháp này đặc biệt hữu ích khi các điểm dữ liệu trùng nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.