我正在绘制一个极地小提琴图。我想在图上添加线条和标签以注释每个辐条的含义。
我遇到两个问题。
第一个是,当我尝试创建线段时,如果x != xend
,则将线段绘制为曲线而不是直线。
例如:
data.frame(
x = rnorm(1000),
spoke = factor(sample(1:6, 1000, replace=T))
) %>%
ggplot(aes(x = spoke, fill=spoke, y = x)) +
geom_violin() +
coord_polar() +
annotate("segment", x=1.1, xend=1.3, y=0, yend=3, color="black", size=0.6) +
theme_minimal()
当我尝试在最后一个辐条和第一个辐条之间添加注释时,出现了第二个问题。在这种情况下,注释会导致坐标比例移动,从而使辐条不再均匀分布。
参见此处:
data.frame(
x = rnorm(1000),
spoke = factor(sample(1:5, 1000, replace=T))
) %>%
ggplot(aes(x = spoke, fill=spoke, y = x)) +
geom_violin() +
coord_polar() +
scale_x_discrete(limits = 1:5) +
annotate("segment", x=5.9, xend=5.7, y=0, yend=3, color="black", size=0.6) +
theme_minimal()
非常感谢您的协助!
(PS:我确实知道这类情节存在感知问题。我有充分的理由...)
答案 0 :(得分:1)
您需要一个here所示的“通用注释”
如果您不想精确地计算每个y的每个x的弧度距离,则基本上必须覆盖绘图而不使用图层工具。
使用Cowplot
require(ggplot2) #again, you should specify your required packages in your question as well
require(cowplot)
my_dat <- data.frame(x = rnorm(1000),
spoke = factor(sample(1:6, 1000, replace=T)))
my_annot <- data.frame(para = c('start','end'), x = c(0,0.4), y = c(0,0.2))
#first point x/y = c(0,0) because this makes positioning easier
当我编辑您的问题并删除管道时,这不仅是一个好的样式问题,而且使您可以轻松地处理不同的图。所以-我建议您应该删除管道。
p1 <- ggplot(my_dat, aes(x = spoke, fill=spoke, y = x)) +
geom_violin() +
theme_minimal()+
coord_polar()
p2 <- ggplot(my_annot) +
geom_line(aes(x,y)) +
coord_cartesian(xlim = c(0,2), ylim =c(0,2)) +
# the limits change the length of your line too
theme_void()
ggdraw() +
draw_plot(p1) +
draw_plot(p2, x = 0.55, y = 0.6)
很明显-您现在可以在draw_plot()