Biểu đồ cho mối quan hệ giữa hai biến số thứ tự


46

Một biểu đồ thích hợp để minh họa mối quan hệ giữa hai biến số thứ tự là gì?

Một vài lựa chọn tôi có thể nghĩ ra:

  1. Phân tán âm mưu với thêm jitter ngẫu nhiên để dừng các điểm ẩn nhau. Rõ ràng là một đồ họa tiêu chuẩn - Minitab gọi đây là "biểu đồ giá trị riêng". Theo tôi, nó có thể gây hiểu nhầm vì nó khuyến khích trực quan một loại nội suy tuyến tính giữa các cấp thứ tự, như thể dữ liệu từ một thang đo khoảng.
  2. Biểu đồ phân tán được điều chỉnh sao cho kích thước (diện tích) của điểm thể hiện tần số của sự kết hợp các mức đó, thay vì vẽ một điểm cho mỗi đơn vị lấy mẫu. Tôi đã thỉnh thoảng nhìn thấy những âm mưu như vậy trong thực tế. Chúng có thể khó đọc, nhưng các điểm nằm trên một mạng cách đều đặn, phần nào vượt qua sự chỉ trích của âm mưu phân tán bị xáo trộn mà nó trực quan "xen kẽ" dữ liệu.
  3. Đặc biệt nếu một trong các biến được coi là phụ thuộc, một ô vuông được nhóm theo các mức của biến độc lập. Có khả năng trông khủng khiếp nếu số cấp độ của biến phụ thuộc không đủ cao (rất "phẳng" với râu ria bị thiếu hoặc các quartile bị sụp đổ thậm chí tệ hơn khiến nhận dạng trực quan của trung vị không thể), nhưng ít nhất thu hút sự chú ý đến trung vị và tứ phân vị thống kê mô tả có liên quan cho một biến số thứ tự.
  4. Bảng giá trị hoặc lưới trống của các ô có bản đồ nhiệt để chỉ ra tần số. Trực quan khác nhau nhưng về mặt khái niệm tương tự như biểu đồ phân tán với vùng điểm hiển thị tần số.

Có những ý tưởng khác, hoặc suy nghĩ về những âm mưu nào là thích hợp hơn? Có bất kỳ lĩnh vực nghiên cứu nào trong đó các lô thứ tự so với thứ tự nhất định được coi là tiêu chuẩn không? (Tôi dường như nhớ lại bản đồ nhiệt tần số đang lan rộng trong bộ gen nhưng nghi ngờ rằng nó thường xuyên hơn cho danh nghĩa so với danh nghĩa.) Gợi ý cho một tài liệu tham khảo tiêu chuẩn tốt cũng sẽ rất được hoan nghênh, tôi đoán điều gì đó từ Agresti.

Nếu bất cứ ai muốn minh họa bằng một âm mưu, mã R cho dữ liệu mẫu không có thật sau đây.

"Tập thể dục quan trọng với bạn như thế nào?" 1 = hoàn toàn không quan trọng, 2 = hơi không quan trọng, 3 = không quan trọng cũng không quan trọng, 4 = hơi quan trọng, 5 = rất quan trọng.

"Bạn có thường xuyên chạy 10 phút hoặc lâu hơn không?" 1 = không bao giờ, 2 = ít hơn một lần mỗi hai tuần, 3 = một lần một hoặc hai tuần, 4 = hai hoặc ba lần mỗi tuần, 5 = bốn lần trở lên mỗi tuần.

Nếu nó là tự nhiên để coi "thường" là một biến phụ thuộc và "tầm quan trọng" là một biến độc lập, nếu một âm mưu phân biệt giữa hai biến.

importance <- rep(1:5, times = c(30, 42, 75, 93, 60))
often <- c(rep(1:5, times = c(15, 07, 04, 03, 01)), #n=30, importance 1
           rep(1:5, times = c(10, 14, 12, 03, 03)), #n=42, importance 2
           rep(1:5, times = c(12, 23, 20, 13, 07)), #n=75, importance 3
           rep(1:5, times = c(16, 14, 20, 30, 13)), #n=93, importance 4
           rep(1:5, times = c(12, 06, 11, 17, 14))) #n=60, importance 5
running.df <- data.frame(importance, often)
cor.test(often, importance, method = "kendall") #positive concordance
plot(running.df) #currently useless

