ggvis - 添加多个数据的图例并将图例位置放在图内

3
我在尝试使用来自不同数据框的数据向ggvis绘图中添加任意文本的图例。我尝试使用add_legend()函数,但我不知道要使用哪些参数。使用plot()函数非常简单,可以使用legend()函数,但是很难找到一种使用ggvis()函数实现这一点的方法。
以下是一个使用plot()函数的简单示例:
df1 = data.frame(x = sample(1:10), y = sample(1:10))
df2 = data.frame(x = 1:10, y = 1:10)
df3 = data.frame(x = 1:10, y = sqrt(1:10))

plot(df1)
lines(df2$x, df2$y, col = "red")
lines(df3$x, df3$y, col = "green")
legend("topleft", c("Data 2","Data 3"), lty = 1, col = c("red","green"))

现在,使用ggvis(),我可以从不同的数据集绘制点和线,但我找不到一种方法来使用add_legend()放置图例。这是使用ggvis()的代码:

df1 %>% ggvis(x=~x,y=~y) %>% layer_points() %>% 
layer_paths(x=~x,y=~y,data = df2, stroke := "red") %>% 
layer_paths(x=~x,y=~y,data = df3, stroke := "green") 

我非常感谢您的帮助。

谢谢。

编辑:

这是一个使用单个数据框和plot()的示例代码。

df = data.frame(x = sample(1:10), y = sample(1:10), x2 = 1:10, y2 = 1:10, y3 = sqrt(1:10) )
plot(df[,c("x","y")])
lines(df$x2, df$y2, col = "red")
lines(df$x2, df$y3, col = "green")
legend("topleft", c("Data 2","Data 3"), lty = 1, col = c("red","green"))

我不知道你是否可以使用两个不同的数据集来完成这个任务。但是,将两个数据集合并成一个数据框,然后进行融合操作会更有意义。这种方法会得到你想要的结果。如果这种方法对你可行,那么我可以提供一个解决方案。 - LyzandeR
是的,把所有数据放在一个数据框中对我来说没问题。谢谢。 - Geovany
1个回答

3
所以,我想到了以下的解决方案,它是可行的:
```html

代码示例

```
#add an id column for df2 and df3 and then rbind
df2$id <- 1
df3$id <- 2
df4 <- rbind(df2,df3)
#turn id into a factor
df4$id <- factor(df4$id)

#then plot df4 using the stroke=~id argument
#then plot the legend
#and finally add df1 with a separate data
df4 %>% ggvis(x=~x,y=~y,stroke=~id) %>% layer_lines() %>%
        add_legend('stroke', orient="left") %>%
        layer_points(x=~x,y=~y,data = df1,stroke:='black') 

它可以正常工作:

在此输入图像描述

如果您想将图例移动到绘图内部的位置,则需要尝试以下内容:

df4 %>% ggvis(x=~x,y=~y,stroke=~id) %>% layer_lines() %>%
  #make sure you use add relative scales
  add_relative_scales() %>%
  #values for x and y need to be between 0 and 1
  #e.g for the x-axis 0 is the at far-most left point and 1 at the far-right 
  add_legend("stroke", title = "Cylinders",
             properties = legend_props(
               legend = list(
                 x = scaled_value("x_rel", 0.1),
                 y = scaled_value("y_rel", 1)
               ))) %>%
  layer_points(x=~x,y=~y,data = df1,stroke:='black') 

输出结果如下图所示:

enter image description here


1
我希望在ggvis的文档中看到这种类型的示例。官方页面(Rstudio)几乎没有提供几个示例。你能推荐一个好的学习ggvis的资源吗?谢谢。 - Geovany
2
是的,我知道。不幸的是,文档仍然很差。这可能是因为开发人员目前有很多事情要处理,但会变得更好的。这里有一个文档(http://ggvis.rstudio.com/ggvis-basics.html),然后我通常使用`?<whatever_function_i_need>。对于这个例子,我只看了一下?add_legend`,然后尝试了示例并尝试了许多不同的参数(最初经常崩溃),直到我做对了。恐怕没有其他来源。 - LyzandeR
谢谢你的建议 :) - Geovany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接