2015-08-26 7 views
1

Пример данных:R - несколько точек данных в лесном участке с использованием ggplot2

df <- data.frame(Mean1=c(12,15,17,14,16,18,16,14),Lower1=c(8,11,13,7,15,12,12,11),Upper1=c(16,18,21,21,17,24,20,17),Mean2=c(13,16,18,15,17,19,17,15),Lower2=c(9,12,14,8,16,13,13,12),Upper2=c(17,19,22,22,18,25,21,18)) 
rownames(df) <- c(1,2,3,4,5,6,7,8) 

я могу производить лесной участок с Mean1Lower1 и Upper1 из df:

ggplot(df, aes(y = row.names(df), x = df$Mean1)) + 
    geom_point(size = 4) + 
    geom_errorbarh(aes(xmax = df$Upper1, xmin = df$Lower1)) 

Так что мой вопрос: Как могу ли я включить Mean2Lower2 и Upper2 от df к графику, чтобы оба средства из каждой точки наблюдения (строк) представлялись как pai rs с соответствующими шкалами ошибок? Таким образом, выход будет аналогичным лесом, но с обоими средствами и пределами ошибок из каждой точки наблюдения, отображаемой парами. Я надеюсь в этом есть смысл.

Я ничего не пробовал, потому что я просто не знаю с чего начать.

Это можно выполнить, не нарушая структуру кадра данных?

+0

Самым простым решением является, чтобы изменить dataframe в длинном формате, так что каждый штрих ошибка имеет ряд с нижней, верхней, оценки и группировки переменной. Зачем вам нужна структура? – Heroka

ответ

0

Я не уверен, что вы имеете в виду, но хотите ли вы построить значения Mean2 в верхней части лесного участка? В этом случае вы можете назначить Первый участок значение, позволяет сказать, что s1, а затем добавить новые данные к нему, как это (возможно, добавить Diff цвета):

s1<-ggplot(df, aes(y = row.names(df), x = df$Mean1)) + 
    geom_point(size = 4) + 
    geom_errorbarh(aes(xmax = df$Upper1, xmin = df$Lower1)) 

s1 + geom_point(data=df, aes(y = row.names(df), x = df$Mean2)) + 
    geom_errorbarh(aes(xmax = df$Upper2, xmin = df$Lower2)) 

В противном случае вы можете реструктурировать данные, а затем добавить facet_grid (. ~ Sample), чтобы сделать отдельные графики для ваших образцов (Mean1 и Mean2)

+0

Спасибо. Это идея, которую я искал. Знаете ли вы, можно ли отображать эти значения, чтобы элементы в каждой паре были выровнены под друг другом? –

+0

Вы можете использовать 'y = as.numeric (row.names (df)) - 0.2' в aes второй части. Но чтобы повторить сам, зачем вам нужна структура данных? Это не лучшее из практики. – Heroka

+1

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

0

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

library(tidyr) 
df$itemid <- rownames(df) 
df <- gather(df, type, value, -itemid) 
df <- separate(df, type, into=c("type", "grpid"), sep=-2) 
df <- spread(df, type, value) 

сделано в отдельных этапов, так что легче выполнить шаг за шагом, чтобы увидеть, что происходит. Тогда можно построить с помощью:

library(ggplot2) 
ggplot(df, aes(y = paste(itemid, grpid), x = df$Mean, color = grpid)) + 
    geom_point(size = 4) + 
    geom_errorbarh(aes(xmax = df$Upper, xmin = df$Lower)) 
2

Самого естественного способом сделать это состоит в использовании position аргумента, но она нуждается в значении, сгруппированное с переменными, а не именами столбцов. Вы можете добавить его Inplace:

ggplot(df,aes(x= rep(rownames(df), 2), 
     y= c(Mean1,Mean2), 
     group=rep(c(1,2), each=nrow(df)))) + 
geom_point(position=position_dodge(1))+coord_flip() 

Но более правильным способом является нарушить структуру кадра данных, это сделает код более чище:

ggplot(df, aes(x = rownames, 
      y = Mean, 
      group=groups)) + 
geom_point(size = 4, position=position_dodge(1))+ 
geom_errorbar(aes(ymax = Upper, ymin = Lower), position=position_dodge(1))+ 
coord_flip() 

Для этого примера я сделал эти данные .frame преобразование:

df <- data.frame(Mean=c(df$Mean1,df$Mean2), 
       Lower=c(df$Lower1,df$Lower2), 
       Upper=c(df$Upper1,df$Upper2), 
       groups=factor(rep(c(1,2), each=nrow(df))), 
       rownames=as.character(rep(rownames(df), 2))) 
Смежные вопросы