Trực quan hóa dữ liệu được sử dụng nhiều nhất [đóng]


178

Biểu đồ và biểu đồ phân tán là phương pháp tuyệt vời để trực quan hóa dữ liệu và mối quan hệ giữa các biến, nhưng gần đây tôi đã tự hỏi về những kỹ thuật trực quan nào tôi đang thiếu. Bạn nghĩ gì về loại cốt truyện được sử dụng nhiều nhất?

Câu trả lời nên:

  1. Không được sử dụng rất phổ biến trong thực tế.
  2. Có thể hiểu được mà không có một cuộc thảo luận lớn.
  3. Được áp dụng trong nhiều tình huống phổ biến.
  4. Bao gồm mã tái sản xuất để tạo một ví dụ (tốt nhất là trong R). Một hình ảnh được liên kết sẽ tốt đẹp.

13
Tôi nghĩ rằng đây là một cuộc thảo luận rất hữu ích và thật buồn khi nó đóng cửa.
Alex Brown

2
@AlexBrown: vậy tại sao không bỏ phiếu để mở lại? Tôi có thể thấy lý do tại sao từ ngữ của câu hỏi này có thể cảm thấy là "không mang tính xây dựng", nhưng câu hỏi này dẫn đến một số câu trả lời sâu sắc và sâu sắc nhất về chủ đề này ở bất cứ đâu trên web. Tôi rất thích xem những câu trả lời được cập nhật và mở rộng.
tối đa

2
Điều này có lẽ nên được chuyển đến stats.stackoverflow.com. Nó phù hợp hơn nhiều với trang web đó.
ness101

4
Đáng tiếc không ai đề cập đến các lô QQ ở đây trước khi điều này bị đóng cửa. Chúng rất hữu ích!
ness101

Điều này nên được mở lại.
Peter Flom

Câu trả lời:


89

Tôi thực sự đồng ý với các áp phích khác: Sách của Tufte rất hay và đáng đọc.

Đầu tiên, tôi sẽ chỉ cho bạn một hướng dẫn rất hay về ggplot2 và ggobi từ "Nhìn vào dữ liệu" vào đầu năm nay. Ngoài ra, tôi chỉ nêu bật một trực quan hóa từ R và hai gói đồ họa (không được sử dụng rộng rãi như đồ họa cơ bản, mạng tinh thể hoặc ggplot):

Bản đồ nhiệt

Tôi thực sự thích trực quan hóa có thể xử lý dữ liệu đa biến, đặc biệt là dữ liệu chuỗi thời gian. Bản đồ nhiệt có thể hữu ích cho việc này. Một cái thực sự gọn gàng đã được David Smith đăng trên blog Revolutions . Đây là mã ggplot lịch sự của Hadley:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

Cuối cùng trông giống như thế này:

văn bản thay thế

RGL: Đồ họa 3D tương tác

Một gói khác rất đáng để nỗ lực học hỏi là RGL , dễ dàng cung cấp khả năng tạo đồ họa 3D tương tác. Có nhiều ví dụ trực tuyến cho việc này (bao gồm trong tài liệu rgl).

R-Wiki có một ví dụ hay về cách vẽ đồ thị phân tán 3D bằng rgl.

GGobi

Một gói khác đáng để biết là rggobi . Có một cuốn sách Springer về chủ đề này , và rất nhiều tài liệu / ví dụ tuyệt vời trực tuyến, bao gồm cả khóa học "Nhìn vào dữ liệu" .


đẹp. Cảm ơn đã bao gồm mã / hình ảnh.
Ian Fellows

những gì được biểu thị bằng vị trí thẳng đứng của 'Z' hoặc uốn cong trong mỗi đường thẳng đứng màu đen?
gấp đôi

Đó là ranh giới tháng (tháng không kết thúc trong cùng một ngày).
Shane

3
Thật là đẹp. Làm thế nào bạn có được ranh giới tháng xảy ra?
Alex Brown


58

Tôi thực sự thích dotplots và tìm thấy khi tôi giới thiệu chúng cho những người khác về các vấn đề dữ liệu phù hợp, họ luôn ngạc nhiên và thích thú. Chúng dường như không được sử dụng nhiều, và tôi không thể hiểu tại sao.

Đây là một ví dụ từ Quick-R: dotplot trên dữ liệu xe hơi

Tôi tin rằng Cleveland chịu trách nhiệm cao nhất cho việc phát triển và ban hành những điều này, và ví dụ trong cuốn sách của anh ấy (trong đó dữ liệu bị lỗi dễ dàng được phát hiện với một dấu chấm) là một lập luận mạnh mẽ cho việc sử dụng chúng. Lưu ý rằng ví dụ trên chỉ đặt một dấu chấm trên mỗi dòng, trong khi sức mạnh thực sự của chúng đi kèm với bạn có nhiều dấu chấm trên mỗi dòng, với một chú thích giải thích đó là cái gì. Chẳng hạn, bạn có thể sử dụng các ký hiệu hoặc màu sắc khác nhau cho ba điểm thời gian khác nhau và từ đó dễ dàng hiểu được các mẫu thời gian trong các danh mục khác nhau.

