在R中绘制名义数据的集群

时间:2013-06-29 09:51:07

标签: r

想象一下,我们有7个类别(例如宗教信仰),我们希望不是以线性方式绘制它们,而是在自动选择的群集中进行良好对齐。在这里,组内的个体具有相同的响应,但不应该在一行上绘制(在绘制序数数据时会发生这种情况)。

总结一下:

  • 自动使用可用图表空间

  • 无订单分组,在画布上展开

  • 个人仍然可见;没有重叠

  • 让群组中的个人受某些(不可见的)圈子的束缚会很高兴

是否有为此目的设计的包装?我需要寻找什么关键词?

示例数据:

religion <- sample(1:7, 100, T)
# No overlap here, but I would like to see the group part come out more. 
plot(religion)  

2 个答案:

答案 0 :(得分:6)

将坐标分配给每个组的中心后, 您可以使用wordcloud::textplot来避免重叠标签。

# Data
n <- 100
k <- 7
religion <- sample(1:k, n, TRUE)
names(religion) <- outer(LETTERS, LETTERS, paste0)[1:n]
# Position of the groups
x <- runif(k)
y <- runif(k)
# Plot
library(wordcloud)
textplot(
  x[religion], y[religion], names(religion), 
  xlim=c(0,1), ylim=c(0,1), axes=FALSE, xlab="", ylab=""
)

wordcloud

或者,您可以使用clique(或树)构建图形 对于每个小组, 并使用igraph中的众多图形布局算法之一。

library(igraph)
A <- outer( religion, religion, `==` )
g <- graph.adjacency(A)
plot(g)
plot(minimum.spanning.tree(g))

igraph

答案 1 :(得分:1)

在您链接的图像中,每个点都有三个相关的数字:坐标x和y以及组(颜色)。如果每个人只有一个信息,您可以这样做:

set.seed(1)

centers <- data.frame(religion=1:7, cx=runif(7), cy=runif(7))

eps <- 0.04

data <- within(merge(data.frame(religion=sample(1:7, 100, T)), centers),
{
    x <- cx+rnorm(length(cx),sd=eps)
    y <- cy+rnorm(length(cy),sd=eps)
})

with(data, plot(x,y,col=religion, pch=16))

请注意,我正在为每个组创建随机中心,并为每个观察点围绕这些中心创建小位移。您必须使用参数eps,并且如果想要追求此路径,可以手动设置中心。