我用 ggplot2 创建了这个情节:
外线需要对应于Y标度(即Text1的行的Y位置应为100和85) . 我可以通过在条形图右侧绘制一个空白绘图并使用与条形图相同的比例然后使用注释函数绘制线来实现此目的 . 另一种方法是简单"manually"用 grid.lines
绘制线条,但 grid.lines
的坐标将不对应于绘图的Y刻度 .
是否有可能以某种方式使用不同的方法绘制这些线?我认为必须用 grid.lines
来完成 . 我怎么能把条形图的Y coordindates传递给 grid.lines
?
下面是用于创建此图的最小代码:
library (ggplot2)
test= data.frame(
group=c(rep(1,6), rep(2,6)),
subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2),
category=c( rep(1:3, 4)),
count=c( 10,80,10,5,90,5, 10,80,10,5,90,5 )
)
qplot(subgroup,
count,
data=test,
geom="bar",
stat="identity",
fill =category,
facets = .~ group, width=0.9)+
opts(legend.position="none",
plot.margin = unit(c(0,9,2,0), "lines"))
如何画出条形图右侧的线条?
我最近问了一个关于 ggplot2 中绘图区域之外绘制文本的问题,解决方法是使用 gt$layout
和 grid.draw
.
Displaying text below the plot generated by ggplot2
可以在这里使用类似的方法吗?据我所知,annotation_custom仅适用于文本,不适用于其他图形元素 . 谢谢
3 回答
Update
原始解决方案使用
annotation_custom
,但annotation_custom
的一个问题是它在所有面板中绘制注释 . 但是,通过简单的修改,annotation_custom
可以仅在一个面板中绘制(取自Baptiste的答案here)Original Solution
我想几乎任何使用
grid()
创建的Grob都可以在annotation_custom()
中使用 . 可能有更简洁的方法来执行此操作,但这里使用grid
,annotation_custom
和@ baptiste的代码from here来覆盖剪辑(如前面的帖子中所述) .Updated
opts
已被弃用;请改用theme
.这是另一种解决方案 . 它解决了两个面板中
annotation_custom()
绘制凹凸的问题 . 它绘制了两个图表:第一个是你的条形图;第二个只包含注释 . 然后使用gridExtra
包中的grid.arrange()
将两者放在一起 . 但是,您的折线问题仍然存在 .在两个图中仍然存在使y轴刻度相同的问题 . 但是要小心,它可以做到 . 在包含注释的图中,请注意不会删除可能对y轴刻度产生影响的元素(通过
theme_blank()
,而是隐藏(使用colour = NA
) .我使用此链接中的代码添加了行/文本:Using grconvertX/grconvertY in ggplot2 . 此方法使用grid.text和grid.lines而不是grobs . 我不确定哪种方法更好 .
我认为grid.lines可以组合成grid.polyline语句,也可以通过循环完成 . x和y位置可以设置为一个变量,而不是每行中的硬编码 .
唯一可能的复杂因素是将比例传递给视口 . 但是,只要在GGPLOT和视口中使用相同的比例,此代码就可以工作 . 请注意,视口使用绘图的整个高度为0到100 .
为任何格式问题道歉 - 我只是粘贴我的代码并使用代码按钮缩进它 .