Построение значений из нескольких столбцов с использованием ggplot - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть data.frame следующим образом

test=data.frame(start=rep("0",10),end=rep("100",10),Typ1=c("530","630","500","400","350","600","1032","378","430","567"),Type2=c("100","70","50","120","130","50","75","86","90","95"),Type3=c("10","50","40","22","13","45","15","36","19","20"))
>test
start end Type1 Type2 Type3
0     100  530   100    10
0     100  630    70    50
0     100  500    50    40
0     100  400   120    22
0     100  350   130    13
0     100  600    50    45
0     100 1032    75    15
0     100  378    86    36
0     100  430    90    19
0     100  567    95    20

Все, что я хочу, это построить вышеуказанный фрейм данных с осью X, обозначающей начало и конец, и осью Y, обозначающей Type1, Type2 и Type3.Я попробовал следующий код, но он выдал ошибку

ggplot(test,aes(x=c(start,end)),y=c(Type1,Type2,Type3)) +geom_density()

Пожалуйста, направьте меня.Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Я не уверен, правильно ли я понимаю ваши вопросы, но я предполагаю, что вам нужен график плотности трех переменных Тип1, Тип2, Тип3, и значения указывают на максимумы линии.Затем вы можете сделать что-то вроде:

test = data.frame(x = seq(0, 100, length.out = 10),
                  Type1 = c(530, 630, 500, 400, 350, 600, 1032, 378, 430, 567),
                  Type2 = c(100, 70, 50, 120, 130, 50, 75, 86, 90, 95),
                  Type3 = c(10, 50, 40, 22, 13, 45, 15, 36, 19, 20))

ggplot(test, aes(x = x)) +
   geom_line(aes(y = Type1, color = "Type 1")) +
   geom_line(aes(y = Type2, color = "Type 2")) +
   geom_line(aes(y = Type3, color = "Type 3"))

Что вам нужно сделать, это использовать собственный слой для каждого столбца вашего data.frame.

1 голос
/ 25 сентября 2019

Сначала приведите ваши данные к длинному формату (лучше работает для ggplot), затем построите график

Я также создал несколько значений x ...

library(data.table)
library(ggplot2)
plotdata <- setDT(test)[, x := seq(0,100,length.out = 10)]
plotdata <- melt( setDT(test), id.vars = c("x"), measure.vars = patterns("^Typ"), value.factor = FALSE )

ggplot( data = plotdata, 
    aes( x = value, 
         color = variable,
         fill = variable)
    ) + 
  geom_density()

enter image description here

1 голос
/ 25 сентября 2019

Ваш фрейм данных организован хорошо, вам не нужно указывать начало и конец фрейма данных.

ggplot ожидают, что каждая строка в вашей df является наблюдением, а каждый столбец - переменной.Это означает, что нам нужно изменить форму данных

library(tidyverse)
test <- data.frame(start=rep("0",10), end=rep("100",10), 
               Type1=c("530","630","500","400","350","600","1032","378","430","567"),
               Type2=c("100","70","50","120","130","50","75","86","90","95"),
               Type3=c("10","50","40","22","13","45","15","36","19","20"))

Обратите внимание, что я исправил опечатку.Теперь мы можем преобразовать это.Вы можете прочитать больше об этом здесь ( приборка ).

df <- gather(test, key = 'Type', value = 'Value', contains('type'))

Содержит указывает, какие переменные использовать для заполнения столбца значений.Ключ и значение просто указывают, какие имена давать столбцам.

> head(df)
  start end  Type Value
1     0 100 Type1   530
2     0 100 Type1   630
3     0 100 Type1   500
4     0 100 Type1   400
5     0 100 Type1   350
6     0 100 Type1   600

Теперь мы можем легко построить его, используя ggplot.

ggplot(df, aes(x = Value, group = Type, fill = Type, color = Type)) + 
  geom_density(alpha = 0.3)

enter image description here

...