2016-08-01 3 views
0

Я пытаюсь сделать граненый график из кадра данных, показывающий, как изменяется одна переменная как функция другой переменной. Каждая переменная имеет связанную с ней ошибку. Вот подмножество данных, которые у меня есть; столбец ID, переменные (SiO2 до FeO) и ошибки, связанные с переменными (* _2stdev):добавление ошибок в отдельные точки на гранях графических объектов

df<-structure(list(ID = structure(c(3L, 4L, 6L, 1L, 2L, 10L), .Label = c("P466-an1", "P466-an2", "P468-an1", "P468-an2", "P469-an1", "P470-an1", "P471-an1", "P472-an1", "P473-an1", "P474-an1", "P475-an1", "P475-an2", "P476-an1", "P476-an2", "P477-an1", "P478-an1", "P479-an1", "P480-an1"), class = "factor"), 
      SiO2 = c(54.5147, 56.2223, 52.8499, 52.0293, 53.4221, 52.9802), 
      TiO2 = c(0.5928, 0.5792, 0.5771, 1.1373, 1.0962, 1.1535), 
      Al2O3 = c(17.5404, 18.1921, 19.4737, 15.7752, 16.455, 16.4117), 
      FeO = c(6.2115, 5.8676, 5.4874, 4.5952, 4.4242, 4.109), 
      SiO2_2stdev = c(1.5232, 2.3578, 0.6374, 1.3331, 0.6535, 0.6977), 
      TiO2_2stdev = c(0.0638, 0.0637, 0.0357, 0.1024, 0.0422, 0.0282), 
      Al2O3_2stdev = c(0.4519, 0.4572, 0.2044, 0.6378, 0.6546, 0.0624), 
      FeO_2stdev = c(0.426, 0.3973, 0.1145, 0.1992, 0.1106, 0.0427)), 
      .Names = c("ID", "SiO2", "TiO2", "Al2O3", "FeO", "SiO2_2stdev", "TiO2_2stdev", "Al2O3_2stdev", "FeO_2stdev"), 
      row.names = c(NA, 6L), class = "data.frame") 

Используя следующий код:

library(reshape2) 
library(ggplot2) 

m.df<-melt(df, id=c('ID','FeO')) 

p<-ggplot(subset(m.df, variable %in% c('SiO2','TiO2','Al2O3')),aes(x=value, y=FeO))+ 
    geom_point()+ 
    facet_wrap(~ variable, ncol=1, scales="free_x")+ 
    theme_bw() 

p 

Я получаю этот сюжет:

plot with no errorbars

Я хотел бы добавить errorbars (вертикальный и горизонтальный) к этому, но я не знаю, как это сделать на гранжевом графике.

Используя geom_errorbar и geom_errorbarh, я смог построить их для отдельных графиков из нерасплавленного фрейма. Полагаю, я мог бы сделать все графики с помощью цикла, но я не знаю, как добавить ошибки в этот метод. Далее я хотел бы сразу увидеть все сюжеты.

Спасибо за чтение и любую помощь с благодарностью! -R

редактировать По aosmith комментарий «s, я добавил FeO_2stdev идентификатору переменных в melt. Теперь я могу создать график с коррективными вертикальными ошибками. Так что теперь у меня возникли проблемы с пониманием того, как я могу получить geom_errorbarh для построения правильных ошибок на каждом сюжете.

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

library(reshape2) 
library(ggplot2) 

m.df<-melt(df, id=c('ID','FeO', 'FeO_2stdev')) 
m.df$y.min<-m.df$FeO-m.df$FeO_2stdev 
m.df$y.max<-m.df$FeO+m.df$FeO_2stdev 

p<-ggplot(subset(m.df, variable %in% c('SiO2','TiO2','Al2O3')), aes(x=value, y=FeO))+ 
    geom_point()+ 
    facet_wrap(~ variable, ncol=1, scales="free_x")+ 
    theme_bw()+ 
    geom_errorbar(aes(ymin=y.min, ymax=y.max)) 

p 

plot with vertical errorbars

+0

Вы пытаетесь добавить полосы ошибок на основе 'FeO_2stdev'? Если да, сохраните эту переменную как одну из ваших переменных id в 'melt', чтобы вы могли использовать ее в' geom_errorbar'. Если нет, можете ли вы уточнить, что вы будете использовать для расчета баров ошибок? – aosmith

+0

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

ответ

1

Имея набор данных с одного столбца значений и одного столбца 2 стандартных отклонений поможет с горизонтальными планками погрешностей. Это, по сути, проблема с управлением данными. Есть много способов добиться такого. Я использую tidyr с dplyr.

Например, если начать с m.df сразу после плавления, можно

  1. Сделать новую переменную, чтобы представлять, представляет ли строка 2 стандартных отклонений или значение с помощью separate, а затем mutate с if_else.
  2. spread набор данных обратно в широкий формат, с одним столбцом для значений и один для 2 стандартных отклонений. Вы также можете использовать dcast от reshape2, если вы уже знакомы с этим.

библиотека (dplyr) библиотека (tidyr)

m.df %>% 
    separate(variable, c("variable", "metric")) %>% 
    mutate(metric = if_else(is.na(metric), "value", metric)) %>% 
    spread(metric, value) 

     ID FeO FeO_2stdev variable 2stdev value 
1 P466-an1 4.5952  0.1992 Al2O3 0.6378 15.7752 
2 P466-an1 4.5952  0.1992  SiO2 1.3331 52.0293 
3 P466-an1 4.5952  0.1992  TiO2 0.1024 1.1373 
4 P466-an2 4.4242  0.1106 Al2O3 0.6546 16.4550 
5 P466-an2 4.4242  0.1106  SiO2 0.6535 53.4221 
... 

Вот весь процесс, используя gather из tidyr вместо melt для одних и тех же результатов:

df2 = df %>% 
    gather(key, value, -ID, -contains("FeO")) %>% 
    separate(key, c("variable", "metric")) %>% 
    mutate(metric = if_else(is.na(metric), "value", metric)) %>% 
    spread(metric, value) 

Теперь горизонтальная бары ошибок могут быть добавлены к вашему графику с использованием value и 2stdev. Обратите внимание, что имя столбца 2stdev не является синтаксически правильным, поэтому я использую обратные ссылки вокруг имени переменной.

ggplot(df2, aes(x=value, y=FeO))+ 
    geom_point()+ 
    facet_wrap(~ variable, ncol=1, scales="free_x")+ 
    theme_bw() + 
    geom_errorbar(aes(ymin = FeO - FeO_2stdev, ymax = FeO + FeO_2stdev)) + 
    geom_errorbarh(aes(xmin = value - `2stdev`, xmax = value + `2stdev`)) 

enter image description here

+0

Это отлично! Спасибо. Один вопрос: почему требуется обратная сторона вокруг '2stdev', но не' value' в 'geom_errorbarh'? – ramesesjd

+0

В R имена, начинающиеся с цифр, не являются синтаксически действительными, поэтому '2stdev' должен обертывать обратные тики, а' value' - нет. На странице [справочной странице] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/make.names.html) для 'make.names' содержится некоторая полезная информация о синтаксически допустимых именах , – aosmith

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