web-dev-qa-db-ja.com

すべてのx軸値を含むggplot x軸ラベル

geom_pointggplotをプロットしています。 x軸は個人のIDで、y軸は変数Aです。ラベルを重複させずにx軸にすべてのID値を個別にggplotするにはどうすればよいですか? IDは連続していない場合があります。

dfサンプル(実際の行はもっと長いです)

> df
ID     A
1      4
2      12
3      45
5      1

プロットのコード:

ggplot(df, aes(x = ID, y = A)) + geom_point()

上記のコードには、間隔にx軸がありますが、個々のIDは表示されません。

ありがとう!

9
Lumos

これはあなたが探しているものですか?

_ID <- 1:50
A <- runif(50,1,100)

df <- data.frame(ID,A)

ggplot(df, aes(x = ID, y = A)) + 
  geom_point() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  scale_x_continuous("ID", labels = as.character(ID), breaks = ID)
_

これにより、この画像が生成されます。

enter image description here

したがって、すべてのID値のラベルを取得します。グリッド線を削除したい場合(私の好みには多すぎます)、theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())を追加して削除できます

EDIT:より簡単な方法は、プロットの要素としてIDを使用することです。このような:

_ggplot(df, aes(x = factor(ID), y = A)) + 
  geom_point() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  xlab("ID")
_

enter image description here

この方法の利点は、IDの欠落から空のスペースが得られないことです。

EDIT2:ラベルの重複に関する問題:プロットされる多数のIDに起因すると推測します。これに対処する方法はいくつかあります。プロットが次のようになっているとしましょう。

enter image description here

1つのアイデアは、軸のbreak引数を変更することにより、x軸から3番目のラベルをすべて非表示にすることです。

_ggplot(df, aes(x = factor(ID), y = A)) + 
  geom_point() + 
  scale_x_discrete(breaks = ID[c(T,F,F)]) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  xlab("ID")
_

これはこれにつながります:

enter image description here

ラベルを非表示にするオプションがない場合は、プロットをサブプロットに分割できます。

_df$group <- as.numeric(cut(df$ID, 4))

ggplot(df, aes(x = factor(ID), y = A)) + 
  geom_point() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  xlab("ID") +
  facet_wrap(~group, ncol = 1, scales = "free_x")
_

これはこれにつながります:

enter image description here

26
brettljausn