在ggplot2中如何沿着x轴旋转标签以配合极坐标投影?

4
如何使用ggplot中的coor_polar投影使x轴标签的角度与外部x轴的角度相同?这类似于在使用coord_polar()时旋转ggplot2中的x轴文本, 但我不太理解数学,无法适应它。我找到了一个试错的解决方案,其中angle = c(c(1:3)*c(-14,-22.3,-22),-90,c(3:1)*c(22,22.3,14),c(1:3)*c(-14,-22.3,-22),90,c(3:1)*c(22,22.3,14))。如果x轴标签朝同一方向旋转,也可以。如果其他方法都失败了,我可能会放弃旋转标签,只需添加第二个图例,如极坐标ggplot的两个图例(其中一个自定义)。感谢您的帮助!
require(ggplot2)    
df.test <- data.frame(Names=c("name01", "name02", "name03", "name04", "name05", "name06",    "name07", "name08", "name09", "name10", "name11", "name12", "name13", "name14"),Values=rep(1,24))
p <- ggplot(df.test, aes(Names, fill=Values))
p + coord_polar(theta="x", direction=1) +
geom_bar(stat="bin", colour="gray", alpha=.7) +
theme(axis.text.x = element_text(angle = c(c(1:3)*c(-14,-22.3,-22),-90,c(3:1)*c(22,22.3,14),c(1:3)*c(-14,-22.3,-22),90,c(3:1)*c(22,22.3,14))))
2个回答

6

我不太清楚你的目标是什么,但请看这是否回答了你的问题:

+ theme(axis.text.x = element_text(angle = 
            360/(2*pi)*rev( seq( pi/14, 2*pi-pi/14, len=14))))

这将使得名称与分裂点“切线”相关。如果您想要它们“垂直”(就像链接答案中的示例图),只需将角度加上π/2弧度即可。(难道我们都没有在高中学过几何吗?)

+ theme(axis.text.x = element_text(angle = 
            360/(2*pi)*rev( pi/2 + seq( pi/14, 2*pi-pi/14, len=14))))

顺便说一下:您指定的数据参数存在错误。我将“24”更改为“14”。

如果前7个标签看起来正确,但您想要图中左侧的标签翻转,请告诉我。

enter image description here

所以您想让底部6个标签旋转π弧度(= pi * 360/2 * π度):

+theme(axis.text.x = element_text(angle = 360/(2*pi)*rev( 
                                             seq(pi/14,2*pi-pi/14, len=14))+
  360/(2*pi)*c( rep(0, 4),rep(pi,6), rep(0,4)) )) 
                # the rotation "back" of the lower items

我真的不理解使用度而不是弧度的决定。


谢谢你提供的这些。是的,我指的是你提供的切线解决方案,将下面5个标签翻转以使其更易读。对不起,我的数学知识有限,高中时更喜欢文学而非数学。你所做的修改很好。 "错误"只是我之前绘图的遗留问题,实际上并不重要;我只是想让每一列填充相等,以使其更清晰易懂。再次感谢。 - proge

1
这是一个小例子,展示了如何实现 @42- 的解决方案。对我来说非常有用。
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)

ax <- length(unique(mtcars$gear))

ggplot(mtcars, aes(x = gear, y = cyl)) +
  geom_point() +
  coord_polar() +
  theme(
    axis.text.x = element_text(
      angle = 360/(2*pi)*rev(seq(pi/ax,2*pi-pi/ax, len=ax)) + 360/(2*pi)*c(rep(0, round(ax/3)),rep(pi,ax-2*round(ax/3)), rep(0,round(ax/3)))
    )
  ) +
  scale_y_discrete(
    breaks = levels(mtcars$cyl),
    limits = c(" ", levels(mtcars$cyl))
  ) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接