2015-02-17 24 views
6

Tôi đang đọc sách của Hadley Wickham về ggplot, nhưng tôi gặp khó khăn khi vẽ cốt truyện nhất định theo thời gian trong biểu đồ thanh. Đây là dữ liệu mẫu:biểu đồ thanh ggplot cho chuỗi thời gian

dates <- c("20040101","20050101","20060101") 
dates.f <- strptime(dates,format="%Y%m%d") 

m <- rbind(c(0.2,0.5,0.15,0.1,0.05),c(0.5,0.1,0.1,0.2,0.1),c(0.2,0.2,0.2,0.2,0.2)) 
m <- cbind(dates.f,as.data.frame(m)) 

Khung dữ liệu này có ngày đầu tiên và mỗi hàng có trọng số tương ứng. Tôi muốn vẽ trọng số cho mỗi năm trong biểu đồ thanh bằng cách sử dụng đối số "điền".

Tôi có thể vẽ các trọng như thanh sử dụng:

p <- ggplot(m,aes(dates.f)) 
p+geom_bar() 

Tuy nhiên, đây không phải là chính xác những gì tôi muốn. Tôi muốn thấy trong mỗi thanh đóng góp của mỗi trọng lượng. Hơn nữa, tôi không hiểu tại sao tôi có định dạng lạ trên trục x, tức là tại sao có "2004-07" và "2005-07" được hiển thị.

Thanks for the help

Trả lời

3

Hy vọng điều này là những gì bạn đang tìm kiếm:

ggplot2 đòi hỏi dữ liệu trong một định dạng dài.

require(reshape2) 
m_molten <- melt(m, "dates.f") 

Vẽ bản thân được thực hiện bởi

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
    geom_bar(stat="identity") 

enter image description here

Bạn có thể thêm position="dodge" để geom_bar nếu bạn muốn sau đó cạnh nhau.

EDIT

Nếu bạn muốn chỉ nghỉ hàng năm: chuyển đổi m_molten$dates.f cho đến nay.

require(scales) 
m_molten$dates.f <- as.Date(m_molten$dates.f) 

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
    geom_bar(stat="identity") + 
    scale_x_date(labels = date_format("%y"), breaks = date_breaks("year")) 

P.S .: xem http://vita.had.co.nz/papers/tidy-data.pdf cho triết lý dữ liệu gọn gàng của Hadley.

+0

chính xác! cảm ơn nhiều! – math

+0

có thể là một câu hỏi nhỏ: Tôi muốn thay đổi nhãn thông qua 'scale_x_date (lables = date_format ("% y "))'. Điều này đưa ra một lỗi mà nó không thể tìm thấy hàm date_format. Làm thế nào tôi có thể chỉ hiển thị 04, 05,06? – math

+0

xem chỉnh sửa ở trên. – Rentrop

1

Để tạo cốt truyện bạn cần, bạn phải định hình lại dữ liệu của mình từ "rộng" thành "cao". Có nhiều cách để thực hiện việc này, bao gồm hàm reshape() trong cơ sở R (không được khuyến nghị), reshape2tidyr.

Trong gói tidyr bạn có hai chức năng để định lại lại dữ liệu, gather()spread().

Chức năng gather() biến đổi từ rộng thành cao. Trong trường hợp này, bạn phải thu thập các cột của mình V1:V5.

Hãy thử điều này:

library("tidyr") 

tidy_m <- gather(m, var, value, V1:V5) 

ggplot(tidy_m,aes(x = dates.f, y=value, fill=var)) + 
    geom_bar(stat="identity") 

enter image description here

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