5

私はRのいくつかのggplotsで最近のMLBドラフトのいくつかの分析をしようとしています

selection <- draft[c("Team","Division","Position")]
head(selection)

  Team   Division Position
1  pit NL Central        P
2  sea AL West           P
3  ari NL West           P
4  bal AL East           P
5  kc  AL Central        O
6  was NL East           I

ここで、P =ピッチャー、O=外野手など。

各部門内のポジションごとにチームごとに選ばれた選手の数を表示したい

p <- ggplot(data=selection, aes(x=Team, fill= Position))  + geom_bar(position="stack")
p <-  p + coord_flip()
p <- p+ ylab("Players Selected")
p <- p + facet_wrap(~Division)
p

これは私をそこへの道の一部にしますが、非常に魅力的ではありません

a)グループ化は機能しますが、すべてのチームが各部門グリッドに表示されます-各部門の5または6チームのみが実際に-そして正しく-データを表示しますが

b)コーディネイトフリップを使用すると、チームはアルファベットの逆順でページの下に一覧表示されます。リゾートできますか?正当化を残しておくのもいいでしょう

c)凡例をPとOではなくピッチング、外野に設定するにはどうすればよいですか?これはどういうわけか設定して含める必要のあるベクトルですか

d)各タイプのプレーヤーにコミットされた各チームの選択の割合を確認することも興味深いでしょう。これは、position="fill"を設定することで実現されます。軸を0から1ではなく%に設定できますか?geom_vline(aes(xintercept = 0.5)-およびフリップが考慮された場合はyintercept-を設定しようとしましたが、x軸に沿った中間マークに線が表示されませんでした

感謝します

4

2 に答える 2

7

edit : データを取得 (および というテキスト ファイルに保存) した後、他の回答からの情報を含めて完全に改造し、mlbtmp.txtさらにいくつかの実験を行いました。

selection <- read.table("mlbtmp.txt",skip=1)
names(selection) <- c("row","League","Division","Position","Team")
## arrange order/recode factors
selection <- transform(selection,
       Team=factor(Team,levels=rev(levels(Team))),
                   Position=factor(Position,levels=c("P","I","C","O"),
                                  labels=c("Pitching","Infield",
                                    "Center","Outfield")))

facet_gridfacet_wrapscales、などのさまざまな順列をいじってみcoord_flipました。一部は期待どおりに機能し、一部は機能しませんでした。

library(ggplot2)
p <- ggplot(data=selection, aes(x=Team, fill= Position))  +
  geom_bar(position="stack")
p + facet_grid(.~Division,scales="free_x") + coord_flip()  ## OK

## seems to fail with either "free_x" or "free_y"
p + facet_grid(Division~.,scales="free") + coord_flip()

## works but does not preserve 'count' axis:
p + facet_wrap(~Division,scales="free")

私は結局、軸を拘束するためにfacet_wrap(...,scales="free")使用されました。ylim

p + facet_wrap(~Division,scales="free") + coord_flip() +
  ylim(0,60) + opts(axis.text.y=theme_text(hjust=0))

mlb1

原則として、デフォルトの の代わりに..density....ncount....ndensity..、または によって計算されるその他の統計のいずれかを使用する方法があるかもしれませんが、機能する組み合わせを見つけることができませんでした。stat_bin..count..

代わりに (ggplot のオンザフライ変換に行き詰まった場合に最適なソリューションであることが多いため)、自分でデータを再形成しました。

## pull out Team identification within Division and League
stab <- unique(subset(selection,select=c(Team,Division,League)))
## compute proportions by team
s2 <- melt(ddply(selection,"Team",function(x) with(x,table(Position)/nrow(x))))
## fix names
s2 <- rename(s2,c(variable="Position",value="proportion"))
## merge Division/League info back to summarized data
s3 <- merge(s2,stab)

p2 <- ggplot(data=s3, aes(x=Team, fill= Position,y=proportion))  +
  geom_bar(position="stack")+scale_y_continuous(formatter="percent")+
  geom_hline(yintercept=0.5,linetype=3)+ facet_wrap(~Division,scales="free") +
  opts(axis.text.y=theme_text(hjust=0))+coord_flip()

mlb2

明らかに、ここで行うことができるもう少しきれいなものがありますが、これでほとんどの方法が得られるはずです...

于 2011-06-09T18:58:42.517 に答える
3

@Ben Bolkerの答えからいくつかのギャップを埋める...

チームを異なる順序で並べ替えるには、その列を要因として保存する必要があります。各部門のチームを別々に注文する可能性が高いため、必要な順序を指定するための短くて迅速な方法はおそらくないでしょう。これは、各部門のサブセットが適切に順序付けされたままになるように、すべてのチームを順序付けする必要があることを意味します。次のようなもの (これは概略図であり、構文的に正しくありません):

selection$Team <- factor(selection$Team,
    levels=c( (AL East teams in desired order), 
              (AL Central teams in desire order), etc))

あなたが計算した他のものに応じて、それを指定する簡単な方法があるかもしれませんし、それらを手動で書き出さなければならないかもしれません.

軸のテキストの位置合わせは、次の方法で変更できます

opts(axis.text.x=theme_text(hjust=1))

少し戻って、ggplot2 では、プロット自体ではなく、プロットの作成に使用されるデータを変更することで解決策が見つかることが多いことに注意してください。考え方は違いますが、慣れると便利です。

于 2011-06-09T19:43:17.693 に答える