2015-10-10 3 views
1

Вот кадр данных:Участок нескольких участков, соответствующих нескольких столбцов, указанного индекс, на 1 графику/оси с использованием ggplot2

> test 
      a   b   c 
1 0.22904349 -0.12023869 0.1546898 
2 1.09504754 -0.20398923 -0.9313251 
3 -0.41200391 -0.16308791 0.6716105 
4 -0.04356308 -1.81898245 -0.8074506 
5 -1.23413459 1.24309479 -1.3861049 
6 0.14266136 -2.22712577 -0.2341793 
7 -0.25113445 0.60213281 -0.8106908 
8 2.52372557 0.03794341 -1.4308955 
9 0.66005867 0.74508029 -0.2922560 
10 1.23552452 -0.26187445 -0.9874546 

То, что я хочу построить являются плотностью а, Ь, с на один граф. Я хочу, чтобы указать столбцы, которые будут отображаться по их индексам. Кроме того, плотность может быть окрашена в соответствии с их столбцами. Это код, который я попробовал:

test<- as.data.frame(cbind(a=rnorm(1:10),b=rnorm(1:10),c=rnorm(1:10))) 
for(i in seq(1,ncol(test),1)){ 
    if(i==1)p<-ggplot(data=test, aes_string(x=names(test)[i])) 
    else p<-p+ggplot(data=test, aes_string(x=names(test)[i])) 
} 
p+geom_density() 

Ошибка я получил:

Error in p + o : non-numeric argument to binary operator 
In addition: Warning message: 
Incompatible methods ("+.gg", "Ops.data.frame") for "+" 

Пожалуйста, советы. Спасибо

+0

ли перечислив их по индексу действительно приоритет? Похоже, вы думаете, что вам нужно это сделать, потому что вы считаете, что вам нужен цикл for, но это не тот случай. – Gregor

+0

Индексирование облегчит называть столбцы, если имеется много столбцов. Приведенный выше фрейм данных является лишь примером. – ConanG

ответ

1

Стандартный ggplot способ заключается в использовании длинных данных, а не в ширину данных:

library(tidyr) 
test_long = gather(test) 

ggplot(test_long, aes(x = value, color = key)) + 
    geom_density() 

Если вы действительно хотите индексы там, мы добавим их к длинным данным:

test_long$index = match(test_long$key, names(test)) 

А затем, чтобы выбрать, какие из них следует строить, это подмножество Данные передаются ggplot

# if you only want columns 2 and 3 from the original data 
ggplot(test_long[test_long$index %in% c(2, 3), ], 
     aes(x = value, color = key)) + 
    geom_density() 

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

p = ggplot(data = test) 

for(i in seq_along(test)) { 
    if (i == 1) p = p + geom_density(aes_string(x = names(test)[i])) 
    else p = p + geom_density(aes_string(x = names(test)[i]), color = "green") 
} 

print(p) 

В этом случае ggplot не используется по назначению, так что вы должны были бы создать свои собственные цвета и добавление легенды будет реальная боль. Это часть того, почему вы должны сделать это по-другому, простым способом.


изменения: В свежем R сессии, это работает так хорошо для меня:

# load packages 
library(tidyr) 
library(ggplot2) 

# data from the question 
test <- as.data.frame(cbind(a=rnorm(1:10),b=rnorm(1:10),c=rnorm(1:10))) 

# long format 
test_long = gather(test) 

# plot all 3 
ggplot(test_long, aes(x = value, color = key)) + 
    geom_density() 

# add original data indices 
test_long$index = match(test_long$key, names(test)) 

# plot only columns 2 and 3 
ggplot(test_long[test_long$index %in% c(2, 3), ], 
     aes(x = value, color = key)) + 
    geom_density() 
+0

Привет, Грегор, извините за поздний ответ. Если у вас возникли проблемы с установкой tidyr и был занят, но теперь все в порядке. Первый набор кода прошел нормально. Тем не менее, у меня есть проблема с использованием второго набора кода, который для столбцов 2 и 3. Я получаю эту ошибку: «Ошибка в существовании (имя, envir = env, mode = mode): отсутствует аргумент« env », без значения по умолчанию." – ConanG

+0

Вы запустили второй блок кода, прежде чем пытаться построить участок в третьем блоке кода? Это ошибка, которую вы получили бы, если бы вы не запускали' test_long $ index = match (... 'line. – Gregor

+0

Я действительно запускал этот «test_long $ index = match (...» line и проверили еще раз. Ошибка все еще существует. – ConanG

0

ggplot2 вам нравится, чтобы быть длинным, а не широким. В этом случае, мы можем сделать ваши данные в ширине с помощью библиотеки tidyr (или reshape2 или reshape или data.table)

set.seed(1234) 
test <- as.data.frame(cbind(a = rnorm(1:10), b = rnorm(1:10), c = rnorm(1:10))) 
library(tidyr) 

data <- gather(test, letter, value) 

Посмотри на то, как данные выложены, одна меры в строку. Теперь сюжет:

library(ggplot2) 
ggplot(data, aes(x = value, col = letter)) + 
     geom_density() 

enter image description here