ggplot2での軸ラベルの回転と間隔


670

X軸がラベルの長い因子であるプロットがあります。おそらく理想的な視覚化ではありませんが、今のところは、これらのラベルを回転させて垂直にしたいと思います。以下のコードでこの部分を理解しましたが、ご覧のとおり、ラベルが完全に表示されていません。

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + opts(axis.text.x=theme_text(angle=-90))

ここに画像の説明を入力してください

回答:


1113

最後の行を

q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

デフォルトでは、軸は回転してもテキストの中央に配置されます。+/- 90度回転する場合、通常は代わりに端に揃えます。

代替テキスト

上の画像はこのブログ投稿からのものです。


95
ggplot2の最新バージョンでは、コマンドは次のようになります q + theme(axis.text.x=element_text(angle = -90, hjust = 0))
rnorberg

55
ここで説明されているようにhjustが動作していない場合は、を試してくださいtheme(axis.text.x=element_text(angle = 90, vjust = 0.5))。ggplot2 0.9.3.1以降、これが解決策のようです。
リルスター2013

42
:実は、私は正しく整列を取得するための標識上記の二つのソリューション組み合わせる必要があったq + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
jupp0r

32
@ jupp0rは正しいです。theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))現在、1つが機能しています。

51
45度回転したラベルが読みやすい(読みやすい)場合theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))は、良い結果が得られます
jan-glx

89

目盛りラベルのテキストを完全に表示し、y軸ラベルと同じ方向に読み取るには、最後の行を

q + theme(axis.text.x=element_text(angle=90, hjust=1))

81

使用する coord_flip()

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

qplot(cut,carat,data = diamonds, geom = "boxplot") +
  coord_flip()

ここに画像の説明を入力してください


R for Data Scienceの 3.9章で、WickhamとGrolemundはこの正確な質問について述べています。

coord_flip()x軸とy軸を切り替えます。これは、(たとえば)水平箱ひげ図が必要な場合に便利です。また、長いラベルにも役立ちます。x軸が重ならないようにラベルを合わせるのは困難です。


26

代替のソリューションを提供したいと思います。キャンバスローテーション機能を導入して以来、ggternの最新バージョンでは、提案しようとしているものと同様の堅牢なソリューションが必要でした。

基本的に、element_text角度(つまり度)と位置(つまり、x、y、上または右)の情報を指定して、オブジェクトを返す関数を作成することにより、三角法を使用して相対位置を決定する必要があります。

#Load Required Libraries
library(ggplot2)
library(gridExtra)

#Build Function to Return Element Text Object
rotatedAxisElementText = function(angle,position='x'){
  angle     = angle[1]; 
  position  = position[1]
  positions = list(x=0,y=90,top=180,right=270)
  if(!position %in% names(positions))
    stop(sprintf("'position' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE)
  if(!is.numeric(angle))
    stop("'angle' must be numeric",call.=FALSE)
  rads  = (angle - positions[[ position ]])*pi/180
  hjust = 0.5*(1 - sin(rads))
  vjust = 0.5*(1 + cos(rads))
  element_text(angle=angle,vjust=vjust,hjust=hjust)
}

率直に言って、私の意見でggplot2は、hjustvjust引数で「自動」オプションを使用できるようにすべきだと思います。角度を指定するときは、とにかく、上記がどのように機能するかを示しましょう。

#Demonstrate Usage for a Variety of Rotations
df    = data.frame(x=0.5,y=0.5)
plots = lapply(seq(0,90,length.out=4),function(a){
  ggplot(df,aes(x,y)) + 
    geom_point() + 
    theme(axis.text.x = rotatedAxisElementText(a,'x'),
          axis.text.y = rotatedAxisElementText(a,'y')) +
    labs(title = sprintf("Rotated %s",a))
})
grid.arrange(grobs=plots)

これは以下を生成します:

例


1
同じ結果は得られません。私にとっては、autoメソッドを使用して軸テキストを調整することはできません。ただし、使用するとrads = (-angle - positions[[ position ]])*pi/180配置が改善されます。角度の前の追加のマイナス記号に注意してください。とにかくコードをありがとう:)
asac

7

ggpubrのパッケージの提供デフォルト(右揃えテキスト、ダニするミドル整列テキストボックス)で、正しいことをしてショートカットを:

library(ggplot2)
diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))
q <- qplot(cut, carat, data = diamonds, geom = "boxplot")
q + ggpubr::rotate_x_text()

reprexパッケージ(v0.2.1)によって2018-11-06に作成されました

関連する引数名のGitHub検索で見つかりました:https : //github.com/search?l=R& q=element_text+angle+90+vjust+org%3Acran &type=Code


6

また、ggplot 3.3.0提供guide_axis(n.dodge = 2)(としてguideの引数scale_..として、またはx引数guides垂直ラベルを避けにより過プロットの問題を克服するために)。この場合は非常にうまく機能します。

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

ggplot(diamonds, aes(cut, carat)) + 
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  NULL


1

追加の依存関係なしで読み取り可能なx目盛りラベルを取得するには、次を使用します。

  ... +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  ...

これにより、目盛りラベルが反時計回りに90°回転し、ラベルの端が垂直になり(hjust = 1)、中心が対応する目盛りに水平になります()vjust = 0.5)。

完全な例:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))


垂直/水平位置合わせパラメーターvjust/ hjustelement_text、テキストを基準にしていることに注意してください。したがって、水平方向の配置をvjust担当します。

vjust = 0.5それがなければ次のようになります:

q + theme(axis.text.x = element_text(angle = 90, hjust = 1))

hjust = 1それがなければ次のようになります:

q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

何らかの(有線の)理由で、目盛りラベルを時計回りに90度回転させたい場合(左から読み取れるように)、次のようにする必要がありますq + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1))

このすべてはこの回答のコメントですでに説明されていますが、私はこの質問に頻繁に戻るので、コメントを読まずにコピーするだけの回答を求めています。


0

の代替 coord_flip()ggstanceパッケージを使用することです。利点は、グラフを他の種類のグラフと簡単に組み合わせることができることと、おそらくより重要なこととして、座標系に固定縮尺率を設定できることです

library(ggplot2)
library(ggstance)

diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))

ggplot(data=diamonds, aes(carat, cut)) + geom_boxploth()

2020-03-11にreprexパッケージ(v0.3.0)によって作成されました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.