用段注释极坐标ggplot-直线和意外的坐标移动

时间:2018-07-16 19:15:11

标签: r ggplot2

我正在绘制一个极地小提琴图。我想在图上添加线条和标签以注释每个辐条的含义。

我遇到两个问题。

第一个是,当我尝试创建线段时,如果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:我确实知道这类情节存在感知问题。我有充分的理由...)

1 个答案:

答案 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()

中浏览行的长度和位置

enter image description here