2015-01-06 2 views
3

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

у меня есть набор данных dvl, который имеет пять столбцов, Variant, регион, время, Человек и PrecededByPrep. Я хотел бы сделать многомерное сравнение Варианта с другими четырьмя предикторами. Каждый столбец может иметь один из двух возможных значений:

  • Вариант: elk или ieder.
  • Регион = VL или NL.
  • Время: time или no time
  • лицо: person или no person
  • PrecededByPrep: 1 или 0

Вот логистическая регрессия

Из ответов я понял, что библиотека ggplot2 может быть лучшая библиотека для рисования. Я прочитал его документацию, но для жизни меня не могу понять, как это сделать: как я могу получить сравнение Variant с тремя другими факторами?

Мне потребовалось некоторое время, но я сделал что-то похожее в Photoshop, чтобы я хотел (вымышленные значения!).

graph

Темно-серый/светло-серый: возможные значения Variant оси у: частота ось х: каждый столбец, подразделяют на его возможные значения

Я знаю, что делать индивидуальные штриховые графики, both stacked and grouped, но в принципе я не знаю, как складывать, группировать графики. ggplot2 можно использовать, но если это можно сделать, я бы предпочел это.

Я думаю, что это можно рассматривать как образец данных, хотя я не совсем уверен. Я начинаю с R, и я читал о создании набора образцов.

t <- data.frame(Variant = sample(c("iedere","elke"),size = 50, replace = TRUE), 
      Region = sample(c("VL","NL"),size = 50, replace = TRUE), 
      PrecededByPrep = sample(c("1","0"),size = 50, replace = TRUE), 
      Person = sample(c("person","no person"),size = 50, replace = TRUE), 
      Time = sample(c("time","no time"),size = 50, replace = TRUE)) 

