假设我有这个简单的点图:
ggplot(mtcars, aes(hp)) +
geom_dotplot(binwidth = 10, stackdir = 'center')
Run Code Online (Sandbox Code Playgroud)
我想标记(一些)要点。这不起作用:
ggplot(mtcars, aes(hp)) +
geom_dotplot(binwidth = 10, stackdir = 'center') +
geom_text(aes(label = rownames(mtcars)))
# Error: geom_text requires the following missing aesthetics: y
Run Code Online (Sandbox Code Playgroud)
那么,如何访问为, iny计算的值,geom_dotplot以便将标签放置在正确的位置?
如果我设置y = 0并使用geom_text_repel我得到:
ggplot(mtcars, aes(hp)) +
geom_dotplot(binwidth = 10, stackdir = 'center') +
geom_text_repel(aes(label = rownames(mtcars)), box.padding = unit(2, 'lines'), y = 0)
Run Code Online (Sandbox Code Playgroud)
这接近我想要的,除了所有线段都指向y = 0。
我使用对已接受答案的修改来实现此目的,该答案尝试从设备尺寸推断 y 缩放量:
library(ggplot2)
library(ggrepel)
bw <- 10
p <- ggplot(mtcars, aes(hp)) +
geom_dotplot(binwidth = bw, stackdir = 'center')
built <- ggplot_build(p)
point.pos <- built$data[[1]]
# Order rows of mtcars by hp
idx <- order(mtcars$hp)
mtcars2 <- mtcars[idx,]
# Get the dimensions of the target device in pixels
size <- dev.size(units = 'px')
# Get the range of x and y domain values
extent <- with(built$layout$panel_params[[1]], abs(c(diff(x.range), diff(y.range))))
mtcars2$ytext <- (size[1] / size[2]) * (extent[2] / extent[1]) * point.pos$stackpos * bw
mtcars2$xtext <- point.pos$x
ggplot(mtcars2, aes(hp)) +
geom_dotplot(binwidth = bw, stackdir = 'center') +
geom_text_repel(
aes(xtext, ytext, label = rownames(mtcars2)),
box.padding = unit(.5 * size[1] * bw / extent[1], 'points'),
color = 'red'
)
Run Code Online (Sandbox Code Playgroud)
哪个产生
它并不完美——这些片段没有指向点的精确中心,因为整个图像的长宽比与面板的长宽比不同,但它非常接近。
下面建议的代码并不优雅。
它在微调比例因子scale.factor和绘图尺寸后起作用。
我希望我的回答中包含的一些想法对解决您的问题有用。
library(ggplot2)
p <- ggplot(mtcars, aes(hp)) +
geom_dotplot(binwidth = 10, stackdir = 'center')
# Get y-positions of points plotted by geom_dotplot
# Warning: these positions are not given
point.pos <- ggplot_build(p)$data[[1]]
# Order rows of mtcars by hp
idx <- order(mtcars$hp)
mtcars2 <- mtcars[idx,]
# scale.fact needs fine tuning
# It is strictly connected to the dimensions of the plot
scale.fact <- 0.105
mtcars2$ytext <- point.pos$stackpos*scale.fact
mtcars2$xtext <- point.pos$x
lbls <- gsub(" ","\n",rownames(mtcars2))
png(file="myplot.png", width=4000, height=1400, res=300)
ggplot(mtcars2, aes(hp)) +
geom_dotplot(binwidth = 10, stackdir = 'center', fill="#AAAAAA55") +
geom_text(aes(label=lbls, x=xtext, y=ytext), size=2)
dev.off()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4566 次 |
| 最近记录: |