2015-12-04 59 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 

我试图把上,使得在x轴,我将有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

。在你的data.frame没有'category'列。请修复。而且你应该“融化”从宽到长的格式。 –

回答

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指定一组。这有一个问题,即尺度不够好,因为它们将由第一个geom_line设置,因此4行中只有2个会显示。

与这样的数据工作的典型的方法是熔化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

没有probs :)其他upvoted答案也是一个好的。非常高兴我可以帮助:) – 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