可能很容易。
我有想要绘制的数据点(带有误差线)。
分组因素分为两级:group
和cluster
:
set.seed(1)
df <- data.frame(cluster=rep(LETTERS[1:10],2),group=c(rep("A",10),rep("B",10)),point=rnorm(20),err=runif(20,0.1,0.3))
df$group <- factor(df$group,levels=c("A","B"))
我想绘制x-axis
为df$cluster
的点,并且在每个cluster
内,这些点由df$group
进行颜色编码并分割(所以group
A
点留给group
B
点)。
这是我尝试的内容:
library(plotly)
plot_ly(x=~df$cluster,y=~df$point,split=~df$group,type='scatter',mode="markers",showlegend=T,color=~df$group) %>%
layout(legend=list(orientation="h",xanchor="center",x=0.5,y=1),xaxis=list(title=NA,zeroline=F,categoryorder="array",categoryarray=sort(unique(df$cluster)),showticklabels=T),yaxis=list(title="Val",zeroline=F)) %>%
plotly::add_trace(error_y=list(array=df$err),showlegend=F)
非常接近,但唯一不起作用的是将每个cluster
中的点分割为group
。
知道如何让它发挥作用吗?理想情况下,代码是通用的,以便在每个cluster
内分割任意数量的组级别,而不是特定于此示例的A
和B
的代码。< / p>
答案 0 :(得分:3)
我喜欢plotly
并几乎专门使用它,但是ggplot2
内置了一些不错的功能,需要进行一些调整才能复制到plotly
中。
不过,如果您打算发布交互式地块供其他人查看,我仍然非常有必要了解一些更详细的内容。如果您使用本机语法而不是R
,则ggplotly
API提供了许多可用于调整的控件,并使每个小细节都变得完美。
话虽如此,这就是我解决这个问题的方法:
(有问题的数据生成代码)
library(plotly)
set.seed(1)
df <- data.frame(cluster=rep(LETTERS[1:10],2),
group=c(rep("A",10),
rep("B",10)),
point=rnorm(20),
err=runif(20,0.1,0.3))
df$group <- factor(df$group,levels=c("A","B"))
首先,您需要以系统的方式手动进行一些“抖动”操作。我还没有阅读在ggplot2
函数中“自动魔术”的等效代码,但是我想类似的事情正在幕后发生。
## Generate a set of offsets based on the number of group
Offset <- data.frame(group = unique(df$group),
offset = seq(-0.1, 0.1,length.out = length(unique(df$group))))
## Join the offset to the data frame based on group
df <- merge(df,Offset,by = "group", all.x = TRUE)
## Calculate an x location
df$x_location <- as.numeric(as.factor(df$cluster)) + df$offset
head(df)
操作后:
group cluster point err offset x_location
1 A A -0.6264538 0.2641893 -0.1 0.9
2 A B 0.1836433 0.2294120 -0.1 1.9
3 A C -0.8356286 0.2565866 -0.1 2.9
4 A D 1.5952808 0.2106073 -0.1 3.9
5 A E 0.3295078 0.2059439 -0.1 4.9
6 A F -0.8204684 0.2578712 -0.1 5.9
现在您有了一个明确的x_location,可以在散点图上使用它,然后使用数组添加分类刻度/文本。然后,通过显示text
中感兴趣的值,可以从x
中消除y
和hoverinfo
的值,以完全覆盖您的曲目。
df %>%
plot_ly() %>%
add_trace(x= ~x_location,y= ~point, color= ~group,
text = ~paste0("Group ",group," - Cluster ", cluster,"<br>",round(point,2)),
error_y = list(type = "data", array = ~err),
hoverinfo = "text",
type = "scatter", mode = "markers") %>%
layout(hovermode = "compare",
paper_bgcolor = 'rgba(235,235,235,0)',
plot_bgcolor = "rgba(235,235,235,1)",
legend=list(orientation="h",
xanchor="center",
yanchor = "bottom",
x=0.5,y=1,
bgcolor = "transparent"),
xaxis=list(title=NA,
zeroline=FALSE,
tickmode = "array",
tickvals = unique(as.numeric(sort(as.factor(df$cluster)))),
ticktext = unique(sort(as.factor(df$cluster))),
gridcolor = "rgba(255,255,255,1)"),
yaxis=list(title="Val",
zeroline=FALSE,
gridcolor = "rgba(255,255,255,1)"))
答案 1 :(得分:1)
我对plotly
软件包不太熟悉。我不确定这是否满足您的要求。
但是这里是使用unite
包中的tidyr
的一种解决方法。在与plotly
一起使用之前,创建了 集群组 对。
librray(tidyr)
df1 <- df %>% unite(c('cluster','group'), col = 'clust_grp', sep = "-", remove = F)
plot_ly(df1, x=~clust_grp, y=~point, type='scatter', mode="markers", showlegend=T, color=~group) %>%
layout(legend=list(orientation="h",xanchor="center",x=0.5,y=1),xaxis=list(title="cluster_group",
zeroline=F, categoryorder="array", categoryarray = sort(unique(df1$clust_grp)), showticklabels=T), yaxis=list(title="Val", zeroline=F)) %>%
plotly::add_trace(error_y=list(array=df1$err), showlegend=F)