2011-10-20 22 views
6

私はggplot2を使用して極座標 - coord_polar()に多くの値の散布図をプロットしています。結果のグラフは、テキストが常にページの下部に揃えられているため、混雑しています。極座標x軸に沿って放射状に印刷されるようにテキストを配置することは可能ですか?例を提供するために、編集coord_polar()を使用しているときにggplot2のx軸テキストを回転させます

:大統領場合

qplot(data=presidential, name,end) + coord_polar() 

私が軸と一致するように角度を付け大統領の名前を見たい/彼らはオンになっている話を聞きました。以下は、私が作業しているグラフの例です。ここでは、x軸はカテゴリに属し、y軸は連続変数です(例に似ています)。ここ

enter image description here

+0

を使用すると、再現性を提供することができます例? – MYaseen208

+1

'theme_text(angle =)'が1つの値だけをサポートしていることを考えれば、軸ラベルを取り除き、角度を計算するgeom_textを使うことです。または、複数の角度を受け入れるようにソースを変更することもできます。しかし、私はggplot2の腸に精通した人にそれを任せます。 –

+0

'qplot(data = presidential、name、end)+ coord_polar()+ opts(axis.text.x = theme_text(angle = 360/8 * seq_along(president $ name)))'は警告を出しますが、 。ありがとうbaptiste。 – baptiste

答えて

4

座標のエレガントではない例です。

CoordPolar2 <- proto(CoordPolar, { 
    objname <- "polar2" 
    guide_foreground <- function(., details, theme) { 
    theta <- .$theta_rescale(details$theta.major, details) 
    labels <- details$theta.labels 

    # Combine the two ends of the scale if they are close 
    theta <- theta[!is.na(theta)] 
    ends_apart <- (theta[length(theta)] - theta[1]) %% (2*pi) 
    if (ends_apart < 0.05) { 
     n <- length(labels) 
     if (is.expression(labels)) { 
     combined <- substitute(paste(a, "/", b), 
      list(a = labels[[1]], b = labels[[n]])) 
     } else { 
     combined <- paste(labels[1], labels[n], sep="/") 
     } 
     labels[[n]] <- combined 
     labels <- labels[-1] 
     theta <- theta[-1] 
    } 

    grobTree(
     if (length(labels) > 0) { 
     lab <- theme_render(
      theme, "axis.text.x", 
      labels, 0.45 * sin(theta) + 0.5, 0.45 * cos(theta) + 0.5, 
      hjust = 0.5, vjust = 0.5, 
      default.units="native" 
     ) 
     lab$rot <- (pi/2 - theta)/pi * 180 
     lab 
     }, 
     theme_render(theme, "panel.border") 
    ) 
    } 
}) 

coord_polar2 <- CoordPolar2$build_accessor() 

p <- qplot(data=presidential, name,end) + coord_polar2() 
print(p) 

enter image description here

9

私は、これは古い話題であることを理解、私はインスピレーションを得た、この問題に対するより良い解決策を見つけましたバプテスのコメントから:

ggplot(data, aes(x=someId, y=someValue)) + 
    geom_point() + 
    coord_polar() + 
    theme(axis.text.x = element_text(
    angle= -90 - 360/length(unique(data$someId)) * seq_along(data$someId) 
    ) 
) 
4

Yoplaitの答えは大いに役立ちますが、グラフの半分を逆さまに読まなければならないという問題は解決していません。このポスターが提案するアイデアの延長は以下の通りです。

最初に確認してください、我々は二つにグラフを分割すること、角度ベクトルを準備します

sequence_length = length(unique(data$someId)) 
first_sequence = c(1:(sequence_length%/%2)) 
second_sequence = c((sequence_length%/%2+1):sequence_length) 
first_angles = c(90 - 180/length(first_sequence) * first_sequence) 
second_angles = c(-90 - 180/length(second_sequence) * second_sequence) 

をそして今、我々は実際のグラフにするために角度ベクトルを追加することができます。

ggplot(data, aes(x=someId, y=someValue)) + 
    geom_point() + 
    coord_polar() + 
    theme(axis.text.x = element_text(
    angle= c(first_angles,second_angles) 
    ) 
) 
関連する問題