在R中以图例方式处理图例文本 [英] Manipulating legend text in R plotly

查看:115
本文介绍了在R中以图例方式处理图例文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个data.frame,我想使用Rplotly进行散点图绘制,并使用两个要着色和成形的因素.

I have a data.frame I'd like to scatter plot using R's plotly with two factors which I'd like to color and shape by.

这是我的数据:

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

这就是我要绘制的方式:

Here's how I'm trying to plot:

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文本用逗号分隔而不是现在的新行?

Is it possible to get the text of group and treatment in the legend be separated by comma instead of the new line as it is now?

这意味着代替:

1

A

2

A

3

B

4

B

我将拥有:

1,A

2,A

3,B

4,B

推荐答案

听起来微不足道,但这是Plotly决定对您而言好的的情况之一.

Sounds trivial but it's one of the cases where Plotly decides whats good for you.

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

The legend labels are composed of the categories of color and symbol which are all passed in one command. In order to get control over the output, let's add each trace separately.

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再次为您决定什么这样做).

We pass the color (not strictly necessary) via marker and symbol also via marker (both can be passed in the add_trace command as well but then again Plotly decides for you what do to do with it).

图例标签通过name传递.

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

Note: You need to convert your treatment explicitly because symbol expects either a named symbol or a number (unless your treatments are named diamond or circle)

完整代码

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

这篇关于在R中以图例方式处理图例文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