2015-10-14 2 views
1

У меня есть набор данных, который имеет два значения для каждой строки, которые я хотел бы строить друг против друга.geom_smooth раскраска для двух значений в строке

Например:

RHC,1,0.370,0.287,0.003,0.063 
SA,1,0.352,0.258,0.003,0.057 
GA,1,0.121,0.091,0.430,0.008 

Я хочу построить отдельную строку для каждого столбца, сгруппированные по первой колонке. Например. для строки RHC я рисую {x, y1} и {x, y2} из {1,0.370} и {1,0.287} соответственно.

Следующая ggplot/geom_smooth выполняет это:

ggplot(data=d) + 
    geom_smooth(aes(x=iterations, y=training.error, col=algorithm)) + 
    geom_smooth(aes(x=iterations, y=testing.error, col=algorithm)) 

Однако обе линии в конечном итоге с одной записью легенды и одного цвета ... что делает их невозможно отличить.

Как я могу применить другой цвет и соответствующую запись легенды для каждой строки, созданной каждым вызовом geom_smooth?

Для воспроизведения:

library(ggplot2) 
d <- read.csv("https://gist.githubusercontent.com/jameskyle/8d233dcbd0ad0b66bfdd/raw/9c975ac9d9bbcb633e44cfd70b66f7ab89dc1517/results.csv") 

p1 <- ggplot(data=d) + 
    geom_smooth(aes(x=iterations, y=training.error, col=algorithm)) + 
    geom_smooth(aes(x=iterations, y=testing.error, col=algorithm)) 

pdf("graph.pdf") 
print(p1) 
dev.off() 

Приведенный выше код будет производить:

ggplot graph

+0

Пожалуйста, прочитайте информацию о том, как дать [минимальный воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610). – Jaap

+0

Пример кода и предоставленные данные. –

ответ

4

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

С data.table пакетом вы можете изменить форму в длинный формат с несколькими столбцами одновременно:

library(data.table) 

# melting operation for the error & time columns simultaneously 
# and setting the appropriate labels for the variable column 
d1 <- melt(setDT(d), 
      measure.vars = patterns('.error','.time'), 
      value.name = c('error','time'))[, variable := c('train','test')[variable]] 

Теперь вы можете сделать граненый сюжет (я добавил досыта, а также для дифференциации между затемненными областями):

ggplot(data=d1) + 
    geom_smooth(aes(x=iterations, y=error, col=variable, fill=variable), size=1) + 
    facet_grid(. ~ algorithm) + 
    theme_bw() 

это приводит:

enter image description here

Если вы действительно хотите, чтобы все в одном участке, вы можете добавить linetype к aes а также для того, чтобы лучше различать между несколькими линиями:

ggplot(data=d1) + 
    geom_smooth(aes(x=iterations, y=error, col=algorithm, linetype=variable), size=1) + 
    theme_bw() 

результат:

enter image description here

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