Trong ví dụ sau (được thực hiện trong Excel của tất cả mọi thứ!), Bạn có thể thấy rõ danh mục nào có thể phải chịu khi hoán đổi nhãn.

Dotplot với 2 nhóm


1
Làm thế nào là một dotplot khác với một biểu đồ phân tán với trục chuyển đổi một trong số đó là phân loại?
DrSAR

4
@DrSAR Làm thế nào là một biểu đồ khác với biểu đồ barchart hoặc biểu đồ mật độ khác với biểu đồ đường? Bạn có thể mô tả nhiều loại biểu đồ tiêu chuẩn theo các dạng hình học cơ bản hơn (cf Bertin Semiologie Graphique ), nhưng điều đó không làm cho cái nhìn sâu sắc để vẽ một cái gì đó đặc biệt ít độc đáo hơn. Trong trường hợp này, bạn đang vẽ hai mẩu thông tin phân loại (một theo chiều dọc, một theo hình dạng của ký tự âm mưu) dựa vào một mẩu dữ liệu liên tục. Mặc dù trong hầu hết các gói phần mềm, bạn sẽ hack một scatterplot để tạo ra nó, nhưng rõ ràng nó không phải là một scatterplot.
Ari B. Friedman

2
@ gsk3 Không có nghĩa là âm thanh lén lút. Trên thực tế, tôi bây giờ (sau khi đọc thêm về ngữ pháp đồ họa và các tác phẩm tương tự) nhận ra rằng sự khác biệt ở cấp độ cao hơn này có thể khá quan trọng để trình bày. Cảm ơn đã cho thấy điều này.
DrSAR

@DrSAR Và tôi không có ý phòng thủ. Bản chất của bình luận SO tôi đoán ;-)
Ari B. Friedman

56

Các lô sử dụng tọa độ cực chắc chắn không được sử dụng - một số sẽ nói với lý do chính đáng. Tôi nghĩ rằng các tình huống biện minh cho việc sử dụng của họ là không phổ biến; Tôi cũng nghĩ rằng khi những tình huống đó phát sinh, các ô cực có thể tiết lộ các mẫu trong dữ liệu mà các ô tuyến tính không thể.

Tôi nghĩ đó là bởi vì đôi khi dữ liệu của bạn vốn là cực chứ không phải tuyến tính - ví dụ: đó là theo chu kỳ (tọa độ x đại diện cho thời gian trong 24 giờ trong nhiều ngày) hoặc dữ liệu trước đây được ánh xạ vào không gian tính năng cực.

Đây là một ví dụ. Biểu đồ này hiển thị lưu lượng truy cập trung bình của một trang web theo giờ. Chú ý hai mũi nhọn lúc 10 giờ tối và lúc 1 giờ sáng. Đối với các kỹ sư mạng của Trang web, những người này rất quan trọng; Điều quan trọng là chúng xảy ra gần nhau (chỉ cách nhau hai giờ). Nhưng nếu bạn vẽ cùng một dữ liệu trên một hệ tọa độ truyền thống, mẫu này sẽ được che giấu hoàn toàn - được vẽ theo tuyến tính, hai gai này sẽ cách nhau 20 giờ, mặc dù chúng chỉ cách nhau hai giờ vào những ngày liên tiếp. Biểu đồ cực ở trên cho thấy điều này theo một cách trực quan và trực quan (một huyền thoại không cần thiết).

Biểu đồ cực hiển thị lưu lượng truy cập trang web, với mức cao nhất vào giờ 1 và 22

Có hai cách (mà tôi biết) để tạo ra các ô như thế này bằng R (Tôi đã tạo cốt truyện ở trên w / R). Một là mã hóa chức năng của chính bạn trong các hệ thống đồ họa cơ sở hoặc lưới. Cách khác, dễ dàng hơn, là sử dụng gói tròn . Hàm bạn sẽ sử dụng là ' rose.diag ':

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)

4
Sao chép mã của bạn, tôi nhận được một âm mưu rất khác (điều đó khá xấu xí); bất cứ ý tưởng tại sao? Tôi nhận được cảnh báo này: 1: Trong as.circular (xx [, 1]): một đối tượng được ép buộc vào lớp 'tròn' bằng cách sử dụng giá trị mặc định cho các thành phần sau: type: 'angle' units: 'radian' template: ' không 'modulo:' asis 'zero: 0 rotation:' counter 'rose.diagdata24 Lưu lượng truy cập trang web hàng ngày theo Hourthree_palettes
datayoda

