2012-06-19 16 views
7

Tôi có một số mã ggplot hoạt động tốt trong 0.8.9 nhưng không phải trong 0.9.1.geom_vline với Ký tự xintercept

Tôi sẽ vẽ dữ liệu trong theDF và muốn vẽ một đường thẳng đứng tại xintercept="2010 Q1."theGrid chỉ được sử dụng để tạo theDF.

theGrid <- expand.grid(2009:2011, 1:4) 
theDF <- data.frame(YrQtr=sprintf("%s Q%s", theGrid$Var1, theGrid$Var2), 
        Minutes=c(1000, 2200, 1450, 1825, 1970, 1770, 1640, 1920, 1790, 1800, 1750, 1600)) 

Mã được sử dụng là:

g <- ggplot(theDF, aes(x=YrQtr, y=Minutes)) + 
     geom_point() + 
     opts(axis.text.x=theme_text(angle=90)) 

g + geom_vline(data=data.frame(Vert="2010 Q2"), aes(xintercept=Vert)) 

Một lần nữa, điều này làm việc tốt trong R 2.13.2 với ggplot2 0.8.9, nhưng không vào R 2.14+ với ggplot2 0.9.1.

Một cách giải quyết là:

g + geom_vline(data=data.frame(Vert=4), aes(xintercept=Vert)) 

Nhưng đó không phải là một giải pháp tốt cho vấn đề của tôi.

Có thể gây rối với scale_x_discrete có thể hữu ích?

+0

Điều này không thể tái sản xuất nếu không có 'theVerts' (mà tôi cho là khung dữ liệu?). – joran

+0

@joran Tôi tình cờ có 'data =' trong 'aes'. Bây giờ nó đã được sửa, theVerts đã được thay thế bằng 'data.frame (Vert =" 2010 Q2 ")'. – Jared

+0

Điều này trông giống như một lỗi. Bạn có thể gửi một vấn đề tại: https://github.com/hadley/ggplot2/issues – wch

Trả lời

0

Khi bạn sử dụng vectơ ký tự hoặc hệ số, đối với trục x trong ô, giá trị mặc định cho từng mục duy nhất chỉ đơn giản là số nguyên bắt đầu từ 1. Vì vậy, nếu các cấp của bạn là c ("A "" B "," C ") thì vị trí trục x là c (1,2,3). Không có những thứ như một vị trí ký tự, chỉ là một nhãn nhân vật. Nếu bạn muốn một đường thẳng đứng tại A sau đó đặt nó tại 1. Nếu bạn muốn nó một nửa cách giữa A và B sau đó đặt nó 1.5. Một lần nữa, đó là những giá trị mặc định. Nếu một cốt truyện cụ thể đã làm một cái gì đó khác bạn có thể dễ dàng làm việc đó bằng cách đặt các dòng tại một vài địa điểm và nhìn thấy những gì sẽ xảy ra.

+0

Có, đó là trường hợp. Nhưng trong phiên bản cũ của 'ggplot2' nếu bạn cho nó" A ", nó sẽ dịch nó thành 1 và đặt dòng chính xác. Hành vi này là mong muốn bởi vì người dùng sẽ biết quy mô ban đầu, không nhất thiết là những gì nó dịch. Tôi hy vọng sẽ tạo lại hành vi 'ggplot2' được sử dụng để trưng bày. – Jared

12

Bạn có thể thử này:

g + geom_vline(aes(xintercept = which(levels(YrQtr) %in% '2010 Q1'))) 

này tránh sự cần thiết để tạo ra một khung dữ liệu giả cho mức độ yếu tố lựa chọn. Lệnh which() trả về chỉ mục (hoặc các chỉ mục nếu phía bên phải của toán tử% in% là một vectơ) của các mức hệ số để liên kết với vlines.

Một cảnh báo với điều này là nếu một số danh mục không xuất hiện trong dữ liệu của bạn và bạn sử dụng drop = TRUE ở quy mô, thì các dòng sẽ không hiển thị ở đúng vị trí.

+0

Cách tiếp cận thú vị. Tôi sẽ kiểm tra để đảm bảo rằng có thể khái quát được với các loại dữ liệu khác. – Jared

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