Я бы хотел, чтобы этот участок был эстетически приятным. То, что я имел в виду:

  • цвета участка (т.е. для баров): col=c("paleturquoise3", "palegreen3")
  • Полужирный шрифт для метки оси font.lab=2 но не для меток значений (например,'region in bold, but В.Л. and NL` не выделены жирным шрифтом)
  • #404040 как цвет для шрифта, оси и линии
  • Этикетки для осей: X: factors, у: frequency
+2

Небольшие точки: наличие нескольких предикторов не делает ваш анализ «многомерным»; это было обычное использование в 1970-х годах, но больше не было. Я редактировал «двухвалентный» в «двоичный». –

+1

Большая точка. Кажется, вы в основном просите R-код. Это сделало бы это вне темы: см. Справочный центр для консультаций по вопросам, связанным с программным обеспечением. Есть возможность сделать это более статистическим, но вам нужно будет расширить те виды сюжетов, которые вы себе представляете; в настоящее время он полностью открыт, поэтому он слишком широк. –

+0

@NickCox Пожалуйста, см. Мое редактирование, я прилагаю много усилий в этом, поэтому надеюсь, что этого достаточно, чтобы сделать более выполнимый вопрос. –

ответ

6

Вот одна возможность который начинается с «нестабилизированного» кадра данных, melt его, постройте его с помощью geom_bar в ggplot2 (что делает подсчет для каждой группы), разделите график по переменной с помощью facet_wrap.

Создать игрушку данные:

set.seed(123) 
df <- data.frame(Variant = sample(c("iedere", "elke"), size = 50, replace = TRUE), 
      Region = sample(c("VL", "NL"), size = 50, replace = TRUE), 
      PrecededByPrep = sample(c("1", "0"), size = 50, replace = TRUE), 
      Person = sample(c("person", "no person"), size = 50, replace = TRUE), 
      Time = sample(c("time", "no time"), size = 50, replace = TRUE)) 

Reshape данные:

library(reshape2) 
df2 <- melt(df, id.vars = "Variant") 

Участок:

library(ggplot2) 
ggplot(data = df2, aes(factor(value), fill = Variant)) + 
    geom_bar() + 
    facet_wrap(~variable, nrow = 1, scales = "free_x") + 
    scale_fill_grey(start = 0.5) + 
    theme_bw() 

enter image description here

Есть много возможностей для настройки график, такой как setting order of factor levels, rotating axis labels, wrapping facet labels on two lines (например, для более длинного имени переменной «PrecededByPrep») или changing spacing between facets.

Настройка (после обновления в вопросе и комментарии OP)

# labeller function used in facet_grid to wrap "PrecededByPrep" on two lines 
# see http://www.cookbook-r.com/Graphs/Facets_%28ggplot2%29/#modifying-facet-label-text 
my_lab <- function(var, value){ 
    value <- as.character(value) 
    if (var == "variable") { 
     ifelse(value == "PrecededByPrep", "Preceded\nByPrep", value) 
    } 
} 

ggplot(data = df2, aes(factor(value), fill = Variant)) + 
    geom_bar() + 
    facet_grid(~variable, scales = "free_x", labeller = my_lab) + 
    scale_fill_manual(values = c("paleturquoise3", "palegreen3")) + # manual fill colors 
    theme_bw() + 
    theme(axis.text = element_text(face = "bold"), # axis tick labels bold 
     axis.text.x = element_text(angle = 45, hjust = 1), # rotate x axis labels 
     line = element_line(colour = "gray25"), # line colour gray25 = #404040 
     strip.text = element_text(face = "bold")) + # facet labels bold 
    xlab("factors") + # set axis labels 
    ylab("frequency") 

enter image description here

Добавить счетчики для каждого стержневого (редактировать следующий комментариев от OP).

Основные принципы расчета координат y можно найти в this Q&A. Здесь я использую dplyr для подсчета подсчетов на бар (то есть label в geom_text) и их координаты y, но это, конечно же, можно было бы сделать в base R, plyr или data.table.

# calculate counts (i.e. labels for geom_text) and their y positions. 
library(dplyr) 
df3 <- df2 %>% 
    group_by(variable, value, Variant) %>% 
    summarise(n = n()) %>% 
    mutate(y = cumsum(n) - (0.5 * n)) 

# plot 
ggplot(data = df2, aes(x = factor(value), fill = Variant)) + 
    geom_bar() + 
    geom_text(data = df3, aes(y = y, label = n)) + 
    facet_grid(~variable, scales = "free_x", labeller = my_lab) + 
    scale_fill_manual(values = c("paleturquoise3", "palegreen3")) + # manual fill colors 
    theme_bw() + 
    theme(axis.text = element_text(face = "bold"), # axis tick labels bold 
     axis.text.x = element_text(angle = 45, hjust = 1), # rotate x axis labels 
     line = element_line(colour = "gray25"), # line colour gray25 = #404040 
     strip.text = element_text(face = "bold")) + # facet labels bold 
    xlab("factors") + # set axis labels 
    ylab("frequency") 

enter image description here

+0

Это очень близко к тому, что я хочу. Я отредактировал свой ОП с дополнительной информацией об эстетике сюжета. Не могли бы вы также рассмотреть их? Возможно ли совпадение со значениями? (например, столбец «PrecededByPrep» настолько широк, что он может удерживать метку «PrecededByPrep» (без переполнения), «Person» настолько широк, что может содержать текст для значений «no person» и «person»). Я должен был упомянуть об этом раньше, но тогда не думал о появлении сюжета. Прости. –

+0

Это выглядит великолепно! Я пытаюсь немного его отредактировать, но я не знаю, как настроить таргетинг на определенные ярлыки. Как я могу, например, указать «Регион» другой цвет и другой цвет фона? –

+1

Существует довольно много сообщений о SO при условном форматировании граней и их полос. См. [** здесь **] (http://stackoverflow.com/questions/9847559/condition-change-panel-background-with-facet-grid) и [** здесь **] (http://stackoverflow.com/вопросы/6750664/как к изменению-формат-оф-ан-Индивидуально-ggplot2-фасеточного участка). – Henrik

6

Вот мое предложение для решения с функцией barplot базового R:

1. Подсчитать отсчеты

l_count_df<-lapply(colnames(t)[-1],function(nomcol){table(t$Variant,t[,nomcol])}) 
count_df<-l_count_df[[1]] 
for (i in 2:length(l_count_df)){ 
    count_df<-cbind(count_df,l_count_df[[i]]) 
} 

2. обратить barplot без имен осей, сохраняя координаты столбца

par(las=1,col.axis="#404040",mar=c(5,4.5,4,2),mgp=c(3.5,1,0)) 
bp<-barplot(count_df,width=1.2,space=rep(c(1,0.3),4),col=c("paleturquoise3", "palegreen3"),border="#404040", axisname=F, ylab="Frequency", 
      legend=row.names(count_df),ylim=c(0,max(colSums(count_df))*1.2)) 

3. этикетки бруски

mtext(side=1,line=0.8,at=bp,text=colnames(count_df)) 
mtext(side=1,line=2,at=(bp[seq(1,8,by=2)]+bp[seq(2,8,by=2)])/2,text=colnames(t)[-1],font=2) 

4.добавить значения в барах

for(i in 1:ncol(count_df)){ 
    val_elke<-count_df[1,i] 
    val_iedere<-count_df[2,i] 
    text(bp[i],val_elke/2,val_elke) 
    text(bp[i],val_elke+val_iedere/2,val_iedere) 
} 

Вот что я получаю (со своими случайными данными):

enter image description here

+0

Возможно ли, что ваша последняя команда неполна? R, похоже, не хочет запускать его. EDIT: вы пропустили круглую скобку в конце! –

+0

@BramVanroy ok, у меня была скобка, работающая в конце моего ответа, мне было интересно, что она там делает (поэтому я удалил ее ...), но я просто включил картинку перед закрывающей скобкой последней инструкции. Действительно извините за это! (исправлено) – Cath

+0

Я рассматриваю это для принятия, потому что он не нуждается в каких-либо библиотеках. (+1!) Это здорово! Можно ли 1. пометить ось y «Частота» и иметь немного больше места между метками и значениями (например, между Region и NL/VL). –

2

Я в основном отвечая на другой вопрос. Я полагаю, что это можно рассматривать как извращенность с моей стороны, но мне действительно не нравятся барьеры почти любого рода. Они всегда, казалось, создавали потраченное впустую пространство, потому что нынешние информационные числовые значения менее полезны, чем правильно построенная таблица. Пакет vcd предлагает расширенную функцию мозаики, которая, как мне кажется, более точно называется «многомерным штриховым шрифтом, который любой из тех, что я видел до сих пор. Это требует, чтобы вы сначала построили таблицу непредвиденных обстоятельств, для которой функция xtabs кажется идеальной . подходит

install.packages)"vcd") 
library(vcd) 
help(package=vcd,mosaic) 
col=c("paleturquoise3", "palegreen3") 
vcd::mosaic(xtabs(~Variant+Region + PrecededByPrep + Time, data=ttt) 
      ,highlighting="Variant", highlighting_fill=col) 

enter image description here

это был 5 способ сюжет и это 5-позиционная участок:

png(); vcd::mosaic(xtabs(
        ~Variant+Region + PrecededByPrep + Person + Time, 
        data=ttt) 
       ,highlighting="Variant", highlighting_fill=col); dev.off() 

enter image description here

+2

Благодарим вас за ответ. Я рассмотрел мозаичный сюжет, но я просто не думаю, что это так же ясно, как и бар-сюжеты, хотя вы правы, говоря, что они экономят больше места. –

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