2012-11-20 30 views
5

Tôi đang di chuyển ô của tôi thành ggplot. Hầu như có trừ trường hợp này (mã nhận được từ previous question này):Đường tham chiếu parabol trên ggplot

ggplot plot should look like this

#Set the bet sequence and the % lines 
betseq <- 0:700 #0 to 700 bets 
perlin <- 0.05 #Show the +/- 5% lines on the graph 

#Define a function that plots the upper and lower % limit lines 
dralim <- function(stax, endx, perlin) { 
    lines(stax:endx, qnorm(1-perlin)*sqrt((stax:endx)-stax)) 
    lines(stax:endx, qnorm(perlin)*sqrt((stax:endx)-stax)) 
} 

#Build the plot area and draw the vertical dashed lines 
plot(betseq, rep(0, length(betseq)), type="l", ylim=c(-50, 50), main="", xlab="Trial Number", ylab="Cumulative Hits") 
abline(h=0) 
abline(v=35, lty="dashed") #Seg 1 
abline(v=185, lty="dashed") #Seg 2 
abline(v=385, lty="dashed") #Seg 3 
abline(v=485, lty="dashed") #Seg 4 
abline(v=585, lty="dashed") #Seg 5 

#Draw the % limit lines that correspond to the vertical dashed lines by calling the 
#new function dralim. 
dralim(0, 35, perlin) #Seg 1 
dralim(36, 185, perlin) #Seg 2 
dralim(186, 385, perlin) #Seg 3 
dralim(386, 485, perlin) #Seg 4 
dralim(486, 585, perlin) #Seg 5 
dralim(586, 701, perlin) #Seg 6 

tôi có thể hiển thị như thế nào đến nay tôi đã có (không xa):

ggplot(a, aes(x=num,y=s, colour=ss)) +geom_line() +stat_smooth(method="lm", formula="y~poly(x,2)") 

my attempt

Để rõ ràng. Tôi đang vẽ sơ đồ dữ liệu của mình qua các dòng tham chiếu (hình ảnh trên cùng). Hình ảnh dưới cùng cho thấy dữ liệu của tôi và nỗ lực kém của tôi khi nhận được các dòng tham chiếu (rõ ràng là không hoạt động).

Trả lời

3

Những gì bạn đang làm là lắp hình parabola vào dữ liệu của bạn, không vẽ hình parabol được xác định trước đó. Nó không quá khó để thích ứng với những gì bạn đã có để ggplot.

khởi Tương tự như bạn có (mặc dù betseq không thực sự sử dụng bất cứ nơi nào)

#Set the bet sequence and the % lines 
betseq <- 0:700 #0 to 700 bets 
perlin <- 0.05 #Show the +/- 5% lines on the graph 

Không thay vì một chức năng mà thu hút dòng, làm cho một hàm trả về geom_line s (trong danh sách) mà là những gì bạn muốn. Có một ngụ ý aes(x=x, y=y) mà sẽ được đưa ra trong tuyên bố ggplot sau đó, nhưng điều này xác định các điểm dữ liệu mà làm cho parabolas.

#Define a function that plots the upper and lower % limit lines 
dralim <- function(stax, endx, perlin) { 
    c(geom_line(data = data.frame(x=stax:endx, 
           y=qnorm(1-perlin)*sqrt((stax:endx)-stax))), 
    geom_line(data = data.frame(x=stax:endx, 
           y=qnorm(perlin)*sqrt((stax:endx)-stax)))) 
} 

Để lưu lặp lại, xác định vị trí của các đường dọc (edges), mà cũng có thể được sử dụng để xác định điểm cuối bên trái và bên phải của parabol (ranges).

edges <- data.frame(x=c(0, 35, 185, 285, 485, 585, 700)) 
ranges <- data.frame(left = edges$x[-nrow(edges)], 
        right = edges$x[-1] + 1) 

Bây giờ, hãy tạo ggplot. Có một geom_vline để vẽ tất cả các đường thẳng đứng (vì chúng tôi đã xác định các vị trí trong một tập dữ liệu duy nhất). Bước bất thường là lặp qua hàng (chỉ số) của ranges và gọi dralim với các giá trị trái và phải tương ứng (và perlin). Điều này trả về một danh sách các danh sách của geom_lines, nhưng điều đó chỉ có thể được thêm vào một cốt truyện theo cách thông thường và tất cả các dòng được thêm vào. Hai cuộc gọi quy mô cuối cùng chỉ để đặt nhãn và, trong trường hợp của trục y, phạm vi.

ggplot(mapping=aes(x=x, y=y)) + 
    geom_vline(data=edges, aes(xintercept = x), linetype="dashed") + 
    lapply(seq_len(nrow(ranges)), 
     function(r) {dralim(ranges$left[r], ranges$right[r], perlin)}) + 
    scale_y_continuous("Cumulative Hits", lim=c(-50,50)) + 
    scale_x_continuous("Trial Number") 

enter image description here

+0

tôi hiểu con đường của tôi để làm việc đó là sai. Phải bắt đầu từ đâu đó. Của bạn trông khá tốt. Cảm ơn. Sẽ mang nó đi! –

+0

Được rồi. Nhưng làm thế nào để tôi đi về âm mưu dữ liệu của tôi trên đầu trang? –

+0

Không biết định dạng dữ liệu của bạn, nhưng đoán từ những gì bạn đã hiển thị, hãy thêm 'geom_line (dữ liệu = a, aes (x = num, y = s, màu = ss))'. –

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