2015-05-01 3 views
0

что у меня есть средства двух наборов данных, которые я хочу построить в barplots с погрешностями рядом друг с другом в ggplot2 или базуБок о Бок R Barplot с погрешностями

Каждый набор данных состоит из матрицы чисел

10 20 12 
10 20 12 
10 20 12 

, который затем превращается в средний вектор, например 3-х элементов

10 20 12 

то, что я хочу сделать, это принять как средние векторы и построить их в качестве барной стойкой, где т он первый элемент одного из них есть, кроме первого элемента другого

Dataset1Element1Bar-Dataset2Element1Bar Dataset1Element2Bar-Dataset2Element2Bar etc 

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

И, наконец, цвет их по количеству элементов (т.е. элемент 1)

У меня есть код сделать один набор данных, но я не уверен, куда идти оттуда.

result<-barplot(bardata, main="Mean Coverage", names.arg=namePosTargetGroup, ylab="mean Magnitude", cex.names=.4,col=c("red","blue","green")) 
      legend(10,legend=c("Group1","Group2","Group3"),fill = c("red","blue","green")) 

Много из того, что я смотрю вверх дает ответ на ту или иную вещь, но его трудно понять, как объединить их вместе.

ответ

1

Как правило, я не рекомендую строить диаграмму с барами ошибок. Существует много других способов построения ваших данных, которые значительно улучшают данные и структуру.

Особенно, если у вас только очень мало случаев, средство построения с барами не очень хорошо. Хорошее объяснение можно найти здесь: Beyond Bar and Line Graphs: Time for a New Data Presentation Paradigm

Мне сложно дать вам хорошее решение, так как я не знаю вашего исследования. Знать, что вы на самом деле хотите показать или сделать акцент, облегчит ситуацию.

Я дам вам два предложения: один для небольшого набора данных, один для большего. Все они создаются с помощью ggplot2. Я не раскрашиваю их своим «номером элемента», а по их происхождению («набор данных 1/2»), так как мне легче выполнить соответствующую графику таким образом.

Малый Dataset

Используйте geom_jitter, чтобы отобразить все случаи, избегая overplotting.

# import hadleyverse 
library(magrittr) 
library(dplyr) 
library(tidyr) 
library(ggplot2) 

# generate small amount of data 
set.seed(1234) 
df1 <- data.frame(v1 = rnorm(5, 4, 1), 
        v2 = rnorm(5, 5, 1), 
        v3 = rnorm(5, 6, 1), 
        origin = rep(factor("df1", levels = c("df1", "df2")), 5)) 

df2 <- data.frame(v1 = rnorm(5, 4.5, 1), 
        v2 = rnorm(5, 5.5, 1), 
        v3 = rnorm(5, 6.5, 1), 
        origin = rep(factor("df2", levels = c("df1", "df2")), 5)) 

# merge dataframes and gather in long format 
pdata <- bind_rows(df1, df2) %>% 
    gather(id, variable, -origin) 

# plot data 
ggplot(pdata, aes(x = id, y = variable, fill = origin, colour = origin)) + 
    stat_summary(fun.y = mean, geom = "point", position = position_dodge(width = .5), 
       size = 30, shape = "-", show_guide = F, alpha = .7) + # plot mean as "-" 
    geom_jitter(position = position_jitterdodge(jitter.width = .3, jitter.height = .1, 
               dodge.width = .5), 
       size = 4, alpha = .85) + 
    labs(x = "Variable", y = NULL) + # adjust legend 
    theme_light() # nicer theme 

Jitter_Plot

"Big" Dataset

Если у Вас есть больше точек данных, вы можете использовать geom_violin суммировать их.

set.seed(12345) 
df1 <- data.frame(v1 = rnorm(50, 4, 1), 
        v2 = rnorm(50, 5, 1), 
        v3 = rnorm(50, 6, 1), 
        origin = rep(factor("df1", levels = c("df1", "df2")), 50)) 

df2 <- data.frame(v1 = rnorm(50, 4.5, 1), 
        v2 = rnorm(50, 5.5, 1), 
        v3 = rnorm(50, 6.5, 1), 
        origin = rep(factor("df2", levels = c("df1", "df2")), 50)) 

# merge dataframes 
pdata <- bind_rows(df1, df2) %>% 
    gather(id, variable, -origin) 

# plot with violin plot 
ggplot(pdata, aes(x = id, y = variable, fill = origin)) + 
    geom_violin(adjust = .6) + 
    stat_summary(fun.y = mean, geom = "point", position = position_dodge(width = .9), 
       size = 6, shape = 4, show_guide = F) + 
    guides(fill = guide_legend(override.aes = list(colour = NULL))) + 
    labs(x = "Variable", y = NULL) + 
    theme_light() 

Violin_plot

Версия со средним и с.о.

Если вы настаиваете на откладывая среднее со стандартным отклонением, вот как это можно сделать.

# merge dataframes and compute limits for sd 
pdata <- bind_rows(df1, df2) %>% 
    gather(id, variable, -origin) %>% 
    group_by(origin, id) %>%   # group data for limit calculation 
    mutate(upper = mean(variable) + sd(variable), # upper limit for error bar 
     lower = mean(variable) - sd(variable)) # lower limit for error bar 

# plot 
ggplot(pdata, aes(x = id, y = variable, fill = origin)) + 
    stat_summary(fun.y = mean, geom = "bar", position = position_dodge(width = .9), 
       size = 3) + 
    geom_errorbar(aes(ymin = lower, ymax = upper), 
       width = .2,     # Width of the error bars 
       position = position_dodge(.9)) 

Bar_Plot