2016-04-21 20 views
9

Tôi đang cố gắng sử dụng ggplotly để thêm tương tác vào biểu đồ ggplot của tôi. Tôi đã thử chạy này trong cả hai RStudio và từ dòng lệnh, với kết quả tương tự.ggplotly không hiển thị geom_line đúng

dữ liệu:

library(plotly) 
df1 <- as.data.frame(list('x'=1:100,'y'=1:100,'lw'=abs(rnorm(100)))) 
b <- ggplot(data=df1, aes(x=x,y=y)) + geom_line(size=df1$lw) 

Nếu tôi hiển thị b bình thường, tức là > b, tôi nhận được một âm mưu đúng enter image description here

Tuy nhiên, nếu tôi sau đó nhập ggplotly(), tôi nhận được cốt truyện dưới đây: enter image description here

Sử dụng dữ liệu thực của tôi, kết quả thậm chí còn tồi tệ hơn. Dưới đây là một plot(), đó là chính xác, tiếp theo là ggplotly() enter image description here

enter image description here

Bất kỳ ý tưởng làm thế nào tôi có thể hiển thị này một cách chính xác?

+2

Nó trông giống như một lỗi với tôi. Rất giống với cái này: https://github.com/ropensci/plotly/issues/340. Có thể bạn có thể đăng sự cố hơi khác nhau của mình trong cùng một chuỗi. Bạn có thể thử vẽ sơ đồ dữ liệu thực của mình mà không có kích thước biến không? – takje

+0

Không nên quá khó để viết một cách giải quyết mà rút ra cùng một điều bằng cách sử dụng geom_polygon thay vì geom_line. Điều này có đáp ứng nhu cầu của bạn không? – dww

+0

Điều đó sẽ hiệu quả. Bạn đã nghĩ gì vậy? –

Trả lời

10

Mặc dù điều này được gây ra bởi lỗi (xem nhận xét từ takje), bạn có thể xử lý lỗi này bằng cách xử lý ô của bạn không phải là một dòng có nhiều chiều rộng, nhưng như nhiều đoạn đường, mỗi đoạn có chiều rộng cố định .

Thứ nhất, thiết lập dữ liệu:

library(ggplot2) 
library(plotly) 
set.seed(123) 
df1 <- as.data.frame(list('x'=1:100,'y'=1:100,'lw'=abs(rnorm(100)))) 

Bây giờ chúng ta xây dựng một khung dữ liệu mới có chứa điểm bắt đầu và điểm kết thúc của mỗi đoạn thẳng. I E. Đoạn đường thứ n chuyển từ (x_n, y_n) sang (x_n + 1, y_n + 1). Sự lặp lại () trong đoạn mã sau là vì các điểm trung gian tạo thành điểm cuối của một phân đoạn, và cũng là điểm bắt đầu của một phân đoạn tiếp theo. Những điểm đầu tiên và cuối cùng của toàn bộ không được lặp lại bởi vì họ chỉ xuất hiện trong một đoạn thẳng duy nhất:

x2 <- c(df1$x[1], rep(df1$x[2:(NROW(df1)-1)], each=2), df1$x[NROW(df1)]) 
y2 <- c(df1$y[1], rep(df1$y[2:(NROW(df1)-1)], each=2), df1$y[NROW(df1)]) 
df2 <- data.frame(x2,y2) 

Tiếp theo, chúng ta gọi mỗi người trong số x và y phối hợp với một nhãn segnum, mà đề cập đến đó phân khúc dòng họ đang ở:

df2$segnum <- rep(1:(NROW(df1)-1), each=2) 

và một véc tơ tương ứng với những con số phân đoạn, và chứa độ rộng dòng cho từng phân khúc:

df2$segw <- rep(df1$lw[1:(NROW(df1)-1)], each=2) 

và cốt truyện:

ggplot(data=df2, aes(x=x2,y=y2, colour=segnum)) + geom_line(aes(group = segnum, size=segw)) 

enter image description here

Cũng trong plotly:

ggplotly() 

enter image description here

+0

Dww, tôi thích cách tiếp cận của bạn, ý thức của tôi là sử dụng geom_point (size = df1 $ lw). Vì vậy, mở rộng các điểm dọc theo đường thẳng. Quan tâm để xem giải pháp được chấp nhận cuối cùng là gì. Hãy cẩn thận - cảm ơn bạn đã chia sẻ. – Technophobe01

+0

Rất thông minh. Cảm ơn bạn! –

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