Tôi có cùng một vấn đề.
bút chì

Bạn có thể làm điều này với một cốt truyện quá. Có thể khó đọc hơn một chút, nhưng cũng có thể thực sự tuyệt vời đối với dữ liệu chi tiết hơn hoặc dữ liệu trải qua nhiều chu kỳ (ví dụ: vẽ mười chu kỳ, sau đó vẽ biểu đồ trung bình của chúng).
ness101

1
Tôi cũng gặp khó khăn khi sao chép cốt truyện. Cuối cùng tôi đã quyết định sử dụng ggplot2 dễ dàng hơn. Tôi đã để lại một bản demo ngắn trên Rpub với mã và kết quả: rpub.com/mattbagg/circular
MattBagg

1
ggplot2 tương đương:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101

54

Nếu âm mưu phân tán của bạn có quá nhiều điểm khiến nó trở thành một mớ hỗn độn, hãy thử một âm mưu phân tán được làm mịn. Đây là một ví dụ:

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

Các hexbingói (được đề xuất bởi @Dirk Eddelbuettel) được sử dụng với mục đích tương tự, nhưng smoothScatter()có ưu điểm là nó thuộc về các graphicsgói, và do đó là một phần của quá trình cài đặt R tiêu chuẩn.

Smiley như một âm mưu phân tán thông thường hoặc được làm mịn


6
Để hoàn thiện, bạn cũng có thể có được hiệu ứng này trong ggplot bằng cách sử dụng độ trong suốt (alpha).), Kết hợp với điểm geom.
Paul Hiemstra

1
điều này giống như ước tính mật độ hạt nhân, hay chỉ tương tự?
endolith

30

Về Sparkline và ý tưởng Tufte khác, YaleToolkit gói trên cran cung cấp các chức năng sparklinesparklines.

Một gói khác hữu ích cho các bộ dữ liệu lớn hơn là hexbin vì nó khéo léo sắp xếp dữ liệu vào các thùng để xử lý các bộ dữ liệu có thể quá lớn đối với các biểu đồ phân tán ngây thơ.


4
+1 cho các biểu đồ thu nhỏ. Tôi hiện đang làm việc trên một gói tập trung vào việc tạo ra tia sáng trong R-- họ thực hiện các bổ sung tuyệt vời cho các bảng trong báo cáo Sweave.
Sharpie

1
Mát mẻ! Tôi không quá hài lòng với những gì Jay có trong YaleToolkit và rất thích có biểu đồ lấp lánh trong bảng!
Dirk Eddelbuettel

Tôi vừa ghi lại một cách để tạo ra các biểu đồ thu nhỏ chỉ sử dụng plottrong bản cập nhật cho câu hỏi của tôi , với một số trợ giúp từ bài đăng trên diễn đàn Tufte
Ben

1
Các Hmisc::latex()phiên bản của đầu ra từ Hmisc::describebao gồm một mini-histogram đó được bao gồm trong bảng.
IRTFM

28

Các ô vĩ cầm (kết hợp các ô hộp với mật độ nhân) tương đối kỳ lạ và khá tuyệt. Các vioplot gói vào R cho phép bạn để làm cho họ khá dễ dàng.

Đây là một ví dụ (Liên kết wikipedia cũng hiển thị một ví dụ):

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


3
Âm mưu violon cũng có sẵn thông qua gói lưới:bwplot(... panel = panel.violin)
David J.

3
phiên bản ggplot2 của âm mưu violin sắp ra mắt. github.com/wch/ggplot2/wiki/geom_violin
Roman Luštrik

Tôi không có âm mưu violin mỏng rất hữu ích, thay vào đó tôi thích hiển thị tất cả các dấu chấm bằng jitter.
Nakx

25

Một hình ảnh chuỗi thời gian đẹp khác mà tôi vừa xem xét là "biểu đồ vết sưng" (như đặc trưng trong bài đăng này trên blog "Learning R" ). Điều này rất hữu ích để hình dung những thay đổi về vị trí theo thời gian.

Bạn có thể đọc về cách tạo nó trên http://learnr.wordpress.com/ , nhưng đây là những gì nó kết thúc giống như:

văn bản thay thế


Tôi thích biểu đồ vết sưng cho dữ liệu cụ thể này, nhưng có một thời gian khó khăn để nghĩ về các tình huống chung hơn mà nó sẽ được sử dụng. Điều đó nói rằng, tôi nghĩ rằng tất cả chúng ta có thể đồng ý rằng blog Learning R làm rung chuyển tất.
Ian Fellows

