【问题标题】:Manipulating legend text in R plotly在R中绘制图例文本
【发布时间】:2017-09-11 23:21:41
【问题描述】:

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

B

4

B

我会:

1,A

2,A

3,B

4,B

【问题讨论】:

    标签: r legend plotly


    【解决方案1】:

    听起来微不足道,但这是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传递。

    注意:您需要明确转换您的处理方式,因为 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
    

    【讨论】:

    • 非常感谢@Maximilian Peters。如果 df$group 是一个字符而不是一个整数怎么办?我尝试将 df$group 定义为.character() 并且无法重现您的解决方案。
    • @dan:尝试删除df$treatment &lt;- factor(...,它也应该适用于字符。
    • 我只是在 df 的构造中将组号用引号括起来,在您的答案中的代码中,然后运行其余部分。我得到一个错误: add_trace(p, x = trace_data$x, y = trace_data$y, marker = list(size = 10, : object 'group' not found when running the plotly loop. 如果我将组更改为trace_data$group 我没有得到那个错误,但我没有得到两种不同的颜色。
    • @dan:奇怪,尝试引用数字,它对我有用,你使用的是哪个 Plotly 版本?
    • 刚刚从 github 更新到最新版本:plotly_4.5.6.9000 并得到相同的 - 点都以粉红色/橙色着色,但由 symbol=treatment 分隔
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2013-11-24
    • 2017-01-12
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多