2012-05-03 43 views
33

Tôi muốn đặt đường viền màu đen xung quanh các điểm trên ô phân tán được điền dựa trên dữ liệu, sử dụng ggplot2. Ngoài ra, tôi muốn tránh có một mục nhập huyền thoại cho biên giới đen vì nó sẽ được trên mỗi điểm. Về cơ bản tôi đang tìm cốt truyện này, nhưng với một đường viền màu đen xung quanh mỗi điểm.Đặt đường viền xung quanh các điểm

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

the plot I want, except it doesn't have borders around the points

Như một phần thưởng, tôi muốn không có một mục chú giải cho các viền đen. thử tốt nhất của tôi 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, colour="black"), size=12) 

Mà cho:

not at all the plot I want

Tôi không hiểu tại sao mà không cho tôi những gì tôi muốn, và tồi tệ hơn (đối với giáo dục của tôi trong ggplot2) Tôi không hiểu tại sao nó dường như không ánh xạ màu tô vào bất cứ thứ gì! Bất kỳ giúp đỡ?

Có lẽ nếu tôi có thể vẽ đường viền và vẽ bản đồ ngay, tôi có thể sử dụng một hack giống như trong hte bộ số liệu cuối cùng here để tắt chú giải.

Trả lời

60

Đó là một chút mơ hồ, nhưng bạn phải sử dụng pch> 20 (tôi nghĩ 21:25 là những hình có liên quan): fill điều khiển chiếc nhẫn colo nội thất (u) và colour kiểm soát đường xung quanh mép.

(g0 <- ggplot(df, aes(x=x, y=y))+geom_point(aes(fill=id), 
     colour="black",pch=21, size=5)) 

cập nhật: với phiên bản ggplot2 gần đây (ví dụ 2.0.0, không biết bao xa lại nó đi) hướng dẫn mặc định là một colourbar. Cần g0 + guides(fill="legend") để có được một huyền thoại với các điểm như trong cốt truyện được hiển thị ở đây. Vỡ mặc định đã thay đổi, quá: để chính xác lặp lại âm mưu này, bạn cần g0 + scale_fill_continuous(guide="legend",breaks=seq(0.2,0.8,by=0.1)) ...

enter image description here

liên quan nhưng không giống hệt nhau: how to create a plot with customized points in R?. Câu trả lời được chấp nhận cho câu hỏi đó sử dụng kỹ thuật phân lớp được hiển thị trong câu trả lời của @ joran, nhưng (IMO) câu trả lời của @jbaums, sử dụng kỹ thuật pch=21, là cấp trên. (Tôi nghĩ shape=21 là một sự thay thế, và có lẽ thậm chí ưa thích, để pch=21.)

PS bạn nên đặt colourngoài ánh xạ (aes bit) nếu bạn muốn thiết lập nó hoàn toàn và không theo giá trị của một số biến ...

+0

Bạn nói đúng, kỹ thuật này tốt hơn. – joran

+0

Cảm ơn Ben. Có cách nào để thay đổi chiều rộng nét vẽ (phác thảo) bằng phương pháp này không? – geotheory

+0

Tôi không thấy một (Tôi đã thử đặt 'width' và' lwd'), xin lỗi. –

21

Câu hỏi thứ nhất là một gimme:

ggplot(df, aes(x=x, y=y)) + 
    geom_point(aes(colour=id), size=12) + 
    geom_point(shape = 1,size = 12,colour = "black") 

Và, ồ, bạn không muốn một huyền thoại thêm. Tôi nghĩ rằng có phải nó thì:

enter image description here

+0

Điều thú vị là hướng dẫn không hiển thị cho điểm geom_point thứ hai - Tôi thực sự không hiểu tại sao, nhưng vì đó là điều tôi muốn dù sao tôi cũng sẽ lo về nó vào một ngày khác –

+0

Oh, tôi hiểu tại sao - bởi vì nó không phải là bên trong một aes() gọi –

+0

@DrewSteen - có vẻ như bạn đã nhận nó, tôi hỏi một câu hỏi tương tự một thời gian trở lại vì nó đã cho tôi một thời gian để con số đó ra quá. Tôi không chắc chắn nếu/những gì sẽ được thực hiện trong ngày bởi sự ra đời của ggplot 0.9: http://stackoverflow.com/questions/4221168/ggplot-legend-issue-w-geom-point-and-geom-text – Chase

4

Tôi đã gặp vấn đề tương tự, nhưng tôi cũng cần một giải pháp cho phép jitter. Đối với điều này, bạn cần phải sử dụng một pch đó là một hình dạng đầy với một biên giới và một chức năng grid.edit từ gói gridExtra.Sử dụng ví dụ của bạn:

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

library(gridExtra) 
grid.edit("geom_point.points", grep = TRUE, gp = gpar(lwd = 3)) 
Các vấn đề liên quan