Một câu hỏi liên quan cho các biến liên tục tôi thấy hữu ích, có thể là một điểm khởi đầu hữu ích: các lựa chọn thay thế cho các biểu đồ phân tán khi nghiên cứu mối quan hệ giữa hai biến số là gì?


1
Một cột sống thì sao?
Dimitriy V. Masterov

Một câu hỏi liên quan để hiển thị dữ liệu thứ tự đơn biến trong một số nhóm cũng có thể có liên quan: Hiển thị dữ liệu thông thường - Phương tiện, trung bình và xếp hạng trung bình
Cá bạc

Câu trả lời:


15

Một cột sống (cốt truyện khảm) hoạt động tốt cho dữ liệu mẫu ở đây, nhưng có thể khó đọc hoặc giải thích nếu một số kết hợp các danh mục là hiếm hoặc không tồn tại. Đương nhiên, điều hợp lý và được dự đoán là tần số thấp được biểu thị bằng một ô nhỏ và không có ô nào cả, nhưng khó khăn về tâm lý có thể vẫn còn. Một điều cũng tự nhiên là mọi người thích các cột sống chọn các ví dụ hoạt động tốt cho bài báo hoặc bài thuyết trình của họ, nhưng tôi thường tạo ra các ví dụ quá lộn xộn để sử dụng ở nơi công cộng. Ngược lại, một cột sống không sử dụng tốt không gian có sẵn.

Một số triển khai giả định đồ họa tương tác, để người dùng có thể thẩm vấn từng ô để tìm hiểu thêm về nó.

Một thay thế cũng có thể hoạt động khá tốt là biểu đồ thanh hai chiều (tồn tại nhiều tên khác).

Xem ví dụ tabplottrong http://www.surveydesign.com.au/tipsusergraphs.html

Đối với những dữ liệu này, một âm mưu có thể (được tạo ra bằng tabplotStata, nhưng phải dễ dàng trong bất kỳ phần mềm tử tế nào) là

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

Định dạng có nghĩa là dễ dàng liên kết các thanh riêng lẻ với các mã định danh hàng và cột và bạn có thể chú thích với tần số, tỷ lệ hoặc phần trăm (đừng làm điều đó nếu bạn nghĩ rằng kết quả quá bận rộn, một cách tự nhiên).

Một số khả năng:

  1. Nếu một biến có thể được coi là một phản ứng với biến khác như một yếu tố dự đoán, thì đáng để nghĩ đến việc vẽ nó trên trục tung như bình thường. Ở đây tôi nghĩ về "tầm quan trọng" như đo lường một thái độ, câu hỏi sau đó là liệu nó có ảnh hưởng đến hành vi ("thường xuyên") không. Vấn đề nhân quả thường phức tạp hơn ngay cả đối với những dữ liệu tưởng tượng này, nhưng vấn đề vẫn còn.

  2. Gợi ý số 1 luôn luôn được thổi phồng nếu điều ngược lại hoạt động tốt hơn, có nghĩa là, dễ suy nghĩ và diễn giải hơn.

  3. Sự cố phần trăm hoặc xác suất thường có ý nghĩa. Một âm mưu của tần số thô cũng có thể hữu ích. (Đương nhiên, âm mưu này thiếu tính ưu việt của âm mưu khảm hiển thị cả hai loại thông tin cùng một lúc.)

  4. Tất nhiên, bạn có thể thử các lựa chọn thay thế (phổ biến hơn nhiều) của biểu đồ thanh được nhóm hoặc biểu đồ thanh xếp chồng (hoặc biểu đồ dấu chấm được nhóm khá phổ biến theo nghĩa của WS Cleveland). Trong trường hợp này, tôi không nghĩ họ làm việc tốt, nhưng đôi khi họ làm việc tốt hơn.

  5. Một số có thể muốn tô màu các loại phản ứng khác nhau khác nhau. Tôi không phản đối, và nếu bạn muốn rằng bạn sẽ không phản đối nghiêm túc bằng mọi cách.

Chiến lược lai đồ thị và bảng có thể hữu ích hơn nói chung, hoặc thực sự không phải là những gì bạn muốn. Một lập luận thường được lặp đi lặp lại là việc tách Hình và Bảng chỉ là tác dụng phụ của phát minh in ấn và phân công lao động mà nó tạo ra; một lần nữa nó không cần thiết, giống như các nhà văn bản thảo đã đưa ra minh họa chính xác cách thức và nơi họ thích.


