ggplot2:coord_polar()与geom_col()

时间:2019-05-15 09:54:02

标签: r ggplot2 polar-coordinates

coord_polar()一起使用geom_col()时遇到问题。我的学位数值范围从0到<360。假设步长为20,所以0, 20, 40... 340。如果我用coord_polar()绘制它们,则会遇到两个问题:

  • 值0和340相互接触,并且与其他列的间距不同
  • “ x轴”略有偏移,因此0不会指向“北”

请参阅此最小示例。



suppressWarnings(library(ggplot2))


df <- data.frame(x = seq(0,359,20),y = 1)

ninety = c(0,90,180,270)

p <- ggplot(df, aes(x,y)) +
  geom_col(colour = "black",fill = "grey") +
  geom_label(aes(label = x)) + 
  scale_x_continuous(breaks = ninety) +
  geom_vline(xintercept = ninety, colour = "red") +
  coord_polar()

p

如果我设置了x轴限制,则坐标系的旋转是正确的,但由于空间不足,列0消失了。


p+scale_x_continuous(breaks = c(0,90,180,270),limits = c(0,360))
#> Scale for 'x' is already present. Adding another scale for 'x', which
#> will replace the existing scale.
#> Warning: Removed 1 rows containing missing values (geom_col).

reprex package(v0.2.1)于2019-05-15创建

2 个答案:

答案 0 :(得分:2)

由于每个条形图占据的空间为20度,因此您可以在比例尺和坐标上将其移动一半:

ggplot(df, aes(x,y)) +
  geom_col(colour = "black",fill = "grey") +
  geom_label(aes(label = x)) + 
  scale_x_continuous(breaks = ninety,
                     limits = c(-10, 350)) + # shift limits by 10 degrees
  geom_vline(xintercept = ninety, colour = "red") +
  coord_polar(start = -10/360*2*pi) # offset by 10 degrees (converted to radians)

plot

答案 1 :(得分:1)

我已经更接近您想要的东西了,但这有点麻烦,所以我不知道这是否是一个很好的解决方案。

代码:

df <- data.frame(x = seq(0,359,20),y = 1)

ggplot(df, aes(x+10,y, hjust=1)) +
  geom_col(colour = "black",fill = "grey") +
  geom_label(aes(x=x+5,label = x)) + 
  scale_x_continuous(breaks = c(0,90,180,270),limits = c(0,360)) +
  coord_polar() 

我现在将它们绘制在c(10,30,50,...)上,而不是将geom_cols绘制在c(0,20,40,...)上。我正在将geom_labels绘制在c(5,15,25,...)。

由于180度不是南,标签在图表底部的位置仍然不理想。

我得到这张图: enter image description here