我正在尝试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")
编辑:我应该提一下,我尝试过hjust
并vjust
在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,我现在设法得到了一些可行的方法。万一有人共享一个更通用的解决方案,我将开放这个问题。
只是我为此使用的一个模糊信息:我正在绘制地图,并指示某些站点的降水量,其点的大小与所观察到的降水量成比例。我想以美观的方式在每个点旁边添加一个桩号标签。我将针对不同区域制作更多这些图,并且我的输出图可能对每个图具有不同的分辨率或比例(例如,由于不同的投影),因此需要一个通用的解决方案。position_jitter
如果我在周末有时间,我可能会尝试创建一个习惯,如baptiste建议的那样。
看来position _ ***无法访问其他图层使用的比例,所以这是不可行的。您可以克隆GeomText,以根据映射的大小移动标签,但是对于一个非常笨拙和脆弱的解决方案来说,这是很费力的,
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")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句