Cảm ơn đã thêm đồ họa. Điều này đặt ra vấn đề về cách kết hợp đồ họa và dữ liệu văn bản - Tôi biết một số người không thích đặt số trên đầu các thanh (vì nó làm cho các thanh có vẻ cao hơn so với thực tế; Tôi không có trích dẫn nào để xử lý Điều này nhưng tôi nghĩ đó là một ý kiến ​​nổi tiếng).
Cá bạc

Mặt khác, việc cố định vị trí của các số dường như tạo ra một trong hai vấn đề: hoặc các số có thể bị chồng lên trên các thanh, làm che khuất chúng hoặc sửa các số ở trên các thanh có thể "ngắt" chúng khỏi các thanh bên dưới đặc biệt. Có một cuộc thảo luận tốt về những vấn đề này ở đâu đó?
Cá bạc

Tôi không nghĩ rằng bạn cần một tài liệu tham khảo; đó là một thái độ chung. Tôi thấy các biến thể khác: (1) đề xuất cụ thể về hiển thị rằng màn hình quá bận rộn, không gọn gàng, v.v. (2) một lời kêu gọi với khái niệm rằng văn bản số là dư thừa vì cùng một thông tin là ẩn (hoặc theo một số thông tin rõ ràng ) trong biểu đồ theo bất kỳ cách nào (3) một thái độ "con trai mặc màu xanh và con gái mặc màu hồng" mà Hình là hình và Bàn là bàn, và nếu không thì cặp đôi sẽ gặp nhau. (3) tấn công tôi như định kiến ​​thuần túy; (2) đúng về nguyên tắc, tuy nhiên các con số có thể giúp ích; (1) phải được suy nghĩ thông qua ví dụ bằng ví dụ.
Nick Cox

Tôi không biết các cuộc thảo luận về sự đánh đổi cụ thể. Để các thanh không được tô màu để các số có thể được đặt bên trong chúng thường là một ý tưởng tốt. Đôi khi các thanh có thể quá nhỏ để điều này luôn luôn được thực hiện.
Nick Cox

30

Đây là một nỗ lực nhanh chóng trên bản đồ nhiệt , tôi đã sử dụng đường viền ô đen để phá vỡ các ô, nhưng có lẽ các ô nên được tách ra nhiều hơn như trong câu trả lời của Glen_b.

Sơ đồ nhiệt

library(ggplot2)
runningcounts.df <- as.data.frame(table(importance, often))
ggplot(runningcounts.df, aes(importance, often)) +
   geom_tile(aes(fill = Freq), colour = "black") +
   scale_fill_gradient(low = "white", high = "steelblue")

Dưới đây là một biểu đồ biến động dựa trên một nhận xét trước đó của Andy W. Khi ông mô tả chúng "về cơ bản chúng chỉ là các biểu đồ tán xạ cho dữ liệu phân loại và kích thước của một điểm được ánh xạ tới số lượng quan sát nằm trong thùng đó." Để tham khảo xem

