按绘图散点图中的因子分割点

时间:2018-06-19 06:21:50

标签: r split plotly

可能很容易。

我有想要绘制的数据点(带有误差线)。 分组因素分为两级:groupcluster

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-axisdf$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)

这给了我: enter image description here

非常接近,但唯一不起作用的是将每个cluster中的点分割为group

知道如何让它发挥作用吗?理想情况下,代码是通用的,以便在每个cluster内分割任意数量的组级别,而不是特定于此示例的AB的代码。< / p>

2 个答案:

答案 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中消除yhoverinfo的值,以完全覆盖您的曲目。

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

Fake_Axis_ggplot2_styled

答案 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)

Cluster-Group Pairwise