269

次のggplotコマンドを使用しました。

ggplot(survey, aes(x = age)) + stat_bin(aes(n = nrow(h3), y = ..count.. / n), binwidth = 10)
  + scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2))
  + facet_grid(hospital ~ .)
  + theme(panel.background = theme_blank())

生産する

代替テキスト

ただし、ファセットラベルを短くしたいのですが(、Hosp 1などHosp 2)、長すぎて窮屈に見えるためです(グラフの高さを増やすことはできません。スペースがかかりすぎます。ドキュメント)。facet_gridヘルプページを見ましたが、方法がわかりません。

4

22 に答える 22

315

データの編集を回避するソリューションは次のとおりです。

プロットがgroupレベルを持つデータフレームの一部によってファセットされているとしますcontrol, test1, test2。次に、それらの値で名前が付けられたリストを作成します。

hospital_names <- list(
  'Hospital#1'="Some Hospital",
  'Hospital#2'="Another Hospital",
  'Hospital#3'="Hospital Number 3",
  'Hospital#4'="The Other Hospital"
)

次に、「ラベラー」関数を作成し、それを facet_grid 呼び出しにプッシュします。

hospital_labeller <- function(variable,value){
  return(hospital_names[value])
}

ggplot(survey,aes(x=age)) + stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
 + facet_grid(hospital ~ ., labeller=hospital_labeller)
 ...

これは、データ フレームのレベルを使用して Hospital_names リストにインデックスを付け、リストの値 (正しい名前) を返します。


これは、ファセット変数が 1 つしかない場合にのみ機能することに注意してください。2 つのファセットがある場合、ラベラー関数はファセットごとに異なる名前ベクトルを返す必要があります。次のようなものでこれを行うことができます:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else {
    return(facet2_names[value])
  }
}

facet1_namesfacet2_namesは、ファセット インデックス名 ('Hostpital#1' など) によってインデックス付けされた名前の定義済みリストです。


編集:ラベラーが知らない変数/値の組み合わせを渡すと、上記の方法は失敗します。次のように、未知の変数のフェイルセーフを追加できます。

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else if (variable=='facet2') {
    return(facet2_names[value])
  } else {
    return(as.character(value))
  }
}

facet と margin=TRUE を使用して ggplot で strip.text ラベルを変更する方法からの回答


編集:警告: この方法を使用して文字列でファセットを作成している場合、誤ったラベルが表示される可能性があります。このバグレポートを参照してください。ggplot2 の最近のバージョンで修正されました。

于 2012-08-24T06:28:32.867 に答える
140

基になる因子レベル名を次のように変更します。

# Using the Iris data
> i <- iris
> levels(i$Species)
[1] "setosa"     "versicolor" "virginica" 
> levels(i$Species) <- c("S", "Ve", "Vi")
> ggplot(i, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
于 2010-08-13T01:40:03.953 に答える
26

2 つのファセットがhospitalありroom、1 つのみの名前を変更したい場合は、次を使用できます。

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names)))

ベクトルベースのアプローチを使用して2つのファセットの名前を変更するには(naught101の回答のように)、次のことができます。

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names),
                                                 room = as_labeller(room_names)))
于 2016-06-12T20:44:12.223 に答える
9

ggplot が変数に実際に含まれるよりも少ない要素を表示する場合、このソリューションはうまく機能しないことに注意してください (たとえば、サブセット化を行った場合に発生する可能性があります)。

 library(ggplot2)
 labeli <- function(variable, value){
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
 }

 dat <- subset(iris,Species!="setosa")
 ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli)

簡単な解決策 (names_li にすべての未使用の要素を追加するのは面倒ですが) は、元のデータセットまたは labbeler 関数のいずれかで、droplevels() を使用して未使用の要素を削除することです。以下を参照してください。

labeli2 <- function(variable, value){
  value <- droplevels(value)
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
}

dat <- subset(iris,Species!="setosa")
ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli2)
于 2013-06-11T09:42:24.513 に答える
9

との両方ともfacet_wrap、からの入力を引数としてfacet_grid受け入れます。ifelseしたがって、ファセットに使用される変数が論理的である場合、解決策は非常に簡単です。

facet_wrap(~ifelse(variable, "Label if true", "Label if false"))

変数に複数のカテゴリがある場合、ステートメントをネストifelseする必要があります。

副作用として、これにより、グループの作成をggplot呼び出し内でファセットすることもできます。

于 2017-11-08T09:56:01.110 に答える