#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))
В принципе, мог бы быть способ использовать ..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()
Очевидно, что здесь можно было бы сделать немного больше доработок, но это должно помочь вам пройти большую часть пути…
Комментарии:
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. Спасибо за ваше понимание, Джоран, особенно в отношении изменения данных