带编号的点标签和散点图中的图例

Posted

技术标签:

【中文标题】带编号的点标签和散点图中的图例【英文标题】:Numbered point labels plus a legend in a scatterplot 【发布时间】:2014-09-08 05:35:42 【问题描述】:

我正在尝试使用数字 (1, 2, 3, ...) 在 R (ggplot2) 的散点图中标记点,然后将数字与图例中的名称匹配 (1 - Alpha, 2 - Bravo , 3 - Charlie...),作为处理情节上太多、太长的标签的一种方式。

假设这是 a.df:

名称 X 属性 Y 属性 尺寸 属性 颜色 属性 阿尔法 1 2.5 10 A 布拉沃 3 3.5 5 乙 查理 2 1.5 10 C 三角洲 5 1 15 天

这是一个标准的散点图:

ggplot(a.df, aes(x=X.Attribute, y=Y.Attribute, size=Size.Attribute, fill=Colour.Attribute, label=Name)) + 几何点(形状=21)+ geom_text(size=5, hjust=-0.2,vjust=0.2)

有没有办法改成如下?

散点图上标有数字 (1,2,3...) 在绘图旁边有一个图例,将绘图标签 (1,2,3...) 分配给 a.df$Name

在下一步中,我想为点的大小和颜色分配其他属性,这可能会排除一些“黑客”。

【问题讨论】:

如果您发布具有代表性的数据集和您尝试的解决方案(代码),它将大大增加有人帮助您解决问题的可能性。见this discussion。 【参考方案1】:

这是另一种解决方案,它将标签绘制为geom_text。我借过 ggplot2 - annotate outside of plot.

library(MASS)  # for Cars93 data
library(grid)
library(ggplot2)

d <- Cars93[1:30,]
d$row_num <- 1:nrow(d)
d$legend_entry <- paste("  ", d$row_num, d$Manufacturer, d$Model)

ymin <- min(d$Price)
ymax <- max(d$Price)
y_values <- ymax-(ymax-ymin)*(1:nrow(d))/nrow(d)

p <- ggplot(d, aes(x=Min.Price, y=Price)) +
        geom_text(aes(label=row_num)) +
        geom_text(aes(label=legend_entry, x=Inf, y=y_values, hjust=0)) +
        theme(plot.margin = unit(c(1,15,1,1), "lines"))

gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)

【讨论】:

谢谢,我想如果我尝试将 geom_point() 添加到初始绘图 p 中,这可能会起作用。或者,我会看看我是否可以绘制两组形状,相互抵消:1)可以调整大小和颜色的点,2)可以分配给图例的字母。【参考方案2】:

这很 hacky,但可能会有所帮助。绘图标签由geom_text 简单添加,为了生成图例,我将颜色映射到数据中的标签。然后为了停止对点着色,我用scale_colour_manual 覆盖它,您可以在其中设置点的颜色以及图例上的标签。最后,我通过设置 alpha = 0 使图例中的点不可见,而通常在 theme() 中的点后面的正方形。

dat <- data.frame(id = 1:10, x = rnorm(10), y = rnorm(10), label = letters[1:10])
ggplot(dat, aes(x, y)) + geom_point(aes(colour = label)) + 
  geom_text(aes(x = x + 0.1, label = id)) +
  scale_colour_manual(values = rep("black", nrow(dat)),
                      labels = paste(dat$id, "=", dat$label)) +
  guides(colour = guide_legend(override.aes = list(alpha = 0))) +
  theme(legend.key = element_blank())

【讨论】:

谢谢,很好的提示,但我想将尺寸和颜色用于其他属性。我用示例数据更新了问题,很抱歉一开始没有包括这些数据。

以上是关于带编号的点标签和散点图中的图例的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中创建包含散点图和正态图的图例

在单个 3D 图中混合曲面和散点图

编码颜色时向散点图添加图例

Pandas 散点图使用数据框字段派生颜色和图例

R绘图基础指南 3. 散点图(合集)

echart散点图问题:如何在散点图中特别标出某一个特定的点,如[120,70]