2017-02-21 7 views
3

Я пытаюсь проанализировать данные о футболе, где конкретные проходы и цели отслеживаются в течение трех периодов игры или срока. Также отслеживается тип защитной структуры или режима, применяемого одной командой. Пример моего набора данных ниже:Как построить отдельные компоненты в горизонтальной гистограмме?

# Example data 
Time <- c(1, 1, 2, 3, 4, 5, 6, 9, 1, 2, 3, 5, 5, 7, 9, 1, 2, 4, 7, 9) 
Event <- c("Pass", "Pass", "Pass", "Goal", "Pass", "Pass", "Goal", "Pass", "Pass", 
      "Pass", "Pass", "Pass", "Pass", "Pass", "Pass", "Goal", "Pass", "Pass", "Pass", "Goal") 
Term <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3) 
Symbol <- c("P", "P", "P", "G", "P", "P", "G", "P", "P", 
      "P", "P", "P", "P", "P", "P", "G", "P", "P", "P", "G") 
By <- c("Home", "Away", "Home", "Home", "Home", "Away", "Away", "Away", "Home", 
      "Home", "Home", "Away", "Away", "Away", "Home", "Home", "Home", "Away", "Away", "Away") 
Mode <- c("Press", "Press", "Press", "Forward", "Forward", "Forward", "Forward", "Press", "Press", 
      "Press", "Press", "Press", "Press", "Forward", "Forward", "Forward", "Forward", "Press", "Press", "Forward") 
# Make data.frame 
GameData <- data.frame(Time, Event, Term, Symbol, By, Mode) 
# Make factors 
GameData$Event <- as.factor(GameData$Event) 
GameData$Symbol <- as.factor(GameData$Symbol) 
GameData$Mode <- as.factor(GameData$Mode) 
GameData$Term <- as.factor(GameData$Term) 
GameData$By <- as.factor(GameData$By) 

Я хочу, чтобы представить себе, когда эти проходы и цели выполняются по времени, в соответствии с тем, когда режим изменяется. Однако, когда я рисую это как показатель горизонтальной полосы в ggplot2, время вместо этого суммируется, а не изменяется цвет в соответствующее время. Например, максимальное время для каждого слагаемого составляет 9 минут, а ось x - до 30? Мой код участка ниже:

# Load package 
require(ggplot2) 
# Plot 
ggplot(GameData, aes(x = Term, y = Time, fill = Mode)) + 
    geom_bar(stat = "identity") + 
    geom_text(data = GameData, aes(label = Symbol, colour = By), size = 9) + 
    scale_color_manual(values =c("black", "red")) + 
    coord_flip() + 
    scale_x_discrete(limits = rev(levels(GameData$Term))) 

Я чувствую, что это глупая ошибка, но где я буду неправильно, поэтому изменения цвета/режима в соответствующее время?

Подводя итог, я хочу, чтобы фон графика ниже имел различный цвет для каждого Mode над Time для каждого Term.

# Plot 
ggplot(GameData, aes(x = Term, y = Time, fill = Mode)) + 
    geom_text(data = GameData, aes(label = Symbol, colour = By), size = 9) + 
    scale_color_manual(values =c("black", "red")) + 
    coord_flip() + 
    scale_x_discrete(limits = rev(levels(GameData$Term))) + 
    theme_classic() 

Спасибо.

+0

У меня возникли проблемы с визуализацией того, как вы хотите, чтобы ваш результат выглядел. Не могли бы вы набросать, как вы хотите, чтобы это выглядело, только для термина 1? Я смущен тем, что у вас есть 2 строки с Time = 1 и без строк с Time = 7 или 8, но вам нужна гистограмма с добавлением ... Кажется, что есть дыры. Возможно, вам захочется «geom_tile»? – Gregor

+0

Вы можете сделать 'position = 'identity'', но затем один бар, который идет до 9, закрывает все под ним. – Gregor

+0

Да, я также попробовал 'position =" identity ", однако я не могу визуализировать, когда изменяется режим. Время соответствует событию, но «Срок» длится не более 9 минут. – user2716568

ответ

1

Вот частичное решение, использующее geom_tile() для рисования цветных полос (спасибо за идею @Gregor).

# Work around to make sure Time=8 appears on x-axis. 
GameData$discrete_time = factor(GameData$Time, levels=paste(1:9)) 

plot1 = ggplot(GameData, aes(y=Term, x=discrete_time)) + 
     geom_tile(aes(fill=Mode)) + 
     geom_text(aes(label=Symbol, colour=By), size=9) + 
     scale_color_manual(values=c("black", "white")) + 
     scale_fill_brewer(palette="Set1") + 
     scale_x_discrete(drop=FALSE) 

ggsave("plot.png", plot=plot1, width=9, height=3, dpi=150) 

enter image description here


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

  • Вы можете заполнить пустые плитки путем добавления соответствующих строк данных (набор символов для NA раскрасить плитку, но оставить Pass/Goal).
  • Есть несколько мест (например, Term = 1, Time = 1), где есть два «Прохода», которые полностью перекрываются. Я пробовал различные уклонения, дрожания, стратегии группировки, но ничего не выглядело хорошо и выявило перекрывающиеся события. Решение этой проблемы станет более важным, если вы увеличите масштаб до более крупных наборов данных.

 Смежные вопросы

  • Нет связанных вопросов^_^