我的数据框非常简单,如下所示。
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"))
有关如何解决此问题的任何建议?
答案 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行。您可能需要一个对数刻度,否则您将只能看到非常大的总数,而其他每一行都会重叠。
答案 1 :(得分:2)
一种简单的方法是使用autoplot.zoo
:
library(ggplot2)
library(zoo)
z <- read.zoo(my_df)
autoplot(z, facet = NULL) + scale_y_log10()
(图表后继续):
或没有对数刻度的单独面板:
autoplot(z) + facet_free()
(图表后继续)
注意:以下是可重复形式的输入数据:
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()