gpt4 book ai didi

r - 如何巧妙地将文本标签放置在 ggplot2 中不同大小的点旁边?

转载 作者:行者123 更新时间:2023-12-05 01:06:45 26 4
gpt4 key购买 nike

我正在尝试使用 ggplot2 制作带标签的气泡图在 R 中。这是简化的场景:

我有一个包含 4 个变量的数据框:3 个定量变量,x , y , 和 z ,以及另一个标记点​​的变量,lab .

我想做一个散点图,位置由x决定和 y ,点的大小由z决定.然后我想将文本标签放置在点旁边(例如,在点的右侧)而不与点顶部的文本重叠。

如果点的大小没有变化,我可以尝试简单地修改 geom_text 的美感。通过添加缩放常数(例如 aes(x=x+1, y=y+1) )来分层。但是,即使在这种简单的情况下,我也无法正确定位文本,因为这些点不随绘图的输出尺寸缩放。换句话说,点的大小在 500x500 绘图和 1000x1000 绘图中保持不变 - 它们不会随着输出绘图的尺寸而放大。

因此,我认为我必须通过输出图的大小(例如尺寸)来缩放标签的位置,或者我必须从 ggplot 获得点的半径不知何故并移动我的文本标签。有没有办法在 ggplot2 中做到这一点? ?

这是一些代码:

# Stupid data
df <- data.frame(x=c(1,2,3),
y=c(1,2,3),
z=c(1,2,1),
lab=c("a","b","c"), stringsAsFactors=FALSE)

# Plot with bad label placement
ggplot(aes(x=x, y=y), data=df) +
geom_point(aes(size=z)) +
geom_text(aes(label=lab),
colour="red") +
scale_size_continuous(range=c(5, 50), guide="none")

编辑:我应该提一下,我试过 hjustvjust在 geom_text 里面,但它不会产生预期的效果。
# Trying hjust and vjust, but it doesn't look nice
ggplot(aes(x=x, y=y), data=df) +
geom_point(aes(size=z)) +
geom_text(aes(label=lab), hjust=0, vjust=0.5,
colour="red") +
scale_size_continuous(range=c(5, 50), guide="none")

编辑:多亏了 Henrik 和 shujaa,我设法得到了一些现在有用的东西。以防万一有人分享更通用的解决方案,我将让问题悬而未决。

只是我使用它的简介:我正在绘制 map ,并用一个与观察到的降水量成比例大小的点来指示某些站点的降水量。我想以美观的方式在每个点旁边添加一个车站标签。我将为不同的区域制作更多这样的图,并且我的输出图对于每个图可能具有不同的分辨率或比例(例如,由于不同的投影),因此需要一个通用的解决方案。我可能会尝试创建自定义 position_jitter ,就像 baptiste 建议的那样,如果我周末有时间的话。

最佳答案

看起来 position_*** 无权访问其他层使用的比例,所以这是不行的。您可以制作 GeomText 的克隆,根据映射的大小移动标签,
但是为了一个非常笨拙和脆弱的解决方案需要付出很多努力,

enter image description here

geom_shiftedtext <- function (mapping = NULL, data = NULL, stat = "identity", 
position = "identity",
parse = FALSE, ...) {
GeomShiftedtext$new(mapping = mapping, data = data, stat = stat, position = position,
parse = parse, ...)
}
require(proto)
GeomShiftedtext <- proto(ggplot2:::GeomText, {
objname <- "shiftedtext"
draw <- function(., data, scales, coordinates, ..., parse = FALSE, na.rm = FALSE) {
data <- remove_missing(data, na.rm,
c("x", "y", "label"), name = "geom_shiftedtext")

lab <- data$label
if (parse) {
lab <- parse(text = lab)
}

with(coord_transform(coordinates, data, scales),
textGrob(lab, unit(x, "native") + unit(0.375* size, "mm"),
unit(y, "native"),
hjust=hjust, vjust=vjust, rot=angle,
gp = gpar(col = alpha(colour, alpha),
fontfamily = family, fontface = fontface, lineheight = lineheight))

)
}

})


df <- data.frame(x=c(1,2,3),
y=c(1,2,3),
z=c(1.2,2,1),
lab=c("a","b","c"), stringsAsFactors=FALSE)

ggplot(aes(x=x, y=y), data=df) +
geom_point(aes(size=z), shape=1) +
geom_shiftedtext(aes(label=lab, size=z),
hjust=0, colour="red") +
scale_size_continuous(range=c(5, 100), guide="none")

关于r - 如何巧妙地将文本标签放置在 ggplot2 中不同大小的点旁边?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19694497/

26 4 0