Настройка эстетики диаграммы направленности

#r #ggplot2 #aesthetics

#r #ggplot2 #эстетика

Вопрос:

Я пытаюсь провести некоторый анализ недавнего проекта 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 командам в каждом дивизионе

б) При переворачивании координат команды перечислены в обратном алфавитном порядке на нижней странице. могу ли я прибегнуть. Также было бы неплохо иметь левое выравнивание

c) Как мне установить для легенды значение «Подача», «Внешнее поле», а не «P» и «O» — это вектор, который мне каким-то образом нужно установить и включить

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

Помощь высоко ценится

Комментарии:

1. Если ваша цель состоит в том, чтобы просто поменять местами факторы, вы можете использовать reorder(Team, -as.numeric(Team)) в своем вызове ggplot2 aes для x= .

Ответ №1:

редактировать: полная реконструкция, включая информацию из другого ответа, после получения данных (и сохранения их в текстовом файле с именем 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

Очевидно, что здесь можно было бы сделать немного больше доработок, но это должно помочь вам пройти большую часть пути…

Комментарии:

1. a) Отображаются правильные данные, но ось команд показывает только пять команд для первого дивизиона

2. Если вы включите большую часть своих данных с помощью dput() , нам будет проще помочь вам.

3. Хм. Можете ли вы опубликовать возможно небольшое, но достаточно полное подмножество данных (т. Е. воспроизводимый пример) либо с помощью dput , либо разместив данные где-нибудь в Интернете и разместив URL-адрес? (Я пропустил комментарий джорана, который в основном идентичен)

4. Не знаком с dput(), но попробую с помощью. В противном случае я, вероятно, смогу опубликовать некоторые данные в Интернете

5. попробуйте эту ссылку для получения данных

Ответ №2:

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

Комментарии:

1. выглядит неплохо, но я не думаю, что вам действительно нужен упорядоченный фактор — ggplot отображает факторы в порядке их уровней, упорядочены они или нет … (Я не уверен в этом на 100%, но тест был бы довольно простым)

2. Спасибо за ваше понимание, Джоран, особенно в отношении изменения данных