带编号的点标签和散点图中的图例
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())
【讨论】:
谢谢,很好的提示,但我想将尺寸和颜色用于其他属性。我用示例数据更新了问题,很抱歉一开始没有包括这些数据。以上是关于带编号的点标签和散点图中的图例的主要内容,如果未能解决你的问题,请参考以下文章