Как я могу сделать этот график для каждого столбца в моем фрейме данных, используя sapply и ggplot2?

Я хотел бы создать один и тот же график для каждого столбца данных в фрейме данных ниже, называемом df.

Изменить: чтобы уточнить, я хотел бы создать новый график для каждого столбца (Cop, CopN, Harp) и т.д., поскольку в моих фактических данных у меня их много (т.е. далеко многих, чтобы попытаться построить сетку на одном графике) Я хотел бы иметь возможность создать график ниже для каждого столбца.

Образец данных:

day <- c('5-Aug', '5-Aug','5-Aug','10-Aug','10-Aug','10-Aug','17-Aug','17-Aug','17-Aug')
station <- c(1:3,1:3,1:3)
Cop.Mean <- c(382, 1017, 1519, 698, 5398, 2458, 346, 5722, 6253)
CopN.Mean <- c(233, 167, 530, 36, 124, 20, 427, 1768, 1486)
Harp.Mean <- c(20, 482, 10, 8, 4014, 7, 4, 46, 1)
df <- data.frame(day,station,Cop.Mean, CopN.Mean, Harp.Mean)

Мой сюжет:

library(ggplot2)
library(scales)
Cop.Plot <- ggplot(data=df, aes(x=station, y=Cop.Mean)) +
         geom_point() + facet_grid(.~day) 
         print(Cop.Plot)

