繁体   English   中英

在R plotly中操作传奇文本

[英]Manipulating legend text in R 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"))

这是我试图绘制的方式:

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

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

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

这意味着代替:

1

一种

2

一种

3

4

我会:

1,A

2,A

3,B

4,B

听起来微不足道,但这是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 = ",")
                     )
    }
  }
}

我们通过markersymbol也通过marker传递color (不是绝对必要的)(两者都可以在add_trace命令中传递,但然后再次Plotly决定你该怎么做)。

图例标签通过name传递。

注意:您需要明确转换您的治疗,因为符号需要命名符号或数字(除非您的治疗方法被命名为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM