2012-05-08 37 views
14

Tôi đang cố gắng vẽ một âm mưu với một số đường cong trong đó. Trục x không phải là giá trị số, mà là Chuỗi.ggplot với các chuỗi trên trục x

này hoạt động tốt (như trong how to plot all the columns of a data frame in R):

require(ggplot2) 
df_ok <- rbind(data.frame(x=4:1,y=rnorm(4),d="d1"),data.frame(x=3:1,y=rnorm(3),d="d2")) 
ggplot(df_ok, aes(x,y)) + geom_line(aes(colour=d)) 

Nhưng dữ liệu của tôi trông như thế này:

require(ggplot2) 
df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 
ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d)) 

tôi nhận được geom_path lỗi : Mỗi nhóm bao gồm chỉ có một quan sát. Bạn có cần phải điều chỉnh thẩm mỹ nhóm?. Mặc dù các đường đồ thị không xuất hiện, trục được vẽ và trục x chứa đúng Nhãn - nhưng cũng có trong thứ tự sai.

Bất kỳ ý tưởng nào để vẽ đồ thị này dễ dàng nhất có thể? (Cũng lưu ý các giá trị x thiếu cho một số chuỗi).

Trả lời

18

Vấn đề của bạn là biến x là một yếu tố. Vì vậy, thay đổi khung dữ liệu của bạn và làm cho x một kép:

df = rbind(data.frame(x=4:1,y=rnorm(4),d="d1"), 
      data.frame(x=3:1,y=rnorm(3),d="d2")) 

Lô như bình thường

g = ggplot(df, aes(x,y)) + geom_line(aes(colour=d)) 

nhưng làm thay đổi trục x rộng một cách rõ ràng:

g + scale_x_continuous(breaks=1:4, labels=c("one", "two", "three", "four")) 

Để đổi tên biến của bạn, hãy thử một cái gì đó như:

x1 = factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
df$x1 = as.numeric(x1) 
+0

Tôi rất muốn không phải định hình lại dữ liệu của mình. Nhưng nếu không ai khác có ý tưởng, tôi sẽ chấp nhận câu trả lời này. – fabb

+1

Bạn có một ý tưởng làm thế nào tôi có thể dễ dàng định hình lại dữ liệu của tôi để hình thức này khi tôi đã có 'df_nok' và một thứ tự muốn của' x'? – fabb

+0

tôi sẽ upvote bạn mười nếu tôi có thể. phải nhớ 'as.is = TRUE' khá nhiều lần! Đã xảy ra sự cố vấn đề thứ hai do ngày tháng là ký tự sau khi đặt 'as.is = TRUE' nhưng đã được giải quyết dễ dàng bằng' as.Date() '. – ricardo

5

Bạn có thể thuyết phục ggplot để vẽ đường bằng cách thêm một nhóm giả,

ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d, group=d)) 

Xem thêm http://kohske.wordpress.com/2010/12/27/faq-geom_line-doesnt-draw-lines/

+1

Điều này không hoạt động chính xác. Nó vẽ một đường với các đoạn màu, nhưng không phải 2 đường riêng biệt. – fabb

+0

Nó phải là 'nhóm = d', không phải' nhóm = 1'. –

+0

Công cụ tuyệt vời! Bây giờ chỉ có trật tự là sai nữa ("bốn", "một", "ba", "hai"). Bất kỳ trợ giúp nhanh chóng cho điều đó? – fabb

3

Thêm vào các chi tiết group thẩm mỹ (loại dư thừa, tôi biết, nhưng đơn giản hơn nhiều so với việc sửa lại các nhãn trục).

df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2")) 

ggplot(df_nok, aes(x,y, group=d)) + geom_line(aes(colour=d)) 

Đúng là trục x của bạn vẫn có thể không theo thứ tự bạn muốn. Như đã lưu ý bởi @csgillespie, bạn có thể khắc phục điều này bằng cách biến nó thành một yếu tố

df_nok$x <- factor(df_nok$x, 
      levels=c("one", "two", "three", "four"), 
      labels=1:4) 
+0

Tốt hơn một năm muộn hơn bao giờ hết, phải không? Dù sao thì, điều này sẽ dành cho những người như tôi, những người vấp ngã điều này trong tương lai. – Tom

+0

Phải, cảm ơn câu trả lời bổ sung. – fabb

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