値の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
軸を1〜10、次に490〜500で動作させる方法はありますか?データをプロットする他の方法は考えられません(変換することは別として)
8年後、上記のコードは、同じチャートを作成するためにggplot2
のバージョン3.1.1で動作するように修正する必要があります。
library(ggplot2)
ggplot(df) +
aes(x = b, y = a) +
geom_col() +
coord_flip()
他の場所で述べたように、これはggplot2
がうまく処理するものではありません。壊れた軸は一般に疑わしいと考えられているからです。
他の戦略は、この問題に対するより良い解決策と見なされることがよくあります。ブライアンはいくつか言及しました(ファセット、異なる値のセットに焦点を当てた2つのプロット)。特にバーチャートの場合、見落とされることが多いもう1つのオプションは、tableを作成することです。
実際の値を見ると、500は他の値の違いをわかりにくくしていません!何らかの理由で、テーブルはデータとして十分な尊敬を得られません。データに多くのカテゴリがあり、テーブルでは扱いにくくなることに反対するかもしれません。もしそうなら、それはあなたの棒グラフも同様に賢明であるには多すぎる棒を持っている可能性があります。
そして、私はテーブルについて議論していませんall時間。ただし、バーが比較的少ないバーチャートを作成する場合は、必ず検討する必要があります。そして、大量のバーでバーチャートを作成している場合、とにかくそれを再考する必要があるかもしれません。
最後に、plotrix
パッケージには壊れた軸を実装するaxis.break
関数もあります。ただし、私が収集したものから、手動で軸のラベルと位置を指定する必要があります。
いいえ、ggplotを使用していません。 http://groups.google.com/group/ggplot2/browse_thread/thread/8d2acbfc59d2f247 のスレッドの議論を参照してください1つはすべてのデータを使用し、もう1つは特定の地域でズームします)。
Ggplotではなく、plotrixを使用すると簡単にできます。
library(plotrix)
gap.barplot(df$a, gap=c(5,495),horiz=T)
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))
_
残念ながら、現在のバージョン0.2.2のggforce
はcoord_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))
_
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)
_
または
_gridExtra::grid.arrange(g1, g2) # or Egg::ggarrange(g1, g2)
_
これは提案されました 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")
_
Rに既製のものがあるとは思いませんが、データを一連の3D部分立方体として表示できます。 500は5 * 10 * 10のみであるため、適切にスケーリングされます。正確な値はラベルです。
これはおそらくmustが何らかの理由でグラフィック表現を持っている場合にのみ使用すべきです。
1つの戦略は、Log Scaleをプロットするために軸を変更することです。これにより、指数関数的に高い値を10分の1に減らすことができます