2015-08-20 9 views
1

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

  1. Внешний вид участка, как мне это нужно, так что не беспокойтесь о том, комментируя в исключительно в отношении к тому, что (рад услышать мнения, прикрепленные к другой помощи, хотя)
  2. Поскольку эти участки образуются в цикл и бары ошибок на самом деле добавляются только в том случае, если условие выполнено, я не могу просто объединить все данные вперед, поэтому предположим, что для этого упражнения данные графика и данные панели ошибок относятся к различным dfs.

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

Первая позволяет генерировать данные и сюжет

library(ggplot2) 
library(scales) 

# some data 
data.2015 = data.frame(score = c(-50,20,15,-40,-10,60), 
         area = c("first","second","third","first","second","third"), 
         group = c("Findings","Findings","Findings","Benchmark","Benchmark","Benchmark")) 

data.2014 = data.frame(score = c(-30,40,-15), 
         area = c("first","second","third"), 
         group = c("Findings","Findings","Findings")) 

# breaks and limits 
breaks.major = c(-60,-40,-22.5,-10, 0,10, 22.5, 40, 60) 
breaks.minor = c(-50,-30,-15,-5,0, 5, 15,30,50) 
limits =c(-70,70) 

# plot 2015 data 
ggplot(data.2015, aes(x = area, y = score, fill = group)) + 
    geom_bar(stat = "identity", position = position_dodge(width = 0.9)) + 
    coord_flip() + 
    scale_y_continuous(limit = limits, oob = squish, minor_breaks = breaks.minor, 
        breaks = breaks.major) 

Вызов участок (с) производит хороший сюжет, как и ожидалось, теперь позволяет набор до баров ошибок и попытки добавить их в качестве нового слоя в участке «с»

# get the error bar values 
alldat = merge(data.2015, data.2014, all = TRUE, by = c("area", "group"), 
       suffixes = c(".2015", ".2014")) 
alldat$plotscore = with(alldat, ifelse(is.na(score.2014), NA, score.2015)) 
alldat$direction = with(alldat, ifelse(score.2015 < score.2014, "dec", "inc")) 
alldat$direction[is.na(alldat$score.2014)] = "absent" 

#add error bars to original plot 
c <- c+ 
    geom_errorbar(data=alldat, aes(ymin = plotscore, ymax = score.2014, color = direction), 
       position = position_dodge(width = .9), lwd = 1.5, show.legend = FALSE) 

Когда я называю Ĉ теперь я получаю

"Error in eval(expr, envir, enclos) : object 'score' not found" 

Почему он ищет данные.2015 $, когда я просто хочу, чтобы он накладывал geom_errorbar с использованием второго блока данных alldat?

EDIT * Я попытался указать значения ymin/ymax для баров ошибок, используя alldata $ plotscore и alldat $ score.2014 (что, я уверен, это плохая практика), это графики, но бары находятся в неправильные позиции/нерабочие с графиком (например, поменялись местами, на контрольных барах вместо этого и т. д.)

+0

Похоже 'geom_errobar' это наследует' y' эстетическим от глобального эстетического вы установили в 'ggplot' и переменная' score' не во втором наборе данных. Либо имя столбца «оценка» в новом наборе данных (возможно, играйте с аргументом 'suffixes' в' merge'), либо используйте 'y = score.2015' в эстетике для' geom_errorbar'. – aosmith

+0

@aosmith, чтобы добавить это как решение, чтобы я мог отметить свой вопрос? Это сработало для меня, указав как «y», так и «fill» в aes geom_errorbar как значения из нового dataframe (сделал y, затем он также попросил заполнить). Другие могут прийти сюда, задаваясь вопросом, как это решить, но также могут задаться вопросом, как обойти эту проблему, если у них нет соответствующих данных в новом фрейме данных (т. Е. Только данные бара, ничего не заменять y и заполнять в соответствии с родительским) – Alex

ответ

1

По моему опыту, эта ошибка о том, что какая-то переменная не найдена, говорит мне, что R заглядывал в данные. кадр для переменной, и ее там не было. Иногда решение так же просто, как исправление опечатки, но в вашем случае переменная score отсутствует в наборе данных, который вы использовали для создания ошибок.

names(alldat) 
[1] "area"  "group"  "score.2015" "score.2014" "plotscore" "direction" 

y переменная является обязательным для эстетического geom_errorbar. Поскольку вы устанавливаете переменную y во всем мире в пределах ggplot, другие геометрии наследуют глобальный y, если вы специально не сопоставляете его с другой переменной. В текущем наборе данных вам понадобится карта y с переменной показателя 2015 года.

geom_errorbar(data=alldat, aes(y = score.2015, ymin = plotscore, 
           ymax = score.2014, color = direction), 
       position = position_dodge(width = .9), lwd = 1.5, show.legend = FALSE) 

В вашем комментарии вы указали также должны были добавить fill к geom_errobar, а также, но я не считаю, что нужно, когда я запускал код (вы можете увидеть выше, что group является переменной во втором набор данных в примере, который вы даете).

Другим вариантом было бы удостовериться, что переменная оценки 2015 года по-прежнему называется score после слияния. Это можно сделать, изменив аргумент suffixes в merge. Затем score будет во втором наборе данных, и вам не нужно будет устанавливать переменную y в geom_errorbar.

alldat2 = merge(data.2015, data.2014, all = TRUE, by = c("area", "group"), 
      suffixes = c("", ".2014")) 
... 
names(alldat2) 
[1] "area"  "group"  "score"  "score.2014" "plotscore" "direction"