【问题标题】:Rearanging labels of ggplot scatterplot with the direct labels library in R使用 R 中的直接标签库重新排列 ggplot 散点图的标签
【发布时间】:2012-11-28 13:31:54
【问题描述】:

我正在尝试组织我的 ggplot 散点图的标签,以便标签不会相互重叠。为此,我正在尝试使用直接标签库,但无法使其正常工作。当我尝试代码时:

mytable <- read.csv('http://www.fileden.com/files/2012/12/10/3375236/My%20Documents/CF1_deNovoAssembly.csv', sep=",",  header=TRUE)

mytable$Consensus.length <- log(mytable$Consensus.length)

mytable$Average.coverage <-log(mytable$Average.coverage)

mytable$Name <- do.call(rbind,strsplit(as.character(mytable$Name), " ", '['))[,3]

ggplot(mytable, aes(x=Consensus.length, y=Average.coverage, label=Name)) + geom_point() + ylab("Contig Average Coverage (log)") + xlab("Contig Consensus Length (log)") + opts(title="Contig Coverage vs Length") + geom_text(hjust=0, vjust=-0.2, size=4)
direct.label(p, "first.qp")

我收到了这个错误:

Error in direct.label.ggplot(p, "first.qp") : 
  Need colour aesthetic to infer default direct labels.

所以我通过将 aes 添加到 geom_point() 来更改绘图脚本

ggplot(mytable, aes(x=Consensus.length, y=Average.coverage, label=Name)) + geom_point(aes(colour=Average.coverage)) + ylab("Contig Average Coverage (log)") + xlab("Contig Consensus Length (log)") + opts(title="Contig Coverage vs Length") + geom_text(hjust=0, vjust=-0.2, size=4)

现在我收到以下错误

Error in order.labels(d) : labels are not aligned

我发现this thread 在其中他们建议如果只有几个数据点则手动放置标签,或者如果数据点太多则根本不放置标签。我同意这一点,但我将使用许多不同的数据集生成此图,并且我确实需要数据标签。到目前为止,这是图表的外观

【问题讨论】:

  • 每个标签(172 和 165)之间的差异是否有意义?我问是因为您可以使用基于这些数字的削减的色标。例如,将它们分成 10 或 20 组。例如,如果它们代表地理或其他可测量距离的事物。
  • 另一个步骤可能是删除点,只绘制数字(在这种情况下,您需要将 hjustvjust 设置为 0.5。但我认为最终没有办法具有所有标签,并且不重叠,并且字体较大 - 太多的数据点彼此太接近。
  • @BrandonBertelsen 差异本身没有意义,但我想知道 172 和 165 在哪里聚集。例如,我想确定 y 轴上 4.5 到 5.5 之间的数据点组中的哪些数据点聚类。
  • @DrewSteen 这是一个有趣的选择,你能告诉我如何完成它
  • 我遇到了一个相同的问题

标签: r ggplot2


【解决方案1】:

您可以简单地删除点并仅绘制标签,这可以通过注释掉绘图的 geom_point() 部分来完成。 (您还需要将 hjust 和 vjust 值更改为 0.5,以便标签的中心出现在该点所在的位置):

ggplot(mytable, aes(x=Consensus.length, y=Average.coverage, label=Name)) + 
  #geom_point() + 
  ylab("Contig Average Coverage (log)") + xlab("Contig Consensus Length (log)") + 
  opts(title="Contig Coverage vs Length") + geom_text(hjust=0.5, vjust=0.5, size=4)

还是有一些重叠,不过或许通过调整字体大小和情节就不会太严重了。

【讨论】:

    【解决方案2】:

    从您的 cmets 看来,这听起来更像是一个聚类练习。所以,让我们继续做吧:

    set.seed(9234970)
    d <- data.frame(Name=mytable$Name, 
    x=mytable$Consensus.length, 
    y=mytable$Average.coverage)
    d$kmeans <- as.factor(kmeans(d[-1],20)$cluster)
    ggplot(d, aes(x, y, color=kmeans)) + 
    geom_point() + 
    theme(legend.position="bottom")
    

    ggplot(d, aes(x, x, label=Name)) + geom_text(aes(x,y)) + facet_wrap(~kmeans, scales="free")

    我随机选择了 20 个集群

    您还可以使用层次聚类来查看树状图。

    plot(hclust(dist(d[-3]))) # -3 drops kmeans column

    我建议总体上使用 cluster 包,因为它可以为您的问题提供更有用的解决方案。

    【讨论】:

    • 感谢和非常有趣的解决方案。我猜聚类算法使用 x 和 y 轴上的值。有没有办法只使用 y 轴值对数据进行聚类。
    • 你会做同样的事情,但你的集群基于as.factor(kmeans(d$y,20)$cluster)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多