我在ggplot2中创建了两个方面的图。我想在绘图区域外添加一个箭头。多个问题试图解决这个问题: How to draw lines outside of plot area in ggplot2? Displaying text below the plot generated by ggplot2
但是我无法使我的示例正常工作。另外,我希望有一种更简单的方法来实现这一目标?
我尝试增加plot.margins
并使用coord_cartesian()
,但均无济于事。
相反,我想要:
我的虚拟示例:
# read library to assess free data
library(reshape2)
library(ggplot2)
ggplot(tips,
aes(x=total_bill,
y=tip/total_bill)) +
geom_point(shape=1) +
facet_grid(. ~ sex) +
# define the segment outside the plot
geom_segment(aes(x = 10,
y = -0.25,
xend = 10,
yend = 0),
col = "red",
arrow = arrow(length = unit(0.3, "cm"))) +
theme_bw() +
# limit the displayed plot extent
coord_cartesian(ylim = c(0, 0.75)) +
# increase plot margins - does not help
theme(plot.margin = unit(c(1,1,1,0), "lines"))
答案 0 :(得分:3)
您可以使用clip="off"
中的参数coord_cartesian
在面板外部绘制。我还使用expand
的{{1}}参数将y轴从零开始。在scale_y
开始位置上有一些手动选择。
所以你的例子
y
(由于您未绘制美学图,我将library(reshape2)
library(ggplot2)
ggplot(tips,
aes(x=total_bill,
y=tip/total_bill)) +
geom_point(shape=1) +
facet_grid(. ~ sex) +
annotate("segment", x=12, y=-0.05, xend=12, yend=0,
col="red", arrow=arrow(length=unit(0.3, "cm"))) +
scale_y_continuous(expand=c(0,0))+
theme_bw() +
coord_cartesian(ylim = c(0, 0.75), clip="off") +
theme(plot.margin = unit(c(1,1,1,0), "lines"))
更改为geom_segment
)
哪个生产
答案 1 :(得分:1)
这是一种解决方法,并非完全令人满意,因为您将需要考虑绘图的位置。原则上,它使用自定义注释,可以使用cowplot
library(ggplot2)
library(cowplot)
library(reshape2)
首先定义具有相同坐标限制的图。
p <-
ggplot(tips, aes(x = total_bill, y = tip/total_bill)) +
geom_point(shape = 1) +
facet_grid(. ~ sex) +
theme_bw() +
coord_cartesian(ylim = c(0, 0.75), xlim = c(0, 50))
arrow_p <-
ggplot(tips) +
geom_segment(aes(x = 1, y = -1, xend = 1, yend = 0),
col = "red",
arrow = arrow(length = unit(0.3, "cm"))) +
coord_cartesian(ylim = c(0, 0.75), xlim = c(0,50)) +
theme_void()
arrow_p
是在空白背景上创建的,用作叠加层。现在,您可以通过以下方式将其放置在所需位置:
ggdraw() +
draw_plot(p) +
draw_plot(arrow_p, x = 0.10, y = 0.05) +
draw_plot(arrow_p, x = 0.57, y = 0.05)
不幸的是,您必须在这里反复试验。您还可以更改指定draw_plot()
的宽度/高度/比例参数。
也许有更好的方法,但这是一个相当直接的解决方法...