7
Biểu đồ vết sưng là một biểu đồ tọa độ song song của dữ liệu được xếp hạng.
hadley

1
điều này làm tôi nhớ đến slopegraph, điều này tốt cho việc thay đổi thứ hạng theo thời gian hoặc mối quan hệ giữa các bảng xếp hạng: charliepark.org/slopegraphs
topchef

21

Tôi cũng thích các sửa đổi của Tufte về các ô vuông cho phép bạn so sánh bội số nhỏ dễ dàng hơn nhiều vì chúng rất "mỏng" theo chiều ngang và không làm lộn xộn cốt truyện bằng mực thừa. Tuy nhiên, nó hoạt động tốt nhất với số lượng danh mục khá lớn; nếu bạn chỉ có một vài trong một cốt truyện, các ô vuông (Tukey) thông thường trông đẹp hơn vì chúng có một chút sức mạnh hơn đối với chúng.

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

so sánh

Các cách khác để tạo ra những thứ này (bao gồm cả loại hộp Tufte khác) sẽ được thảo luận trong câu hỏi này .


@daroczig Cảm ơn. Một trong những ngày này tôi sẽ viết lại nó để có các cấu hình khác nhau của các nhóm. Tôi đã học được rất nhiều kể từ khi tôi viết chức năng đó!
Ari B. Friedman

1
Tôi thích cốt truyện của bạn tốt hơn nhiều so với tufte, rất khó đọc. Tôi vẫn nghĩ rằng các ô vuông kiểu Tukey tốt hơn, mặc dù sự thỏa hiệp tốt có thể giống như những gì bạn có ở đây, nhưng với các đường rộng 3px cho hộp, thay vì bù 1px. Và tôi nghĩ rằng một đường horisontal rộng 1px cho trung vị có lẽ gọn gàng hơn, và chính xác hơn.
nè 101

19

Chúng ta không nên quên về cốt truyện thân và lá quan trọng (trong lịch sử) (mà Tufte cũng yêu thích!). Bạn có được một cái nhìn tổng quan trực tiếp về mật độ và hình dạng dữ liệu của bạn (tất nhiên nếu tập dữ liệu của bạn không lớn hơn thì khoảng 200 điểm). Trong R, hàm stemtạo ra sự phân tán giữa thân và lá của bạn (trong không gian làm việc). Tôi thích sử dụng gstemchức năng từ gói fmsb để vẽ nó trực tiếp trong một thiết bị đồ họa. Dưới đây là phương sai nhiệt độ cơ thể hải ly (dữ liệu nên có trong tập dữ liệu mặc định của bạn) trong màn hình gốc:

  require(fmsb)
  gstem(beaver1$temp)

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



15

Ngoài tác phẩm xuất sắc của Tufte, tôi giới thiệu những cuốn sách của William S. Cleveland: Trực quan hóa dữ liệu và các yếu tố của dữ liệu đồ thị . Họ không chỉ xuất sắc, mà tất cả họ đều được thực hiện trong R, và tôi tin rằng mã này có sẵn công khai.


14

Boxplots! Ví dụ từ trợ giúp R:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

Theo tôi đó là cách tiện dụng nhất để xem nhanh dữ liệu hoặc so sánh các bản phân phối. Đối với các bản phân phối phức tạp hơn, có một phần mở rộng được gọi là vioplot.


2
Beanplot có thể được đề cập ở đây cũng jstatsoft.org/v28/c01/papercran.r-project.org/web/packages/beanplot/index.html
Radek

Boxplots không được sử dụng, phải không? Tôi có nghĩa là chắc chắn, trong nhiều biểu đồ thanh giấy được sử dụng cho dữ liệu nên được đóng hộp, nhưng chúng vẫn còn khá phổ biến.
ness101

11

Âm mưu khảm dường như để tôi đáp ứng tất cả bốn tiêu chí được đề cập. Có những ví dụ trong r, dưới khảmplot.


3
Việc triển khai tốt hơn các ô khảm là trong thư viện vcd (tên hàm 'khảm'). Nó có một chữ ký phương thức linh hoạt hơn nhiều và nó được triển khai trong lưới (chứ không phải là hệ thống đồ họa 'cơ sở').
gấp đôi

10

Hãy xem tác phẩm của Edward Tufte và đặc biệt là cuốn sách này

Bạn cũng có thể thử và xem bài thuyết trình du lịch của anh ấy . Nó khá hay và bao gồm một bó bốn cuốn sách của anh ấy. (tôi thề tôi không sở hữu cổ phiếu của nhà xuất bản của mình!)

Nhân tiện, tôi thích kỹ thuật trực quan hóa dữ liệu của anh ấy. Sự ngạc nhiên! Google đã viết nó và đưa nó ra Google Code


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.