2015-12-04 4 views
1

У меня очень простой фрейм данных, как показано ниже.Облицовка проблемы с ggplot

cat_group  total abort_rate   cancel_rate success_rate 
     100  1804  18.8    45.1   31.8 
     200  4118  17.7    30.0   48.3 
     500  14041  19.2    16.9   60.0 

Я пытаюсь поставить эти данные на участке таким образом, что на оси х, у меня будет cat_group, и тогда я бы выравнивают участок общей сложности все остальные переменные, abort_rate, cancel_rate и success_rate. Моя идея - показать, как каждая из этих переменных изменяется в зависимости от значения в cat_group. Мне нужно было четыре линии в общей сложности, по одному для каждой переменной в другом цвете

Но когда я использую ниже график функции в R, я вижу ошибку: geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?

ggplot(my_data_frame, aes(category)) + 
    geom_line(aes(y = abort_rate, colour = "abort_rate")) + 
    geom_line(aes(y = success_rate, colour = "success_rate"))+ 
    geom_line(aes(y = success_rate, colour = "total"))+ 
    geom_line(aes(y = success_rate, colour = "cancel_rate")) 

Любые предложения о том, как решить эту проблему?

+1

Там нет 'category' колонка в вашем data.frame. Пожалуйста исправьте. И вы должны «расплавиться», чтобы переключиться с широкого формата на длинный. –

ответ

2

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

my_data_frame$cat_group <- as.factor(my_data_frame$cat_group) 

library(ggplot2) 
ggplot(my_data_frame, aes(cat_group)) + 
    geom_line(aes(y = abort_rate, colour = "abort_rate", group=1)) + 
    geom_line(aes(y = success_rate, colour = "success_rate", group=1))+ 
    geom_line(aes(y = success_rate, colour = "total", group=1))+ 
    geom_line(aes(y = success_rate, colour = "cancel_rate", group=1)) 

т.е. указав одну группу на geom_line. У этого есть проблема, что весы не будут достаточно хороши, потому что они будут установлены первой геометрией, и поэтому только 2 из 4 строк будут показаны.

Типичный способ работы с такими данными, чтобы расплавить data.frame, а затем построить его так:

library(reshape2) 
dfm <- melt(my_data_frame, id.vars='cat_group') 
ggplot(dfm, aes(x=cat_group, y=value, colour=variable, group=variable)) + geom_line() + 
    scale_y_log10() 

Уведомление о scale_y_log10 для того, чтобы построить (и на самом деле увидеть) все 4 линии. Вероятно, вам нужна шкала журнала, так как в противном случае вы сможете увидеть общее количество, которое очень велико, и каждая другая строка будет перекрываться.

enter image description here

+0

Это был ответ, который я использовал. Раньше я ошибочно отмечал вышеупомянутый ответ. Извиняюсь! – greenhorntechie

+0

Нет проблем :). Еще один подтвержденный ответ тоже хороший. Очень рад, что я мог бы помочь :) – LyzandeR

0

Лучший способ решить эту проблему для перегруппировки ваших данных, чтобы у вас был один столбец для оси x и один для оси y и один для того, какой тип данных содержится в строке. Для этого вы можете использовать пакет tidyr.

library(tidyr) 
plottingData <- df %>% gather(type,value,-cat_group) 

ggplot(plottingData,aes(x=cat_group,y=value,color=type)) + geom_line() 
2

Один простой способ сделать это состоит в использовании autoplot.zoo:

library(ggplot2) 
library(zoo) 

z <- read.zoo(my_df) 
autoplot(z, facet = NULL) + scale_y_log10() 

(продолжено после графика):

screenshot

или для отдельных панелей без логарифмической шкалы :

autoplot(z) + facet_free() 

(продолжение после графа)

screenshot

Примечание: Здесь входные данные в воспроизводимой форме:

Lines <- "cat_group  total abort_rate   cancel_rate success_rate 
     100  1804  18.8    45.1   31.8 
     200  4118  17.7    30.0   48.3 
     500  14041  19.2    16.9   60.0" 
my_df <- read.table(text = Lines, header = TRUE) 
+0

Спасибо за своевременный ответ – greenhorntechie

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