面对ggplot的问题

时间:2015-12-04 10:48:48

标签: r ggplot2

我的数据框非常简单,如下所示。

  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,然后我会绘制所有其他变量total,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"))

有关如何解决此问题的任何建议?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

答案 2 :(得分: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()