在R中绘制图例文本图例、文本

2023-09-06 14:37:34 作者:墨锦倾城染青衣

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

一个

2

一个

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传递.

注意:您需要显式转换您的处理,因为符号需要一个命名符号或一个数字(除非您的处理被命名为 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
 
精彩推荐
图片推荐