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