аспекты в ggplot, размещающие неправильные наблюдения в графиках переменных

Я пытаюсь построить график, используя функцию Facets из ggplot2 из простого data.frame, извлеченного из пакета Lahman. Тем не менее, он размещает некоторые наблюдения на неправильном графике переменных. Я пытался использовать несколько конфигураций в аргументах facet_grid, но все они имеют неправильное размещение наблюдений.

Здесь ниже код для воспроизведения сюжета.

library(Lahman)
library(tidyverse)
library(plotly)

TmsStd <- Teams

TmsStd <- TmsStd %>% select(yearID, lgID, teamID, divID, Rank, W, L, DivWin, WCWin, LgWin, WSWin, name, teamIDBR)

TmsStd$WLPctg <- TmsStd$W / (TmsStd$W + TmsStd$L)

TmsStd <- TmsStd %>% arrange(yearID, desc(WLPctg))

TmsStd$OvSeaRank <- ave(TmsStd$WLPctg, TmsStd$yearID, FUN = seq_along)

TmPostS <- TmsStd %>% filter(OvSeaRank <= 4 & WSWin == "Y" & yearID > 1970) %>% select(yearID, teamIDBR, W, L, WLPctg, OvSeaRank)

Best_Post <- ggplot(data = TmPostS, aes(x = yearID)) +
  geom_bar() + 
  ggtitle("ABC") +
  xlab("Year") + ylab("") +
  facet_grid(OvSeaRank ~ .) +
  theme_light()

Best_Post

график facet_grid

Наблюдается только одно наблюдение в год.

table(TmPostS$yearID)

1971 1972 1973 1974 1975 1976 1977 1978 1979 1981 1982 1983 1984 1986 1988 1989 1990 1991 1992 1993 1995 1996 
   1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    1 
1997 1998 1999 2002 2004 2005 2007 2009 2013 2015 
   1    1    1    1    1    1    1    1    1    1 

Поэтому он должен существовать только одну строку в год независимо от переменной «OvSeaRank».

Любой намек на то, что я могу делать неправильно?

Заранее спасибо.


person darh78    schedule 28.10.2016    source источник
comment
На данный момент вы только строите отношения между годом и рангом. Это не очень информативно, особенно с учетом того, что в год проводится только одно наблюдение. Можете подробнее объяснить, что вы хотите показать?   -  person Joe    schedule 29.10.2016
comment
Привет, Джо, я хочу построить линейку для каждого года, чтобы увидеть, каков был рейтинг команд-чемпионов в регулярном сезоне.   -  person darh78    schedule 29.10.2016
comment
Все столбцы должны быть взаимоисключающими на графике по годам.   -  person darh78    schedule 29.10.2016
comment
Аааа, кажется, я понял, что ты имеешь в виду. Ответ заключается в использовании stat="identity". Добавлю ответ сейчас.   -  person Joe    schedule 29.10.2016
comment
Кстати, здесь есть хорошее объяснение: cookbook-r.com/Graphs/ Bar_and_line_graphs_(ggplot2)   -  person Joe    schedule 29.10.2016


Ответы (2)


По умолчанию geom_bar будет подсчитывать количество вхождений каждого года (которое всегда равно 1), а не значение. Вам нужно изменить поведение по умолчанию с помощью stat="identity", чтобы оно использовало значение столбца.

ggplot(TmPostS, aes(x = yearID, y=OvSeaRank)) + geom_bar(stat="identity") + 
ggtitle("ABC") + xlab("Year") + ylab("") + facet_grid(OvSeaRank ~ .) +
theme_light()

введите описание изображения здесь

На самом деле лучше без огранки, потому что у вас действительно недостаточно переменных в сюжете. Отсутствие facet_grid(OvSeaRank ~ .) дает следующее: введите здесь описание изображения

Идея Как насчет того, чтобы использовать geom_line и перевернуть ось Y для ранга?

ggplot(TmPostS, aes(x = yearID, y=OvSeaRank)) + geom_line() + geom_point() + 
scale_y_reverse() + ggtitle("ABC") + xlab("Year") + ylab("Rank of champion") + theme_light()

введите описание изображения здесь

person Joe    schedule 29.10.2016
comment
Привет, Джо, спасибо за ответ. Совет по ссылке на поваренную книгу помог мне найти то, что я хотел (см. мой ответ). Идея использования geom_line показывает хорошее понимание того, что я хотел визуализировать. - person darh78; 30.10.2016
comment
Добро пожаловать! Иногда нужно перепробовать несколько вариантов, прежде чем найти подходящий :-) - person Joe; 30.10.2016

Благодаря поддержке Джо я смог найти то, что хотел показать по этому вопросу. Я модифицировал stat = "identity" на stat = "bin" и определял bindwidth = 1

ggplot(TmPostS, aes(x = yearID)) + geom_bar(stat="bin", binwidth = 1, color = "red", fill = "darkblue") + 
  ggtitle("World Series Champions based on their regular season W-L% overall rank") + xlab("Season") + ylab("") + facet_grid(OvSeaRank ~ .) +
  theme_bw() +
  theme(axis.text.y=element_blank(), 
        axis.ticks = element_blank())

Граф желаемого с использованием фасетов

В этом случае теперь во фрейме данных учитываются все чемпионы MLB с 1884 года.

Наконец, используя идею geom_line от Джо:

ggplot(TmPostS, aes(x = yearID, y=OvSeaRank)) + geom_line(colour = "darkblue") + geom_point(colour = "red") + 
  scale_y_reverse() + ggtitle("World Series Champions based on their regular season W-L% overall rank") + xlab("Year") + ylab("Rank of champion") + theme_light()

Альтернативный график с использованием geom_line

person darh78    schedule 30.10.2016