12

ファセットごとに軸の 1 つだけを変更できる、反転した座標を使用してファセット プロットを作成しようとしています。

require(ggplot2)
p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "free_y") + coord_flip()

ここに画像の説明を入力

このプロットは、プロットごとに間違った目盛りと目盛りラベルが繰り返されるため、満足のいくものではありません。すべての縦軸ではなく、すべての横軸に目盛りが必要です。

これは予期しない動作です。なぜなら、プロットは、水平軸の目盛りが上部パネルと下部パネルで同じであることを示唆しているが、そうではないからです。この実行を確認するには:

p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "fixed") + coord_flip()

私の質問は次のとおりです。右のファセットの垂直軸の目盛りを削除し、水平軸の目盛りとラベルを上部のファセットに追加する方法はありますか?

Paul が以下で洞察力を持って指摘しているように、qplot() で x と y を交換し、coord_flip() を回避することで、私が示した例に対処できます。実行できる水平軸:

c <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
c + facet_wrap(~cut, scales = "free_y") + coord_flip()

画像

これらのファセットには可変の水平軸がありますが、水平軸の目盛りが繰り返されるのではなく、垂直軸の目盛りが繰り返されます。散布図とは異なり、棒グラフは回転対称ではないため、ポールのトリックはここではうまくいかないと思います。

部分的または完全な解決策を聞きたいです。

4

3 に答える 3

8

coord_flipとの併用がfacet_wrap問題です。最初に特定の軸を自由に定義し (x軸)、次に軸を交換してy軸を自由にします。現在、これは ggplot2 ではうまく再現されていません。

最初の例では、を使用しないことをお勧めcoord_flipしますが、への呼び出しで変数を交換し、次qplotを使用するだけfree_xです。

p <- qplot(hwy, displ, data = mpg)
p + facet_wrap(~ cyl, scales = "free_x")

ここに画像の説明を入力

于 2012-09-24T07:53:08.950 に答える
6

私がこの問題に遭遇したのは、これが 2 回目か 3 回目です。カスタム geom を定義することで、独自のソリューションをハッキングできることがわかりました。

geom_bar_horz <- function (mapping = NULL, data = NULL, stat = "bin", position = "stack", ...) {
  GeomBar_horz$new(mapping = mapping, data = data, stat = stat, position = position, ...)
}

GeomBar_horz <- proto(ggplot2:::Geom, {
  objname <- "bar_horz"

  default_stat <- function(.) StatBin
  default_pos <- function(.) PositionStack
  default_aes <- function(.) aes(colour=NA, fill="grey20", size=0.5, linetype=1, weight = 1, alpha = NA)

  required_aes <- c("y")

  reparameterise <- function(., df, params) {
    df$width <- df$width %||%
      params$width %||% (resolution(df$x, FALSE) * 0.9)
    OUT <- transform(df,
              xmin = pmin(x, 0), xmax = pmax(x, 0),
              ymin = y - .45, ymax = y + .45, width = NULL
    )
    return(OUT)
  }

  draw_groups <- function(., data, scales, coordinates, ...) {
    GeomRect$draw_groups(data, scales, coordinates, ...)
  }
  guide_geom <- function(.) "polygon"
})

これは、ggplot2 github から geom_bar コードをコピーし、x参照とy参照を切り替えて、標準のデカルト コーディネーターで水平棒グラフを作成するだけです。

これを機能させるには、おそらく and も使用する必要があることに注意してください。ID 以外の位置を使用する必要がある場合は、適切に機能するように衝突機能を編集する必要があります。position='identity'stat='identity'

于 2014-07-10T21:19:35.770 に答える
2

私はちょうど水平バープロットを実行しようとしていて、私が望んでいたこの問題に遭遇しましたscales = "free_x"。結局、従来の (垂直の) 棒グラフを作成し、頭を左に傾けると目的のプロットのように見えるようにテキストを回転させる方が簡単に思えました。そして、プロットが完成したら、PDF/画像出力を回転させます(!)

ggplot(data, aes(x, y)) +
  geom_bar(stat = "identity") +
  facet_grid(var ~ group, scale = "free", space = "free_x", switch = "both") +
  theme(axis.text.y  = element_text(angle=90), axis.text.x = element_text(angle = 90),
                     strip.text.x = element_text(angle = 180))

これを行うための主なキーswitch = "both"は、ファセット ラベルを他の軸に移動する とelement_text(angle=90)、軸ラベルとテキストを回転させる です。

于 2015-10-23T01:39:14.457 に答える