Я хотел бы построить этот график для каждого из трех столбцов данных, которые у меня есть в этом примере (т.е. df [3: 5]), но не смог понять, как ссылаться на несколько столбцов в aes (). (т.е.

aes(x=station, y=df[3:5]) 

не работает. Я также пробовал

i=df[3:5] 
aes(x=station, y=i)

но я думаю, что, вероятно, использую неправильный подход. Будет ли кто-нибудь так любезен указать мне в правильном направлении? Это кажется чрезвычайно полезным инструментом, чтобы научиться делать это, и я очень хочу это сделать!


person wonderoustree    schedule 22.11.2013    source источник
comment
в ggplot2 часто работают с данными длинного формата data.frame. В вашем примере вы сначала должны reshape2::melt(df, id=1:2), прежде чем передавать его в ggplot2   -  person baptiste    schedule 23.11.2013


Ответы (3)


library(ggplot2)
library(reshape2)
moltendf <- melt(df, id.vars=c("day","station"))
allplots <- ggplot(data=moltendf, aes(x=station, y=value)) +
             geom_point() + facet_grid(variable ~ day)

но мне неясно, хотите ли вы, чтобы все они были одним большим размеченным сюжетом, или вы хотите *apply и создавать / сохранять много разных сюжетов для каждого полицейского типа. Если последнее, то с расплавленными данными вы можете:

plotfun <- function(x,y) { 
                 a <- ggplot(data=x, aes(x=station, y=value)) +
                 geom_point() + facet_grid(.~ day)
                 pdf(paste0(y,".pdf"))
                 print(a)
                 dev.off()
}

mapply(plotfun, split(moltendf, moltendf$variable), as.list(1:3))
person user1317221_G    schedule 22.11.2013
comment
paste0 () должен быть paste ()? Также посмотрите мои правки в моем вопросе - я действительно хочу использовать sapply или аналогичный для создания и сохранения множества графиков (по одному для каждого столбца данных). Большое спасибо за код, но я не уверен, что мне нужно с ним делать: когда я ввожу его, ничего не происходит. Что-то мне не хватает? Спасибо! - person wonderoustree; 23.11.2013
comment
нет, см. ?paste0. Также проверьте свой рабочий каталог, чтобы увидеть, где сохранены графики. - person user1317221_G; 23.11.2013
comment
Извините, чтобы быть более понятным, он сохраняет три файла PDF в моем рабочем каталоге, но эти файлы PDF, похоже, не содержат никаких данных, и я получаю сообщение об ошибке при попытке открыть один: произошла ошибка при открытии этого документа. Этот файл нельзя открыть, потому что в нем нет страниц. Мне что-то не хватает в вашем коде, где мне нужно что-то добавить? Большое спасибо за Вашу помощь. - person wonderoustree; 23.11.2013
comment
Я упустил print(a) ранее, я исправил это в своем редактировании, поэтому я бы попробовал еще раз с кодом в моем ответе сейчас, это работает для меня. :) - person user1317221_G; 23.11.2013
comment
Ага! Блестяще. Я новичок в R и программировании в целом, и мне не терпится применить (хи-хи) то, что вы мне показали в другом месте. - person wonderoustree; 23.11.2013
comment
альтернатива с более коротким синтаксисом, pdf("all.pdf"); plyr::d_ply(moltendf, "variable", "%+%", e1=allplots, .print=TRUE); dev.off(). - person baptiste; 23.11.2013
comment
Есть ли способ заставить R вставить имя переменной (например, Cop.Mean), когда он сохраняет pdf, а не 1.pdf 2.pdf и т. Д.? - person wonderoustree; 23.11.2013
comment
да измените as.list(1:3) на что-то вроде list("Cop.Mean","opportunity for selection","chocolate pie"). Это просто список имен. попробуйте вставить этот последний фрагмент кода отдельно, чтобы понять, что я имею в виду. для вашего случая вам может понадобиться as.list(unique(moltendf$variable) - person user1317221_G; 23.11.2013
comment
Понятно, спасибо. Когда у меня отображается последняя строка (plotfun, split (df, df $ Bug), as.list (1: 3)), он сохраняет три отдельных файла PDF, как я хочу, с метками 1 2 и 3.pdf. Однако, когда последняя строка читает mapply (plotfun, split (df, df $ Bug), as.list (Cop, CopN, Harp)), он сохраняет только первый pdf, хотя и правильно помеченный как Cop.pdf. Мне также было любопытно, есть ли способ автоматически сохранять каждый график с использованием имени уровня переменной, а не вводить его вручную. Или мне следует задать это как новый вопрос? - person wonderoustree; 23.11.2013
comment
вам нужен list("Cop", "CopN", "Harp"). Если начинать со списков, может быть сложно понять, почему. Сравните list(1:3) с as.list(1:3), чтобы попытаться увидеть разницу и прочитать списки - person user1317221_G; 23.11.2013
comment
Большое тебе спасибо. Если это полезно, я обнаружил, что mapply (plotfun, split (moltendf, moltendf $ variable), levels (moltendf $ variable)) соответствующим образом маркирует выходные файлы pdf Cop.Mean.pdf, CopN.Mean.pdf и т. Д. Ура! Большое спасибо за помощь. Очень признателен. - person wonderoustree; 23.11.2013

Как сказал baptiste, пакет reshape2 поможет вам. Вот полный код:

library(reshape2)
df <- melt(df, id = c("day", "station"))
Cop.Plot <- ggplot(data = df, aes(x = station, y = value)) + geom_point()
Cop.Plot + facet_grid(variable ~ day)

Я рекомендую использовать day в качестве фактора и отсортировать уровни в хронологическом порядке с помощью:

day <- factor(day, levels = c('5-Aug', '10-Aug', '17-Aug'))

В противном случае они сортируются по алфавиту.

person ramhiser    schedule 22.11.2013

Вы это имели в виду?

library(reshape2)
ggdata <- melt(df,id=1:2,variable.name="Measure",value.name="Mean")
ggplot(ggdata,aes(x=station, y=Mean)) +
  geom_point() + 
  facet_grid(Measure~day)

Производит это:

введите описание изображения здесь

Обратите внимание, что дни указаны в неправильном порядке.

person jlhoward    schedule 22.11.2013
comment
Собственно, я пытаюсь сделать отдельный сюжет для каждого вида (Cop, CopN, Harp). Смотрите мои правки к моему вопросу выше - у меня слишком много видов в моем фактическом наборе данных, чтобы сделать это, хотя это выглядит полезным, и я, вероятно, буду использовать в другом месте, так что спасибо! - person wonderoustree; 23.11.2013