2015-09-04 4 views
0

Я пытаюсь построить несколько графиков с помощью ggplot. У меня есть .xls с 20 наблюдениями из 216 переменных. Данные разделены на 6, поэтому меня интересуют 6 больших блоков. Я создал эти данные, используя другой цикл, так что каждый блок делится на 3 (набор из 12 переменных). Я хочу построить для каждого из 6 блоков первые переменные меньших блоков. Поэтому в сюжете я хочу иметь: my_data [, i], my_data [, i + 12], my_data [, i + 24], где i изменяется от 1:12 (так что i == 12 -> 12 + 24 = 36).ggplot не строит в петле

time= 1:20 # definir #periodos 
title = c("pib", "c", "i", "l", "pi", "r", "w", "cl", "cc", "wrel","lrel", "yrel") # for titles 
title = rep(title, 3) 
plot_list = list() 
    for (i in 1:12) { 
     df = data.frame(time,  
      as.numeric(my_data[,i],as.numeric(my_data[,i+12]), 
       as.numeric(my_data[,i+24]))) 
     p = ggplot(df, aes(x = time, y= as.numeric(my_data[,i]))) 
      + geom_line() 
      + geom_line(aes(y=as.numeric(my_data[,i]), colour="nr = 0.32")) 
      + geom_line(aes(y=as.numeric(my_data[,i+12]), colour="nr = 0.4")) 
      + geom_line(aes(y=as.numeric(my_data[,i+24]), colour="nr = 10")) 
      + scale_colour_manual("", breaks=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
      values = c("green", "royalblue4", "orangered")) 
      + labs(x = "periodos", y = "vg4") 
      + ggtitle(paste0(title[i], "_vg4 for diff.nr - tax")) 
     plot_list[[i]] = p 
     print(p) 
} 

Когда я это делаю, печатается только третье значение (nr = 10). Кто-нибудь знает, что происходит? Я уже пытался определить свой data.frame по-разному, но вывод всегда один и тот же. спасибо !!

Данные и .r файл находится в: https://www.dropbox.com/sh/efjtanbh5oznrg5/AADrhSUXOu3MYSCGLcFnNY_ea?dl=0

+2

Помогите нам помочь вам, сделав ваш код воспроизводимым (здесь это означает предоставление данных, которые работают с вашим кодом). Одна из проблем заключается в том, что вы даете ggplot фрейм данных 'df', но тогда вы ссылаетесь на отдельный фрейм данных (' my_data') в каждом вызове 'aes' (и внутри aes вы должны ссылаться только на имена столбцов; подаваться в 'ggplot' или в аргумент' data' 'geom'). Вы проверили, работает ли код построения вне цикла? – eipi10

+0

Только последний 'geom_line()' читается, потому что он последний раз называется и работает прямо над другими точными тенденциями. Я подозреваю, что столбцы i, i + 12, i + 24 сохраняют точные значения. Проверьте, переставляя линии геометрии и посмотрите, будет ли отображаться только последнее, здесь будет 'nr = 10'. – Parfait

ответ

4

Слишком долго для комментария.

Во-первых, соглашение о SO заключается в том, что ответы зарезервированы для воспроизводимого кода, который демонстрирует решение. Все, что меньше, например, спекуляция или мнение, принадлежит комментарию. Так как ваш код не запускается вообще, как есть (нет my_data), никто не сможет ответить вам, если вы не предоставите свои данные, или мы создадим образец для вас. Как и следовало ожидать, большинство людей по праву не желают делать последнее.

Во-вторых, это не лучший способ использовать ggplot. Идея состоит в том, чтобы использовать aes(...) для отображения эстетики графика (например, оси x и y, цветов и т. Д.) До столбцов вашего набора данных, используя имена столбцов. Итак, что-то вроде этого:

df = data.frame(time,  
        y1 = as.numeric(my_data[,i]), 
        y2 = as.numeric(my_data[,i+12]), 
        y3 = as.numeric(my_data[,i+24])) 
    p = ggplot(df, aes(x = time)) + 
     geom_line(aes(y=y1, colour="nr = 0.32")) + 
     geom_line(aes(y=y2, colour="nr = 0.4")) + 
     geom_line(aes(y=y3, colour="nr = 10")) + 
     ... 

было бы лучше - хотя все еще не здорово.

Создание трех линий с использованием трех вызовов geom_line(...) - тоже не очень хорошая идея. Наверное, лучше было бы что-то вроде этого:

library(reshape2) 
df <- melt(data.frame(time,my_data[,i+c(0,12,24)]), 
      id.vars="time", variable.name="nr", value.name="y") 
p = ggplot(df, aes(x = time, y=y, color=nr)) + 
    geom_line() + 
    scale_colour_manual("", labels=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
          values = c("green", "royalblue4", "orangered"))+ 
    ... 

Это использует melt(...) в reshape2 пакет для преобразования данных из формата «широкий» (данные для различных линий в разных колонках), в формате «длинный» (все .. у-данные в одном столбце, со второй колонкой (nr в примере), отличающей различные линии Теперь есть только один вызов geom_line(...)

вытягивать это всего:

## create artificial data set to demonstrate solution 
set.seed(1) # for reproducible example 
my_data <- as.data.frame(matrix(rnorm(20*12*3), nrow=20)) 

library(reshape2) 
library(ggplot2) 
for (i in 1:12) { 
    df <- melt(data.frame(time,my_data[,i+c(0,12,24)]),id.vars="time", variable.name="nr", value.name="y") 
    p = ggplot(df, aes(x = time, y=y, color=nr)) + 
    geom_line() + 
    scale_colour_manual("", labels=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
          values = c("green", "royalblue4", "orangered"))+ 
    labs(x = "periodos", y = "vg4")+ 
    ggtitle(paste0(title[i], "_vg4 for diff.nr - tax")) 
    plot_list[[i]] = p 
    print(p) 
} 

Это производит 12 участков, последний из которых:

Наконец, если вы хотите посмотреть на всех участках одновременно, вы можете melt(...) полный набор данных (все 12 * 3 = 36 столбцов) и использовать ggplot аспекты:

df <- melt(data.frame(time,my_data), id.vars="time", variable.name="nr", value.name="y") 
df <- cbind(df,plot=rep(title,each=length(time))) 
df$nr <- rep(c("A","B","C"),each=12*length(time)) 
ggplot(df, aes(x=time, y=y, color=nr))+ 
    geom_line()+ 
    facet_wrap(~plot, ncol=3)+ 
    scale_colour_manual("", labels=c("nr = 0.32", "nr = 0.4", "nr = 10"), 
         values = c("green", "royalblue4", "orangered"))+ 
    labs(x = "periodos", y = "vg4", title="vg4 for diff.nr - tax") 

enter image description here

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

+0

Здравствуйте, jlhoward. Спасибо за ваш ответ и совет. У меня такая же проблема. Когда я рисую все свои графики, я получаю красную линию. Есть ли способ, чтобы я мог отправить вам это? (Мои данные, похоже, точно указаны как созданные вами, т. Е. С 20 общими 36 переменными). – rebeca

+0

что я делаю: data_TAX <- read.xlsx ("D: /Users/E265297705/Documents/choques_antecipados_nr/Tax_nri.xls", sheetIndex = 1, header = F, endRow = 20), а затем data_TAX <- as. data.frame (dados_TAX) // и my_data <- data_TAX [, 1: 36] – rebeca

+0

Можете ли вы загрузить файл 'xls' где-нибудь (Dropbox?) и опубликовать ссылку (в вопросе, а не в комментарии). – jlhoward

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