我正在尝试使用ggplotly为我的ggplot图表添加交互性。我试过在RStudio和命令行中运行它,结果相同。
数据:
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)
使用我的真实数据,结果更糟。以下是plot()
,这是正确的,后跟ggplotly()
知道如何正确显示这个吗?
答案 0 :(得分:11)
虽然这是由于故事中的错误引起的(请参阅来自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)。以下代码中的重复(rep)是因为中间点形成一个段的端点,也是下一个段的起点。整个集合的第一个和最后一个点不会重复,因为它们只出现在一个线段中:
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)
接下来,我们用segnum标签标记每个x和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))
同样在剧情中:
ggplotly()