Xếp chồng biểu đồ với ggplot2 trong R


124

Tôi chưa quen với R và đang cố gắng vẽ 3 biểu đồ trên cùng một biểu đồ. Mọi thứ đều hoạt động tốt, nhưng vấn đề của tôi là bạn không thấy 2 biểu đồ trùng nhau - trông chúng bị cắt đứt.

Khi tôi tạo các ô mật độ, nó trông thật hoàn hảo: mỗi đường cong được bao quanh bởi một đường khung màu đen và màu sắc trông khác nhau khi các đường cong chồng lên nhau.

Ai đó có thể cho tôi biết nếu một cái gì đó tương tự có thể đạt được với biểu đồ trong hình thứ 1? Đây là mã tôi đang sử dụng:

lowf0 <-read.csv (....)
mediumf0 <-read.csv (....)
highf0 <-read.csv(....)
lowf0$utt<-'low f0'
mediumf0$utt<-'medium f0'
highf0$utt<-'high f0'
histogram<-rbind(lowf0,mediumf0,highf0)
ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

3
Các siêu liên kết đến biểu đồ và biểu đồ mật độ bị phá vỡ
Daghan ---

Câu trả lời:


115

Mã hiện tại của bạn:

ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

đang nói ggplotđể xây dựng một biểu đồ bằng cách sử dụng tất cả các giá trị trong f0và sau đó tô màu các thanh của biểu đồ đơn này theo biến utt.

Thay vào đó, những gì bạn muốn là tạo ra ba biểu đồ riêng biệt, với sự pha trộn alpha để chúng có thể nhìn thấy được qua nhau. Vì vậy, bạn có thể muốn sử dụng ba cuộc gọi riêng biệt geom_histogram, trong đó mỗi cuộc gọi sẽ nhận khung dữ liệu riêng và điền vào:

ggplot(histogram, aes(f0)) + 
    geom_histogram(data = lowf0, fill = "red", alpha = 0.2) + 
    geom_histogram(data = mediumf0, fill = "blue", alpha = 0.2) +
    geom_histogram(data = highf0, fill = "green", alpha = 0.2) +

Đây là một ví dụ cụ thể với một số đầu ra:

dat <- data.frame(xx = c(runif(100,20,50),runif(100,40,80),runif(100,0,30)),yy = rep(letters[1:3],each = 100))

ggplot(dat,aes(x=xx)) + 
    geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'b'),fill = "blue", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'c'),fill = "green", alpha = 0.2)

sản xuất một cái gì đó như thế này:

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

Chỉnh sửa để sửa lỗi chính tả; bạn muốn điền, không phải màu sắc.


7
Điều này không hoạt động khi tập hợp con có kích thước khác nhau. Bất cứ ý tưởng làm thế nào địa chỉ này? (Ví dụ: sử dụng dữ liệu với 100 điểm trên "a", 50 trên "b").
Jorge Leitao

3
Một nhược điểm của phương pháp này là tôi gặp khó khăn khi hiển thị một huyền thoại (mặc dù điều này có thể là do tôi thiếu kiến ​​thức). Câu trả lời khác dưới đây của @kohske theo mặc định sẽ hiển thị một chú giải có thể được sửa đổi (cùng với các màu cụ thể được hiển thị trên biểu đồ), vd scale_fill_manual().
Michael Ohlrogge

1
chính xác, làm thế nào chúng ta có thể thêm huyền thoại này?
shenglih

1
@shenglih Đối với một huyền thoại, câu trả lời của kohske dưới đây là tốt hơn. Câu trả lời của ông nói chung cũng tốt hơn.
Joran

Không có nguồn gốc từ đâu?
Alan

256

Sử dụng dữ liệu mẫu của @ joran,

ggplot(dat, aes(x=xx, fill=yy)) + geom_histogram(alpha=0.2, position="identity")

lưu ý rằng vị trí mặc định geom_histogramlà "stack."

