Настройка эстетики граненого барплота - PullRequest
5 голосов
/ 09 июня 2011

Я пытаюсь провести некоторый анализ недавнего черновика MLB с некоторыми ggplots в R

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) С переворотом координат команды перечислены в обратном алфавитном порядке вниз по странице. могу я прибегнуть. Также было бы неплохо оставить оправдание

в) Как мне установить легенду для Pitching, Outfield, а не P и O - это вектор, который мне как-то нужно установить и включить

d) Было бы также интересно узнать, какая доля каждой команды выбрана для каждого типа игроков. Это достигается установкой position = "fill". Могу ли я установить оси на%, а не от 0 до 1. Я также попытался установить geom_vline (aes (xintercept = 0.5) и yintercept в случае, если переворот учитывается в - но линия не появилась на полпути вдоль оси х

Помощь очень ценится

Ответы [ 2 ]

7 голосов
/ 09 июня 2011

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_grid, facet_wrap, scales, 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

Очевидно, что здесь можно сделать еще немного приятнее, но это поможет вамбольшая часть пути там ...

3 голосов
/ 09 июня 2011

Заполнение некоторых пробелов из ответа @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 решение часто можно найти, изменив ваши данные , которые используются длястроить сюжет, а не сам сюжет.Это другой способ думать о вещах, но он пригодится, когда вы к этому привыкнете.

...