我有一个 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
一个
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.
图例标签由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
传递.
注意:您需要显式转换您的处理,因为符号需要一个命名符号或一个数字(除非您的处理被命名为 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
上一篇:设置位图在Windows 7中的缩略图preVIEW位图、缩略图、Windows、preVIEW
下一篇:什么SqlCommand.Parameters.AddWithValue真的呢?SqlCommand、Parameters、AddWithValue