2016-03-29 2 views
0

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

36 фреймов данных не имеют одинаковых значений dX. Они примерно охватывают один и тот же диапазон, но не имеют одинаковых значений, поэтому использование слияния создает тонну значений NA. Однако количество строк одинаково.

я пытался что-то уродливое, что почти работает:

g <- ggplot() 
for (i in 1:36) { 
    g <- g + geom_line(data = df.list[[i]], aes(dX, dY, colour = i)) 
} 
print(g) 

Это показывает кривые правильно, но цвета не применяются (и не иметь соответствующую легенду). ОК, 36 строк в легенде могут быть непрактичными. В этом случае я бы уменьшил количество строк для рисования.

Второй подход: я попытался спланировать кадры данных следующим образом.

df <- melt(df.list, id.vars = "dX") 
ggplot(df, aes(x = dX, y = value, colour = L1)) + geom_line() 

Но это создает 4-переменную кадр данных со столбцами: Dx, переменный (всегда равно Dy), значение (здесь являются значениями Dy) и L1, который содержит индекс кадра данных в список.

Вот первые строки расплавленного кадра данных:

  dX variable  value L1 
1 4.952296  dY 6.211485e-05 1 
2 6.766889  dY 7.661041e-05 1 
3 8.581481  dY 9.550221e-05 1 
4 10.396074  dY 1.192053e-04 1 
5 12.210666  dY 1.498834e-04 1 
6 14.025259  dY 1.883612e-04 1 
7 15.839851  dY 2.365646e-04 1 
8 17.654444  dY 2.956796e-04 1 
9 19.469036  dY 3.662252e-04 1 
10 21.283629  dY 4.470143e-04 1 

Там есть несколько проблем:

  • «переменные» всегда равен д. Я ожидал, что индекс в кадре данных в списке (который хранится в L1) или даже лучше, результат имени функции (i)
  • Кривая использует непрерывную шкалу от 1 до 36, а я хотел дискретную шкалу
  • Наконец, используя geom_line(), кажется, не рисовать кривые кадры данных по отдельности, но связывает точки разных наборов данных вместе

Любая идея, как решить мой проблема?

+0

Одна из проблем, с которыми вы столкнулись с циклом, - это изменение цвета на основе 'i'. R начнет рециркуляцию цветов после того, как я получу 9 или 10, см. Это для примера: 'plot (1: 20, col = 1: 20, pch = 19)'. Чтобы изменить цвета, вам нужно будет вручную создать вектор цветов для цикла, который вы можете увидеть из 'colors()'. Это вернет все доступные цвета в R – anotherFishGuy

+0

На самом деле это не так, как показано на рисунке после 9 или 10, на графике есть только один цвет ... – Ben

+0

Имеются ли у ваших данных одни и те же имена? Я бы привязал список data.frame к созданию уникального data.frame с столбцом, в котором хранится количество источников данных (от 1 до 36). Тогда я буду строить эти данные с помощью ggplot – cderv

ответ

6

Я бы объединил data.frame в один большой data.frame, добавил столбец идентификаторов, а затем заговорил с ggplot. Много способов сделать это, вот один:

newDF <- do.call(rbind, list.df) 
newDF$id <- factor(rep(1:length(df.list), each = sapply(df.list, nrow))) 
g <- geom(newDF, aes(x = dX, y = dY, colour = id) 
g <- g + geom_line() 
print(g) 
2

Похоже, что самый простой вариант был бы для создания одного кадра данных (как это было предложено одним из комментаторов) и использовать индекс кадра источника данных для colour эстетики:

library(dplyr) # For bind_rows() function 

ggplot(bind_rows(df.list, .id="id"), aes(dX, dY, colour=id)) + 
    geom_line() 

В приведенный выше код .id="id" вызывает bind_rows, чтобы включить столбец с именем id, содержащий имена элементов списка, содержащих каждый из кадров данных.