2011-03-02 28 views
8

Giả sử chúng tôi có khung dữ liệu đơn giản sau đây của các cặp ngày-giá trị, trong đó một số ngày bị thiếu trong chuỗi (ví dụ: ngày 12 tháng 1 đến ngày 14 tháng 1). Khi tôi vẽ các điểm, nó cho thấy những ngày thiếu này trên trục x, nhưng không có điểm nào tương ứng với những ngày đó. Tôi muốn ngăn những ngày thiếu này hiển thị trong trục x, do đó trình tự điểm không bị ngắt. Có bất cứ đề nghị nào cho việc làm như thế này hả? Cảm ơn!R + ggplot2: cách ẩn các ngày bị thiếu khỏi trục x?

dts <- c(as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16'))) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

enter image description here

Trả lời

8

Xoay dữ liệu ngày vào một yếu tố sau đó. Hiện tại, ggplot đang diễn giải dữ liệu theo nghĩa bạn đã nói với dữ liệu đó - một thang ngày liên tục. Bạn không muốn quy mô đó, bạn muốn có một quy mô phân loại:

require(ggplot2) 
dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

so

df <- data.frame(dt = factor(format(dts, format = '%d%b')), 
        val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

trong đó sản xuất: enter image description here

Là những gì bạn muốn?

+0

@Gavin, nhờ ... nhưng điều đó làm thay đổi số ngày là hiển thị: Tôi đã có 10Jan qua 16Jan, bây giờ chúng tôi nhận được 2Jan qua 5Jan. Bất kỳ cách nào để khắc phục điều đó? Tôi đoán tôi có thể đi với điều trị ngày tháng như là dây, và hoàn toàn mất ngữ nghĩa ngày, nhưng có một cách mà tôi không mất ngữ nghĩa ngày? –

+0

Nhưng đó là những ngày liên tục và không phải là ngày đầu tiên từ câu hỏi gốc. –

+0

Tôi nhận thấy rằng, quên định dạng ngày theo thang đo gốc. Lỗi của tôi - xem Trả lời ngay bây giờ. –

5

Câu hỏi đầu tiên là: tại sao bạn muốn làm điều đó? Không có điểm nào trong việc hiển thị cốt truyện dựa trên tọa độ nếu các trục của bạn không phải là tọa độ. Nếu bạn thực sự muốn làm điều này, bạn có thể chuyển đổi thành một yếu tố. Hãy cẩn thận với thứ tự mặc dù:

dts <- c(as.Date(c('31-10-2011', '01-11-2011', '02-11-2011', 
      '05-11-2011'),format="%d-%m-%Y")) 
dtsf <- format(dts, format= '%d%b') 
df <- data.frame(dt=ordered(dtsf,levels=dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

Với những yếu tố bạn phải cẩn thận, như thứ tự là tùy ý trong một yếu tố, trừ khi bạn thực hiện nó một yếu tố ra lệnh. Vì các yếu tố được sắp xếp theo thứ tự bảng chữ cái theo mặc định, bạn có thể gặp rắc rối với một số định dạng ngày. Vì vậy, hãy cẩn thận những gì bạn làm. Nếu bạn không mất trật tự vào tài khoản, bạn nhận được:

df <- data.frame(dt=factor(dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

+0

Nó khá phổ biến trong chuỗi thời gian tài chính để không có dữ liệu vào cuối tuần, do đó, nó trực quan không tốt đẹp để có phá vỡ trong âm mưu, nơi có những ngày cuối tuần. –

+0

@Prasad: Tôi hiểu rồi. Tôi muốn thêm một cái gì đó như "ngày làm việc" sau đó trên trục X, như bây giờ bạn cung cấp cho ấn tượng của một chức năng liên tục đó là trong thực tế không liên tục trên trục X. Nghe có vẻ như nitpicking, nhưng nó có thể khá khó hiểu. –

+0

+1 điểm tốt về yếu tố đặt hàng –

7

tôi đã thực hiện một gói mà thực hiện điều này. Nó được gọi là bdscale và trên CRANgithub. Shameless plug.

Để tái tạo ví dụ của bạn:

> library(bdscale) 
> library(ggplot2) 
> library(scales) 
> dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=dts, labels=date_format('%d%b')) 

replicate example

Nhưng những gì bạn có thể muốn là để nạp ngày gọi hợp lệ, sau đó âm mưu dữ liệu của bạn bằng cách sử dụng ngày hợp lệ trên trục x:

> nyse <- bdscale::yahoo('SPY') # get valid dates from SPY prices 
> dts <- as.Date('2011-01-10') + 1:10 
> df <- data.frame(dt=dts, val=seq_along(dts)) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=nyse, labels=date_format('%d%b'), max.major.breaks=10) 

Warning message: 
Removed 3 rows containing missing values (geom_point). 

better

cảnh báo cho bạn biết là nó loại bỏ ba ngày:

  • 15 = Thứ bảy
  • 16 = Chủ Nhật
  • 17 = MLK Day
+1

Chỉ cần một chút chỉnh sửa, bạn đã tạo một gói * * thực hiện điều này (không phải thư viện) –

+1

Tôi đã có một _package_ cho bạn ** ngay tại đây **, bạn thân. Aww yiss. Nhưng bạn là chính xác thưa ông, tôi sẽ sửa đổi. – dvmlls

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