在R的plotly中操作图例文本

8

我有一个 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"))

以下是我尝试绘制的方式:

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"))

这给了我: enter image description here 在图例中,是否可以将grouptreatment的文本用逗号分隔而不是换行符分隔?这意味着,取代当前的格式:
1
A
2
A
3
B
4
B
我将得到以下格式:
1,A
2,A
3,B
4,B
1个回答

7

听起来很琐碎,但这是一个情况,在这种情况下,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 = ",")
                     )
    }
  }
}

我们通常使用标记器将颜色(不是必需的)传递,也可以通过标记器将符号传递(两者都可以在“add_trace”命令中传递,但这样Plotly会为您决定如何处理它们)。图例标签通过name传递。
注意:您需要显式地转换处理方式,因为符号期望命名符号或数字(除非您的处理名称为diamondcircle)。

enter image description here

完整代码

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

非常感谢@Maximilian Peters。如果df$group是字符而不是整数,该怎么办?我尝试将df$group定义为.character(),但无法复制您的解决方案。 - dan
@dan:尝试删除 df$treatment <- factor(...,这样也适用于字符。 - Maximilian Peters
我刚刚在构建df的代码中,将组号用引号括起来,然后运行了其余部分。但是当我运行plotly循环时,我遇到了一个错误:Error in add_trace(p, x = trace_data$x, y = trace_data$y, marker = list(size = 10, : object 'group' not found。如果我将group改为trace_data $ group,则不会出现该错误,但我不能再得到两种不同的颜色了。 - dan
@dan:奇怪,我试着引用数字,它对我起作用了。你使用的是哪个Plotly版本? - Maximilian Peters
刚从Github更新到最新版本:plotly_4.5.6.9000,但仍然出现相同的问题——所有点都是粉红色/橙色,但通过symbol=treatment分开。 - dan

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