定制刻面条纹的美学

时间:2011-06-09 18:44:54

标签: r ggplot2 aesthetics

我试图用最近的一些ggplots对RB草案进行一些分析

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 = Pitcher,O = Outfield等。

我想显示每个分区内按职位选择的球员数量

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)如何将图例设置为Pitching,Outfield而不是P和O-这是一个我需要设置和包含的向量

d)看到每个球队选择的比例对每种类型的球员都有意义也很有趣。这是通过设置position =“fill”来完成的。我可以将轴设置为%而不是0到1.我还尝试设置geom_vline(aes(xintercept = 0.5) - 和yintercept,以防翻转因素 -  但该线未沿x轴出现在中间标记处

非常感谢

2 个答案:

答案 0 :(得分:7)

编辑:在抓取数据(并将其存储在名为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_wrapscalescoord_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计算的其他统计信息之一,而不是默认{{1}但是我找不到有效的组合。

相反(通常是坚持使用ggplot的即时转换时的最佳解决方案)我自己重塑了数据:

..count..

mlb2

显然有一点可以在这里完成,但这应该可以让你在那里大部分时间......

答案 1 :(得分: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时,通常可以通过修改用于构建绘图的数据找到解决方案,而不是绘图本身。这是一种不同的思考方式,但是一旦你习惯它就会得心应手。