xem "điều chỉnh vị trí" của trang này:

docs.ggplot2.org/c Hiện / geom_histogram.html


30
Tôi nghĩ rằng đây phải là câu trả lời hàng đầu vì nó tránh được việc lặp lại mã
vào

6
position = 'identity'không chỉ là một câu trả lời dễ đọc hơn, nó còn độc đáo hơn với các âm mưu phức tạp hơn, chẳng hạn như các cuộc gọi hỗn hợp đến aes()aes_string().
rensa

2
Câu trả lời này cũng sẽ tự động hiển thị một chú giải cho các màu sắc, trong khi câu trả lời của @joran sẽ không. Truyền thuyết sau đó có thể được sửa đổi bằng cách sử dụng, ví dụ scale_fill_manual(). Chức năng này cũng có thể được sử dụng để sửa đổi màu sắc trong biểu đồ.
Michael Ohlrogge

4
Ngoài ra, hãy chắc chắn rằng biến được sử dụng filllà một yếu tố.
hhh

9
Cá nhân tôi nghĩ stackoverflow nên liệt kê câu trả lời được nâng cao nhất trước tiên. "Câu trả lời đúng" chỉ đại diện cho ý kiến ​​của một người.
daknowles

25

Mặc dù chỉ có một vài dòng được yêu cầu để vẽ biểu đồ nhiều / chồng chéo trong ggplot2, nhưng kết quả không phải lúc nào cũng thỏa đáng. Cần phải sử dụng đúng các đường viền và tô màu để đảm bảo mắt có thể phân biệt giữa các biểu đồ .

Các chức năng sau đây cân bằng màu sắc đường viền, độ mờ và các ô mật độ chồng lên nhau để cho phép người xem phân biệt giữa các bản phân phối .

Biểu đồ đơn :

plot_histogram <- function(df, feature) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)))) +
    geom_histogram(aes(y = ..density..), alpha=0.7, fill="#33AADE", color="black") +
    geom_density(alpha=0.3, fill="red") +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    print(plt)
}

Nhiều biểu đồ :

plot_multi_histogram <- function(df, feature, label_column) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)), fill=eval(parse(text=label_column)))) +
    geom_histogram(alpha=0.7, position="identity", aes(y = ..density..), color="black") +
    geom_density(alpha=0.7) +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    plt + guides(fill=guide_legend(title=label_column))
}

Cách sử dụng :

Chỉ cần chuyển khung dữ liệu của bạn vào các hàm trên cùng với các đối số mong muốn:

plot_histogram(iris, 'Sepal.Width')

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

plot_multi_histogram(iris, 'Sepal.Width', 'Species')

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

Các tham số phụ trong plot_multi_histogram là tên của cột chứa nhãn danh mục.

Chúng ta có thể thấy điều này rõ rệt hơn bằng cách tạo một khung dữ liệu với nhiều phương tiện phân phối khác nhau :

a <-data.frame(n=rnorm(1000, mean = 1), category=rep('A', 1000))
b <-data.frame(n=rnorm(1000, mean = 2), category=rep('B', 1000))
c <-data.frame(n=rnorm(1000, mean = 3), category=rep('C', 1000))
d <-data.frame(n=rnorm(1000, mean = 4), category=rep('D', 1000))
e <-data.frame(n=rnorm(1000, mean = 5), category=rep('E', 1000))
f <-data.frame(n=rnorm(1000, mean = 6), category=rep('F', 1000))
many_distros <- do.call('rbind', list(a,b,c,d,e,f))

Truyền khung dữ liệu như trước (và mở rộng biểu đồ bằng các tùy chọn):

options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, 'n', 'category')

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


1
Điều này rất hữu ích, hy vọng sẽ được chú ý nhiều hơn.
Edward Tyler

2
@EdwardTyler Rất đúng. Tôi ước tôi có thể nâng cao điều này hơn một lần!
ayePete
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.