2016-04-21 43 views
9

我想用ggplotly为我的ggplot图表添加交互性。我已经试过在RStudio和命令行中运行这个,结果相同。ggplotly无法正确显示geom_line

数据:

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) 

如果我显示b正常,即> b,我得到一个正确的阴谋 enter image description here

但是,如果我再进入ggplotly(),我得到下面的情节: enter image description here

使用我的真实数据,结果更糟。下面是一个plot(),这是正确的,其次是ggplotly() enter image description here

enter image description here

任何想法,我怎么能正确显示呢?

+2

它看起来像我的错误。非常类似于这个:https://github.com/ropensci/plotly/issues/340。也许你可以在同一个线程中发布你的稍微不同的问题。你可以尝试绘制没有变量大小的真实数据吗? – takje

+0

使用geom_polygon而不是geom_line绘制相同的东西的解决方法应该不会太难。这会满足您的需求吗? – dww

+0

这应该工作。你有什么想法? –

回答

10

尽管这是由于一个bugly(见takje的评论)引起的,您可以通过将您的绘图不是作为具有多个宽度的单一线条来处理此错误,而是将具有固定宽度的多个线段。

首先,设置数据:

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

现在我们构建一个包含每个线段的起点和终点新的数据帧。即第n条线段从(x_n,y_n)变为(x_n + 1,y_n + 1)。以下代码中的重复()是因为中间点形成一个段的端点,也是下一个段的起点。整套的第一个和最后一个点,因为它们只出现在一个单一的线段不重复:

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) 

接下来,我们标注每个X,并用segnum标记y坐标,该指线段它们在:

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

和对应于这些段号,以及包含每个段的线宽度的另一种载体:

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

和情节:

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

enter image description here

在plotly

另外:

ggplotly() 

enter image description here

+0

Dww,我喜欢你的方法,我的感觉是使用geom_point(size = df1 $ lw)。因此,按比例缩放点。有兴趣了解最终接受的解决方案是什么。保重 - 感谢分享。 – Technophobe01

+0

非常聪明。谢谢! –