web-dev-qa-db-ja.com

ggplot2を使用して、軸にブレークを挿入できますか?

値の1つが他のすべての値よりはるかに大きい棒グラフを作成します。不連続なY軸を持つ方法はありますか?私のデータは次のとおりです。

df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4'))

p <- ggplot(data = df, aes(x = b, y = a)) + geom_bar() 
p <- p + opts(axis.text.x=theme_text(angle= 90, hjust=1))  + coord_flip()
p

enter image description here

軸を1〜10、次に490〜500で動作させる方法はありますか?データをプロットする他の方法は考えられません(変換することは別として)

[2019-05-06編集]:

8年後、上記のコードは、同じチャートを作成するためにggplot2のバージョン3.1.1で動作するように修正する必要があります。

library(ggplot2)
ggplot(df) + 
  aes(x = b, y = a) +
  geom_col() +
  coord_flip()
51
djq

他の場所で述べたように、これはggplot2がうまく処理するものではありません。壊れた軸は一般に疑わしいと考えられているからです。

他の戦略は、この問題に対するより良い解決策と見なされることがよくあります。ブライアンはいくつか言及しました(ファセット、異なる値のセットに焦点を当てた2つのプロット)。特にバーチャートの場合、見落とされることが多いもう1つのオプションは、tableを作成することです。

enter image description here

実際の値を見ると、500は他の値の違いをわかりにくくしていません!何らかの理由で、テーブルはデータとして十分な尊敬を得られません。データに多くのカテゴリがあり、テーブルでは扱いにくくなることに反対するかもしれません。もしそうなら、それはあなたの棒グラフも同様に賢明であるには多すぎる棒を持っている可能性があります。

そして、私はテーブルについて議論していませんall時間。ただし、バーが比較的少ないバーチャートを作成する場合は、必ず検討する必要があります。そして、大量のバーでバーチャートを作成している場合、とにかくそれを再考する必要があるかもしれません。

最後に、plotrixパッケージには壊れた軸を実装するaxis.break関数もあります。ただし、私が収集したものから、手動で軸のラベルと位置を指定する必要があります。

44
joran

いいえ、ggplotを使用していません。 http://groups.google.com/group/ggplot2/browse_thread/thread/8d2acbfc59d2f247 のスレッドの議論を参照してください1つはすべてのデータを使用し、もう1つは特定の地域でズームします)。

26
Brian Diggs

Ggplotではなく、plotrixを使用すると簡単にできます。

library(plotrix)
gap.barplot(df$a, gap=c(5,495),horiz=T)
21
Wouter

いいえ、残念ながらありません

恐れは、不連続な軸を許可すると聴衆の欺deにつながることです。ただし、不連続軸を持たない歪みが生じる場合があります。

たとえば、軸が切り捨てられているが、通常は一定の間隔([0,1]など)内にある場合、視聴者は切り捨てに気付かず、データについてゆがんだ結論を出すことができます。この場合、明示的な不連続軸がより適切で透明になります。

比較する:

Example of good use of continuous vs discontinuous axis

15
milo

8年後、ggforceパッケージは、2つのプロットを表示するために Hadley Wickhamの提案 の実装であるfacet_zoom()拡張を提供します( Brian Diggsの答え )。

ズームファセット

_library(ggforce)
ggplot(df) + 
  aes(x = b, y = a) +
  geom_col() +
  facet_zoom(ylim = c(0, 10))
_

enter image description here

残念ながら、現在のバージョン0.2.2のggforcecoord_flip()でエラーをスローするため、垂直バーのみを表示できます。

ズームされたファセットは、小さい値のバリエーションを示しますが、まだ大きい-トリミングされた-_a4_バーを含みます。 _zoom.data_パラメーターは、ズームされたファセットに表示される値を制御します。

_library(ggforce)
ggplot(df) + 
  aes(x = b, y = a) +
  geom_col() +
  facet_zoom(ylim = c(0, 10), zoom.data = ifelse(a <= 10, NA, FALSE))
_

enter image description here

2つのプロット

ハドリー・ウィッカムの提案

2つのプロットを表示する方がはるかに適切だと思います。1つはすべてのデータ、もう1つは小さな値です。

このコードは2つのプロットを作成します

_library(ggplot2)
g1 <- ggplot(df) + 
  aes(x = b, y = a) +
  geom_col() +
  coord_flip()
g2 <- ggplot(df) + 
  aes(x = b, y = a) +
  geom_col() +
  coord_flip() +
  ylim(NA, 10)
_

によって1つのプロットに結合できます

_cowplot::plot_grid(g1, g2) # or ggpubr::ggarrange(g1, g2)
_

enter image description here

または

_gridExtra::grid.arrange(g1, g2) # or Egg::ggarrange(g1, g2)
_

enter image description here

2つのファセット

これは提案されました Chaseによるコメントで そしてまた 彼の答え のBrian Diggsがハドレーの提案を解釈した人

ファセットプロット、1つはすべてのデータ、1つは特定の領域でズーム

しかし、これまでのところ、このアプローチにはコードが提供されていませんでした。

ファセットを個別にスケーリングする簡単な方法はないため( 関連する質問 などを参照)、データを操作する必要があります。

_library(dplyr)
library(ggplot2)
ggplot() + 
  aes(x = b, y = a) +
  geom_col(data = df %>% mutate(subset = "all")) +
  geom_col(data = df %>% filter(a <= 10) %>% mutate(subset = "small")) +
  coord_flip() + 
  facet_wrap(~ subset, scales = "free_x")
_

enter image description here

3
Uwe

Rに既製のものがあるとは思いませんが、データを一連の3D部分立方体として表示できます。 500は5 * 10 * 10のみであるため、適切にスケーリングされます。正確な値はラベルです。

これはおそらくmustが何らかの理由でグラフィック表現を持っている場合にのみ使用すべきです。

0
Ed Staub

1つの戦略は、Log Scaleをプロットするために軸を変更することです。これにより、指数関数的に高い値を10分の1に減らすことができます

0
webscale