2014-11-05 19 views
7

Tôi muốn in biểu đồ bong bóng trong R. Vấn đề tôi gặp phải là cả hai trục x và trục y của tôi là rời rạc. Về lý thuyết, điều này có nghĩa là rất nhiều điểm dữ liệu (bong bóng) kết thúc trên cùng một tọa độ. Tôi thà có chúng rải rác xung quanh điểm dữ liệu, nhưng vẫn nằm trong góc phần tư làm cho bong bóng rõ ràng thuộc về tọa độ x/y tương ứng.Biểu đồ bong bóng với ggplot2

Tôi nghĩ điều đó được thể hiện rõ nhất bằng một ví dụ nhỏ. Mã sau đây sẽ làm nổi bật vấn đề:

# Example 
require(ggplot2) 
zz <- textConnection("Row PowerSource ProductSegment Price Model ManufacturingLocation Quantity 
1 High SegmentA Low ModA LocationA 5000 
2 Low SegmentB Low ModB LocationB 25000 
3 High SegmentC Low ModC LocationC 15000 
4 Low SegmentD High ModD LocationD 30000 
5 High SegmentE High ModE LocationA 2500 
6 Low SegmentA Low ModF LocationB 110000 
7 High SegmentB Low ModG LocationC 20000 
8 Low SegmentC Low ModH LocationD 3500 
9 High SegmentD Low ModI LocationA 65500 
10 Low SegmentE Low ModJ LocationB 145000 
11 High SegmentA Low ModK LocationC 15000 
12 Low SegmentB Low ModL LocationD 5000 
13 High SegmentC Low ModM LocationA 26000 
14 Low SegmentD Low ModN LocationB 14000 
15 High SegmentE Mid ModO LocationC 75000 
16 Low SegmentA High ModP LocationD 33000 
17 High SegmentB Low ModQ LocationA 14000 
18 Low SegmentC Mid ModR LocationB 33000 
19 High SegmentD High ModS LocationC 95000 
20 Low SegmentE Low ModT LocationD 4000 
") 
df2 <- read.table(zz, header= TRUE) 
close(zz) 
df2 


ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_point(aes(size = Quantity, colour = Price)) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

Làm cách nào để phân tán bong bóng một chút để hiển thị các sản phẩm khác nhau trong từng danh mục và số lượng của chúng?

(Xin lỗi, tôi không thể thêm hình ảnh vào lúc này vì quá ít danh tiếng)

enter image description here

+0

Ghi chú cuối cùng của bạn: thêm liên kết tới hình ảnh vào bài đăng, một người có đủ đại diện sẽ thay thế hình ảnh đó bằng hình ảnh thực tế. – tonytonov

+0

Có thể bạn có thể sử dụng geom_jitter (...) thay vì geom_point và cũng có thể sử dụng tham số alpha để thêm độ trong suốt do chồng chéo. –

Trả lời

14

Như Tom Martens đã chỉ ra điều chỉnh alpha có thể hiển thị bất kỳ chồng chéo. Mức alpha sau:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_point(aes(size = Quantity, colour = Price, alpha=.02)) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

kết quả trong:

enter image description here

Sử dụng geom_jitter thay vì điểm, kết hợp với alpha:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_jitter(aes(size = Quantity, colour = Price, alpha=.02)) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

sản xuất này:

enter image description here

EDIT: Để tránh các vật phẩm trong truyền thuyết alpha nên được đặt bên ngoài aes:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_point(aes(size = Quantity, colour = Price),alpha=.2) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

kết quả là:

enter image description here

và:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_jitter(aes(size = Quantity, colour = Price),alpha=.2) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

dẫn đến:

enter image description here

CHỈNH SỬA 2: Vì vậy, việc này mất một lúc để tìm ra.

Tôi đã làm theo ví dụ tôi đã liên kết trong nhận xét của tôi. Tôi đã điều chỉnh mã cho phù hợp với nhu cầu của bạn. Trước hết tôi tạo ra các giá trị jitter bên ngoài của cốt truyện:

df2$JitCoOr <- jitter(as.numeric(factor(df2$ManufacturingLocation))) 
df2$JitCoOrPow <- jitter(as.numeric(factor(df2$PowerSource))) 

sau đó tôi gọi là những giá trị đó vào geom_point và geom_text x và y phối aes bên trong. Điều này làm việc bằng cách jittering các bong bóng và phù hợp với nhãn cho họ. Tuy nhiên nó đã làm sai lệch các nhãn trục x và y vì vậy tôi đã kích hoạt chúng như có thể thấy trong scale_x_discrete và scale_y_discrete.Đây là mã cốt truyện:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource)) + 
geom_point(data=df2,aes(x=JitCoOr, y=JitCoOrPow,size = Quantity, colour = Price), alpha=.5)+ 
geom_text(data=df2,aes(x=JitCoOr, y=JitCoOrPow,label=Model)) + 
scale_size(range = c(1,50)) + 
scale_y_discrete(breaks =1:3 , labels=c("Low","High"," "), limits = c(1, 2))+ 
scale_x_discrete(breaks =1:4 , labels=c("Location A","Location B","Location C","Location D"), limits = c(1,2,3,4))+ 
theme_bw() 

Mà cho sản lượng này:

enter image description here

Bạn có thể điều chỉnh kích thước của các bong bóng qua scale_size trên. Tôi đã xuất hình ảnh này với kích thước 1000 * 800.

Về yêu cầu thêm đường viền của bạn, tôi nghĩ điều đó là không cần thiết. Nó rất rõ ràng trong cốt truyện này, nơi các bong bóng thuộc về & Tôi nghĩ rằng biên giới sẽ làm cho nó trông hơi xấu xí. Tuy nhiên, nếu bạn vẫn muốn biên giới tôi sẽ có một cái nhìn và xem những gì tôi có thể làm.

+0

Điều đó gần như hoàn hảo. Bạn cũng biết cách lấy nhãn bên cạnh bong bóng tương ứng? Ngoài ra, đề xuất sử dụng geom_jitter là hoàn toàn tuyệt vời. Chính xác những gì cần thiết. Tuy nhiên, bây giờ mà các bong bóng cuối cùng đã làm những gì họ có nghĩa vụ phải, làm thế nào tôi có thể phân biệt các góc phần tư khác nhau? Có cách nào để vẽ một hình chữ nhật (hoặc như vậy) xung quanh LocationA/cao, LocationB/cao và vv và vv? +1 và được chấp nhận nếu vấn đề về nhãn được sắp xếp! – Roman

+0

Sẽ cấp cho +1 ngay khi tôi có 15 danh tiếng. Xin lỗi. – Roman

+0

Tôi không có thời gian để giải quyết điều đó nhưng một cái gì đó như: geom_text (hjust = 1, size = 3, position = position_jitter()) sẽ dừng lables chồng lên nhau nhưng tôi nghi ngờ chúng sẽ không khớp với bong bóng. Kiểm tra ở đây để biết cách giải quyết vấn đề đó: http://stackoverflow.com/questions/6551147/adding-text-to-ggplot-geom-jitter-points-that-match-a-condition Tôi sẽ có nhìn lại vào ngày mai. – Docconcoct

Các vấn đề liên quan