在曲线上添加多边形到散点图

时间:2017-12-22 00:21:02

标签: r polygon plotly

我正在使用x,y的{​​{1}}绘制5个R数据集群。

以下是数据:

plotly

这是情节:

set.seed(1)
df <- do.call(rbind,lapply(seq(1,20,4),function(i) data.frame(x=rnorm(50,mean=i,sd=1),y=rnorm(50,mean=i,sd=1),cluster=i)))

enter image description here

现在我在每个群集周围创建多边形:

library(plotly)
clusters.plot <- plot_ly(marker=list(size=10),type='scatter',mode="markers",x=~df$x,y=~df$y,color=~df$cluster,data=df) %>% hide_colorbar() %>% layout(xaxis=list(title="X",zeroline=F),yaxis=list(title="Y",zeroline=F))

clusters.plot

现在我想将它们添加到#helper functions: library(data.table) library(grDevices) splinesPolygon <- function(xy,vertices,k=3, ...) { # Assert: xy is an n by 2 matrix with n >= k. # Wrap k vertices around each end. n <- dim(xy)[1] if (k >= 1) { data <- rbind(xy[(n-k+1):n,], xy, xy[1:k, ]) } else { data <- xy } # Spline the x and y coordinates. data.spline <- spline(1:(n+2*k), data[,1], n=vertices, ...) x <- data.spline$x x1 <- data.spline$y x2 <- spline(1:(n+2*k), data[,2], n=vertices, ...)$y # Retain only the middle part. cbind(x1, x2)[k < x & x <= n+k, ] } clustersPolygon <- function(df) { dt <- data.table::data.table(df) hull <- dt[,.SD[chull(x,y)]] spline.hull <- splinesPolygon(cbind(hull$x,hull$y),100) return(data.frame(x=spline.hull[,1],y=spline.hull[,2],stringsAsFactors=F)) } library(dplyr) polygons.df <- do.call(rbind,lapply(unique(df$cluster),function(l) clustersPolygon(df=dplyr::filter(df,cluster == l)) %>% dplyr::rename(polygon.x=x,polygon.y=y) %>% dplyr::mutate(cluster=l)))

我以为会这样做:

clusters.plot

但是我收到了这个错误:

clusters <- unique(df$cluster)
for(l in clusters) clusters.plot <- clusters.plot %>% add_polygons(x=dplyr::filter(polygons.df,cluster == l)$polygon.x,y=dplyr::filter(polygons.df,cluster == l)$polygon.y,line=list(width=2,color="black"),fillcolor='transparent')

Error: Columns `x`, `y` must be length 1 or 250, not 54, 54 250nrow(df)54

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

试试这个:

var test = [
    'abcd',
    'as123',
    'as_as',
    'as_12',
    'as-as',
    '12as',
    '12_1as',
    '123_12',
    '12-12',
    '1234',
    '--',
    '__',
];
console.log(test.map(function (a) {
  return a+' : '+/^(?!\d+[-_]\d+$)[a-z0-9]+[-_]?[a-z0-9]+$/i.test(a);
}));

enter image description here