在R plotly中操作传奇文本

dan*_*dan 8 r legend plotly

我有一个data.frame我想使用到散点图Rplotly与我想颜色和形状两个因素.

这是我的数据:

set.seed(1)
df <- data.frame(x=rnorm(12),y=rnorm(12),
                 group=c(rep(1,3),rep(2,3),rep(3,3),rep(4,3)),
                 treatment=c(rep("A",6),rep("B",6)),
                 stringsAsFactors=F)

df$group <- factor(df$group,levels=1:4)
df$treatment <- factor(df$treatment,levels=c("A","B"))
Run Code Online (Sandbox Code Playgroud)

这是我试图绘制的方式:

require(plotly)

plot_ly(marker=list(size=10),type='scatter',mode="markers",x=~df$x,y=~df$y,color=~df$group,symbol=~df$treatment) %>% 
  add_annotations(text="group,treatment",xref="paper",yref="paper",x=1.02, xanchor="left",y=1.02,yanchor="top",legendtitle=TRUE,showarrow=FALSE) %>%
  layout(xaxis=list(title="x"),yaxis=list(title="y"))
Run Code Online (Sandbox Code Playgroud)

这给了我: 在此输入图像描述

是否可以将图例中的文本grouptreatment逗号分隔,而不是像现在一样用新行分隔?

这意味着代替:

1

一个

2

一个

3

4

我会:

1,A

2,A

3,B

4,B

Max*_*ers 5

听起来微不足道,但是这是Plotly决定什么对您有益的情况之一。

图例标签组成的类别colorsymbol它们在一个命令全部通过。为了控制输出,让我们分别添加每个跟踪。

for (grou in groups) {
  for (treat in treatments) {
    trace_data <- subset(df, group == grou & treatment == treat)
    if (nrow(trace_data) > 0) {
      p <- add_trace(p,
                     x = trace_data$x,
                     y = trace_data$y,
                     marker = list(size = 10,
                                   color = group,
                                   symbol = as.integer(charToRaw(treat)) - 65),
                     type = 'scatter',
                     mode = "markers",
                     name = paste(grou, treat, sep = ",")
                     )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我们通过color(并非绝对必要)通过markersymbol也通过marker(两者都可以在add_trace命令中传递,但随后再次Plotly为您确定如何处理它)。

图例标签通过传递name

注意:您需要显式转换您的处理方式,因为symbol需要一个已命名的符号或一个数字(除非您的处理方式为diamondcircle

在此处输入图片说明

完整的代码

library(utils)
library(plotly)

set.seed(1)
df <- data.frame(x = rnorm(12),
                 y = rnorm(12),
                 group = c(rep(1, 3),
                           rep(2, 3),
                           rep(3, 3),
                           rep(4, 3)
                           ),
                 treatment=c(rep("A", 6),
                             rep("B", 6)
                             ),
                 stringsAsFactors = FALSE
                 )

groups <- unique(df$group)
treatments <- unique(df$treatment)

p <- plot_ly()
for (grou in groups) {
  for (treat in treatments) {
    trace_data <- subset(df, group == grou & treatment == treat)
    if (nrow(trace_data) > 0) {
      p <- add_trace(p,
                     x = trace_data$x,
                     y = trace_data$y,
                     marker = list(size = 10,
                                   color = group,
                                   symbol = as.integer(charToRaw(treat)) - 65),
                     type = 'scatter',
                     mode = "markers",
                     name = paste(grou, treat, sep = ",")
                     )
    }
  }
}
p <- add_annotations(p, 
                     text = "group,treatment",
                     xref = "paper",
                     yref = "paper",
                     x = 0.96, 
                     xanchor = "left",
                     y = 1.03,
                     yanchor = "top",
                     legendtitle = TRUE,
                     showarrow = FALSE) %>%
  layout(xaxis = list(title = "x"),
         yaxis = list(title = "y"))

p
Run Code Online (Sandbox Code Playgroud)