在R中以图例方式处理图例文本 [英] Manipulating legend text in R plotly
问题描述
我有一个data.frame
,我想使用R
的plotly
进行散点图绘制,并使用两个要着色和成形的因素.
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"))
这给了我:
是否可以将图例中的group
和treatment
文本用逗号分隔而不是现在的新行?
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.
图例标签由color
和symbol
类别组成,它们全部通过一个命令传递.为了控制输出,让我们分别添加每个跟踪.
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 = ",")
)
}
}
}
我们通过marker
和symbol
也通过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需要一个已命名的符号或一个数字(除非您的处理方式被命名为diamond
或circle
)
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屋!