2013-10-17 226 views
1

使用ggplot中的coor_polar投影,x軸標籤的角度如何與外部x軸的角度相同?這與rotate x-axis text in ggplot2 when using coord_polar()類似,但我不太瞭解數學以適應它。我在那種作品下找到了一個反覆試驗的解決方案,其中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軸標籤在相同的方向上旋轉也是可以的。如果一切都失敗了,我可能會放棄旋轉標籤並添加第二個圖例,如Two legends for polar ggplot (with one customized)。謝謝您的幫助!旋轉標籤在ggplot2中跟隨x軸,極座標投影?

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)))) 

回答

3

我不太清楚你的目標是,但是看看這個答案:

+ 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個標籤看起來是否正確,但是您希望翻轉圖形的LHS中的標籤。 enter image description here

所以,你要通過PI弧度(=圓周率×360/2 * PI度)旋轉底部6:

+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 

(我真不明白,使用度,而不是弧度的決定。 )

+0

感謝這些。是的,我指的是您提供的切線解決方案,其中較低的5個標籤翻轉得更具可讀性。對不起,我的數學無知,我更喜歡文學而不是高中數學。你做的編輯很好。「錯誤」只是我以前從事的工作的遺留物,並不重要;我只是想平均填寫每列,以減少混淆。再次感謝。 – proge

0

下面是一個小例子,可以實現@ 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)) 
)