我想创建一个线段或矩形的交互式图形,这样当用户将鼠标悬停在它上面时,每个线段或矩形都会给出不同的信息。我看着htmlwidgets showcase,我认为情节看起来很有希望。 (我对其他与R相关的方法持开放态度。)
下面是一个简单的例子。我可以创建一个提供悬停信息的终点(t1和t2)图。但我希望在用户将鼠标悬停在两个端点之间的空间时出现悬停信息。
我可以使用add_trace()
添加一个线段,但我无法使用悬停工作。如果我添加第二个线段,我会收到一条错误消息:
Error in plot_ly(data = mydat, x = t2, y = y, mode = "markers", hoverinfo = "text", :
requires numeric/complex matrix/vector arguments
我可以使用layout()
添加矩形,但同样,我无法使用鼠标悬停工作。
如果有人建议让悬停参数适用于任何一种方法,我也欢迎有关如何为大量段/矩形编码的建议(不仅仅是这个简单示例中的2) 。
有什么建议吗?
mydat <- data.frame(t1=c(1, 3), t2=c(4, 5), y=c(1, 2), task=c("this", "that"))
library(plotly)
# attempt with one line segment - hover doesn't work
plot_ly(data=mydat, x=t2, y=y, mode="markers",
hoverinfo="text", text=task) %>%
add_trace(data=mydat, x=t1, y=y, mode="markers",
hoverinfo="text", text=task) %>%
add_trace(
x=c(mydat$t1[1], mydat$t2[1]), y=c(mydat$y[1], mydat$y[1]),
mode="lines", hoverinfo="text", text=mydat$task[1])
# attempt with both line segments -
# Error in plot_ly, requires numeric/complex matrix/vector arguments
plot_ly(data=mydat, x=t2, y=y, mode="markers",
hoverinfo="text", text=task) %>%
add_trace(data=mydat, x=t1, y=y, mode="markers",
hoverinfo="text", text=task) %>%
add_trace(
x=c(mydat$t1[1], mydat$t2[1]), y=c(mydat$y[1], mydat$y[1]),
mode="lines", hoverinfo="text", text=mydat$task[1]) %*%
add_trace(
x=c(mydat$t1[2], mydat$t2[2]), y=c(mydat$y[2], mydat$y[2]),
mode="lines", hoverinfo="text", text=mydat$task[2])
# attempt with rectangles - hover doesn't work
plot_ly(data=mydat, x=t2, y=y, mode="markers",
hoverinfo="text", text=task) %>%
add_trace(data=mydat, x=t1, y=y, mode="markers",
hoverinfo="text", text=task) %>%
layout(shapes=list(
list(type="rect", x0=mydat$t1[1], x1=mydat$t2[1], xref="x",
y0=mydat$y[1], y1=mydat$y[1]+0.1, yref="y",
hoverinfo="text", text=mydat$task[1]),
list(type="rect", x0=mydat$t1[2], x1=mydat$t2[2], xref="x",
y0=mydat$y[2], y1=mydat$y[2]+0.1, yref="y",
hoverinfo="text", text=mydat$task[2])
))
答案 0 :(得分:3)
您可以通过在线上放置许多点来沿着一条线悬停信息。您不需要在这些点放置标记,因此图表看起来仍然相同:
NP=100
mydat <- data.frame(t1=seq(1,3,len=NP), t2=seq(4,5,len=NP), y1=rep(1,NP), y2=rep(2,NP))
plot_ly(data=mydat) %>%
add_trace(x=t1, y=y1, mode="lines", hoverinfo="text", text="hello") %>%
add_trace(x=t2, y=y2, mode="lines", hoverinfo="text", text="there")
将其扩展为矩形,我们可以
plot_ly() %>%
add_trace(x=c(seq(1,3,len=NP), rep(3,NP), seq(3,1,len=NP), rep(1,NP)),
y=c(rep(1,NP), seq(1,2,len=NP), rep(2,NP), seq(2,1,len=NP)),
mode="lines", hoverinfo="text", text="A sublime rectangle") %>%
layout(hovermode = 'closest')
或者,如果你想分别标记矩形的每一面
plot_ly() %>%
add_trace(x=c(seq(1,3,len=NP), rep(3,NP), seq(3,1,len=NP), rep(1,NP)),
y=c(rep(1,NP), seq(1,2,len=NP), rep(2,NP), seq(2,1,len=NP)),
mode="lines", hoverinfo="text",
text=c(rep("bottom",NP),rep("right",NP),rep("top",NP),rep("left",NP))) %>%
layout(hovermode = 'closest')
对于对角线:
plot_ly() %>%
add_trace(x=seq(1,3,len=NP), y=seq(1,2,len=NP), mode="lines", hoverinfo="text", text="diagonal") %>%
layout(hovermode = 'closest')
回答你的额外问题&#34;如何为大量的段/矩形进行编码&#34;?你没有指定一个&#34;大数&#34;。但我可以说,在剧情中添加许多单独的痕迹可能会使处理起来相当缓慢。大量痕迹无法忍受的缓慢。解决这个问题的方法是在一个跟踪中添加所有线段。对于某些效果(例如,与组和图例条目分开控制颜色),可能需要添加分隔段的NA值并使用connectgaps=FALSE
中的add_trace
选项(请参阅here和here),但对于这个简单的案例来说,这不是必需的。这是一个最小的例子
line1 <- data.frame(x=seq(3.5,4.5,len=NP), y=rep(2.5,NP), text="hello")
line2 <- data.frame(x=seq(3,3.5,len=NP), y=seq(3,2.5,len=NP), text="mouth")
line3 <- data.frame(x=seq(4.5,5,len=NP), y=seq(2.5,3,len=NP), text="mouth")
line4 <- data.frame(x=rep(4,NP), y=seq(2.75,3.5,len=NP), text="nose")
rect1 <- data.frame(x=c(seq(2,6,len=NP), rep(6,NP), seq(6,2,len=NP), rep(2,NP)),
y=c(rep(2,NP), seq(2,4.5,len=NP), rep(4.5,NP), seq(4.5,2,len=NP)),
text="head")
rect2 <- data.frame(x=c(seq(2.5,3.5,len=NP), rep(3.5,NP), seq(3.5,2.5,len=NP), rep(2.5,NP)),
y=c(rep(3.5,NP), seq(3.5,4,len=NP), rep(4,NP), seq(4,3.5,len=NP)),
text="left eye")
rect3 <- data.frame(x=c(seq(4.5,5.5,len=NP), rep(5.5,NP), seq(5.5,4.5,len=NP), rep(4.5,NP)),
y=c(rep(3.5,NP), seq(3.5,4,len=NP), rep(4,NP), seq(4,3.5,len=NP)),
text="right eye")
trace_dat <- rbind(line1, line2, line3, line4, rect1, rect2, rect3)
plot_ly(data=trace_dat, x=x, y=y, mode="lines", hoverinfo="text", text=text, group = text) %>%
layout(hovermode = 'closest')
答案 1 :(得分:3)
您可以使用 code
if(name.charAt(i)>name.charAt(j))
{
c=name.charAt(i);
name.charAt(i)=name.charAt(j);
name.charAt(j)=c;
}
,它包装了Highcharts.js库。
highcharter
工作得很好,没有额外的代码需要更多的条形码:
# note i'm renaming y to x, since that's how highcharts will treat this dataset
mydat <- data.frame(t1=c(1, 3), t2=c(4, 5), x=c(1, 2), task=c("this", "that"))
library(highcharter)
highchart(hc_opts = list(
chart = list(inverted = 'true')
)) %>%
hc_add_series_df(data = mydat, type = 'columnrange',
group = task,
x = x, low = t1, high = t2)