Wickham, Hadley và Heike Hofmann. 2011. Lô sản phẩm . Giao dịch của IEEE về Trực quan hóa và Đồ họa Máy tính (Proc. Infovis `11) . In trước PDF

âm mưu dao động

theme_nogrid <- function (base_size = 12, base_family = "") {
  theme_bw(base_size = base_size, base_family = base_family) %+replace% 
    theme(panel.grid = element_blank())   
}

ggplot(runningcounts.df, aes(importance, often)) +
  geom_point(aes(size = Freq, color = Freq, stat = "identity", position = "identity"), shape = 15) +
  scale_size_continuous(range = c(3,15)) + 
  scale_color_gradient(low = "white", high = "black") +
  theme_nogrid()

1
" có lẽ các viên gạch nên được phân tách nhiều hơn như trong câu trả lời của Glen_b " - Tôi không chắc nó cần thiết trong trường hợp này, có ít cám dỗ hơn để xem các danh mục liên tục ở đây.
Glen_b

18

Đây là một ví dụ về hình dạng của dữ liệu cột sống. Tôi đã làm điều này trong Stata khá nhanh chóng, nhưng có một thực hiện R . Tôi nghĩ trong R nó chỉ nên:

spineplot(factor(often)~factor(importance))

Spineplot thực sự có vẻ là mặc định nếu bạn đưa ra các biến phân loại R:

plot(factor(often)~factor(importance))

Phân tích phân số của các loại thường được hiển thị cho từng loại quan trọng. Các thanh xếp chồng lên nhau được vẽ với kích thước dọc hiển thị phần thường được đưa ra trong danh mục quan trọng. Kích thước ngang cho thấy phân số trong mỗi loại quan trọng. Do đó, các khu vực của gạch được hình thành đại diện cho tần số, hay nói chung là tổng số, cho mỗi kết hợp chéo quan trọng và thường xuyên.

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


1
Tôi đã thay đổi nó xung quanh.
Dimitriy V. Masterov

1
Trích dẫn Nick Cox (tác giả của cột sống của Stata): Hạn chế đối với hai biến rõ ràng hơn so với thực tế. Các biến tổng hợp có thể được tạo bằng cách kết hợp chéo của hai hoặc nhiều biến phân loại .... Một biến trả lời thường được hiển thị tốt hơn trên trục y. Nếu một biến là nhị phân, thường tốt hơn là vẽ biểu đồ đó trên trục y. Đương nhiên, có thể có một số căng thẳng giữa các đề xuất này.
Dimitriy V. Masterov

3
Tôi đông y vơi nhưng điêu trên. Nhưng lược đồ colo [u] r mặc định của Stata khá tệ cho các biến số thứ tự. Một số lựa chọn thay thế tốt là các sắc thái khác nhau của màu đỏ và / hoặc màu xanh hoặc chỉ là các lựa chọn yscale gr {a | e}.
Nick Cox

3
@Dimitriy Tôi thấy rất lạ khi sử dụng sự pha trộn màu sắc tùy ý trong cùng một tình huống! Tôi không ngụ ý hay suy luận bất cứ điều gì bằng hoặc từ các màu chính xác, tuy nhiên đã được định lượng. Nhưng vấn đề chỉ là một thang màu được kết hợp tốt bởi một chuỗi các màu được phân loại. Có một số sự tùy tiện trong việc tô màu bản đồ nhiệt, và thực sự trong nhiều loại bản đồ chuyên đề.
Nick Cox

2
Tôi không thấy vấn đề với bảng màu được phân loại miễn là màu sắc khác biệt. Tại sao mọi người sẽ bị cám dỗ để nội suy? Tôi không thể thấy một logic cho màu sắc tùy ý. Trình tự cầu vồng có ý nghĩa trong vật lý, nhưng không phải là về cách mọi người cảm nhận màu sắc (ví dụ như màu vàng và màu đỏ quá khác nhau). Tôi có bằng chứng về việc nói chuyện với nhiều sinh viên thông qua các lựa chọn và tôi nói 80% chân thành rằng "Điều đó tốt hơn nhiều" khi họ thấy một trình tự được phân loại tinh tế qua cầu vồng hoặc salad trái cây. Màu xanh lam qua màu xanh nhạt qua màu đỏ nhạt đến màu đỏ hoạt động tốt. Hãy chắc chắn rằng bạn thử điều này trên phụ nữ cũng như đàn ông.
Nick Cox

13

Cách tôi đã làm điều này là một chút sai lầm, nhưng nó có thể được sửa chữa đủ dễ dàng.

Đây là một phiên bản sửa đổi của phương pháp jittering.

Loại bỏ các trục làm giảm sự cám dỗ để giải thích quy mô là liên tục; các hộp vẽ xung quanh các kết hợp bị xáo trộn nhấn mạnh có một cái gì đó giống như "phá vỡ tỷ lệ" - rằng các khoảng không nhất thiết phải bằng nhau

Lý tưởng nhất là các nhãn 1..5 nên được thay thế bằng tên danh mục, nhưng bây giờ tôi sẽ để nó cho trí tưởng tượng; Tôi nghĩ rằng nó truyền đạt ý nghĩa của nó.

 plot(jitter(often)~jitter(importance),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.75,4.75,1),5),rep(seq(0.75,4.75,1),each=5),
       rep(seq(1.25,5.25,1),5),rep(seq(1.25,5.25,1),each=5),
       border=8)

âm mưu xáo trộn


Các sàng lọc có thể có:

i) làm cho các khoảng nghỉ nhỏ hơn (cá nhân tôi thích các khoảng nghỉ lớn hơn thế này, cá nhân) và

ii) cố gắng sử dụng một chuỗi quasirandom để giảm tỷ lệ mẫu rõ ràng trong các hộp. Mặc dù nỗ lực của tôi đã giúp ích phần nào, bạn có thể thấy rằng trong các ô có số điểm nhỏ hơn vẫn có các chuỗi có giao diện tương quan ít nhiều (ví dụ: hộp ở hàng trên cùng, cột thứ 2). Để tránh điều đó, chuỗi bán ngẫu nhiên có thể phải được khởi tạo cho mỗi hộp phụ. (Một cách khác có thể là lấy mẫu Hypercube Latin.) Một khi đã được sắp xếp, điều này có thể được chèn vào một chức năng hoạt động chính xác như jitter.

jitter bán ngẫu nhiên và hộp lớn hơn

library("fOptions")

 hjit <- runif.halton(dim(running.df)[1],2) 
 xjit <- (hjit[,1]-.5)*0.8
 yjit <- (hjit[,2]-.5)*0.8  

 plot(I(often+yjit)~I(importance+xjit),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.55,4.55,1),5),rep(seq(0.55,4.55,1),each=5),
       rep(seq(1.45,5.45,1),5),rep(seq(1.45,5.45,1),each=5),
       border=8)

1
Tôi thích điều này, đối với tôi, sự tách biệt thực sự nhấn mạnh tính chất thứ tự của dữ liệu! Thật không may, mắt người được vẽ tự nhiên theo các mẫu rõ ràng trong sự dao động, ví dụ như "xu hướng đi lên" trong các bảng (4,5) và (5,3). Về mặt "đếm điểm" đối với tôi cảm thấy tự nhiên hơn nhiều so với việc đánh giá tần số theo kích thước điểm. Có các biến thể trong đó các điểm được đặt cách đều nhau, hoặc bị vón cục trong các mẫu thông thường tại các trung tâm, để tránh làm xao lãng "xu hướng jitter"?
Cá bạc

1
@Silverfish, một khái niệm tương tự trong địa lý là bản đồ mật độ chấm. Các nhà địa lý đã tìm thấy một số bằng chứng cho thấy các mẫu hoặc mẫu thông thường lấp đầy một khoảng trắng nhất định (do đó được đặt cách xa nhau sau đó ngẫu nhiên) có xu hướng tạo ra nhận thức chính xác hơn giữa các nhà quan sát.
Andy W

IMO đây là một ý tưởng tốt, nhưng khoảng cách giữa các bảng quá lớn trong ví dụ này nó làm cho việc hình dung bất kỳ xu hướng nào trở nên rất khó khăn. Việc chữa trị còn tồi tệ hơn căn bệnh này (nhưng nó sẽ khá dễ dàng để làm cho các tấm gần nhau hơn nhiều).
Andy W

1
@silverfish jittering bán ngẫu nhiên sẽ là một giải pháp khả thi cho điều đó. Mối quan tâm của bạn là một trong những tôi đã có bản thân mình.
Glen_b

1
Rất đẹp! IMO đây là một lựa chọn tốt hơn so với cột sống trong trường hợp này (các cột sống hoặc khảm sẽ tốt hơn để đánh giá các phân phối có điều kiện cho bất kỳ cặp danh mục nào - biểu đồ dấu chấm bị xáo trộn này dễ dàng hơn để đánh giá xu hướng - tận dụng tính chất thứ tự của dữ liệu và giả sử một số loại quan hệ đơn điệu).
Andy W

7

Sử dụng gói Riverplot R:

  data$importance <- factor(data$importance, 
                            labels = c("not at all important",
                                       "somewhat unimportant",
                                       "neither important nor unimportant",
                                       "somewhat important",
                                       "very important"))
  data$often <- factor(data$often, 
                       labels = c("never",
                                  "less than once per fortnight",
                                  "once every one or two weeks",
                                  "two or three times per week",
                                  "four or more times per week"))

  makeRivPlot <- function(data, var1, var2, ...) {

    require(plyr)
    require(riverplot)
    require(RColorBrewer)

    names1 <- levels(data[, var1])
    names2 <- levels(data[, var2])

    var1 <- as.numeric(data[, var1])
    var2 <- as.numeric(data[, var2])

    edges <- data.frame(var1, var2 + max(var1, na.rm = T))
    edges <- count(edges)

    colnames(edges) <- c("N1", "N2", "Value")

    nodes <- data.frame(ID     = c(1:(max(var1, na.rm = T) +
                                      max(var2, na.rm = T))),
                        x      = c(rep(1, times = max(var1, na.rm = T)),
                                   rep(2, times = max(var2, na.rm = T))),
                        labels = c(names1, names2) ,
                        col    = c(brewer.pal(max(var1, na.rm = T), "Set1"),
                                   brewer.pal(max(var2, na.rm = T), "Set1")),
                        stringsAsFactors = FALSE)

    nodes$col <- paste(nodes$col, 95, sep = "")

    return(makeRiver(nodes, edges))

  }

a <- makeRivPlot(data, "importance", "often")

riverplot(a, srt = 45)

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


1
(+1) Tôi thích ý tưởng sử dụng tọa độ song song cho việc này! Tôi nghĩ rằng việc theo dõi các đường đi qua sơ đồ sẽ dễ dàng hơn và xem các câu trả lời "thường" được phân tách như thế nào, nếu màu sắc chảy từ trái sang phải (một sơ đồ có hiệu quả hiển thị "thường" là biến phụ thuộc và " tầm quan trọng "như là biến giải thích). Trên một số triển khai tương tác của các ô như vậy, bạn có thể nhấp vào một trục để tô màu theo biến đó, điều này rất hữu ích.
Cá bạc

1
Để so sánh, trực quan hóa "bộ song song" của Robert Kosara , được thiết kế cho dữ liệu phân loại, có màu sắc chảy qua sơ đồ.
Cá bạc

6

Một ý tưởng khác mà tôi không nghĩ đến ban đầu là một cái sàng .

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

Kích thước của mỗi viên gạch tỷ lệ thuận với tần suất dự kiến; các hình vuông nhỏ bên trong hình chữ nhật đại diện cho tần số thực tế. Do đó mật độ lớn hơn của các ô vuông biểu thị cao hơn tần số dự kiến ​​(và có màu xanh lam); mật độ hình vuông thấp hơn (màu đỏ) là thấp hơn tần số dự kiến.

Tôi nghĩ rằng tôi thích nó nếu màu đại diện cho kích thước, không chỉ là dấu hiệu của phần dư. Điều này đặc biệt đúng đối với các trường hợp cạnh có tần số dự kiến ​​và quan sát là tương tự nhau và phần dư gần bằng không; một sơ đồ màu đỏ / xanh phân đôi dường như quá tập trung vào những sai lệch nhỏ.

Thực hiện trong R:

library(vcd)
runningcounts.df <- as.data.frame(table(importance, often))
sieve(Freq ~ often + importance, data=runningcounts.df, shade= TRUE)

1
Về sở thích của bạn rằng màu sắc đại diện cho kích thước cũng như dấu hiệu, một khả năng là làm cho màu sắc có màu xám hơn khi sự khác biệt so với dự kiến ​​là tương đối nhỏ.
Glen_b

6

Một biểu đồ thanh mặt trong R. Nó cho thấy sự phân phối "thường" ở mỗi cấp độ "quan trọng" rất rõ ràng. Nhưng nó sẽ không hoạt động tốt như vậy nếu số lượng tối đa đã thay đổi nhiều hơn giữa các mức độ "quan trọng"; Thật dễ dàng để đặt scales="free_y"trong ggplot ( xem tại đây ) để tránh nhiều không gian trống, nhưng hình dạng phân phối sẽ khó nhận ra ở mức độ "quan trọng" tần số thấp vì các thanh sẽ rất nhỏ. Có lẽ trong những tình huống đó tốt hơn là sử dụng tần số tương đối (xác suất có điều kiện) trên trục tung thay thế.

biểu đồ thanh mặt

Nó không "sạch" như các tabplot trong Stata mà Nick Cox liên kết đến, nhưng truyền tải thông tin tương tự.

Mã R:

library(ggplot)
running2.df <- data.frame(often = factor(often, labels = c("never", "less than once per fortnight", "once every one or two weeks", "two or three times per week", "four or more times per week")), importance = factor(importance, labels = c("not at all important", "somewhat unimportant", "neither important nor unimportant", "somewhat important", "very important")))
ggplot(running2.df, aes(often)) + geom_bar() +
  facet_wrap(~ importance, ncol = 1) +
  theme(axis.text.x=element_text(angle = -45, hjust = 0)) +
  theme(axis.title.x = element_blank())
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.