ggplot: Error: Aesthetics must be either length 1

2019-08-23 08:33发布

I have a small dataset and I want to plot it with a line graph:

 > Gain
     quantile Positives Total_Examples Positive_Prevalence     Lift Cumsum_Positives
 1:     (0, ]         1              1                   1 1.428571        0.1428571
 2: (1.9,2.8]         1              1                   1 1.428571        0.2857143
 3: (2.8,3.7]         1              1                   1 1.428571        0.4285714
 4: (3.7,4.6]         1              1                   1 1.428571        0.5714286
 5: (4.6,5.5]         1              1                   1 1.428571        0.7142857
 6: (5.5,6.4]         1              1                   1 1.428571        0.8571429
 7: (6.4,7.3]         1              1                   1 1.428571        1.0000000
 8: (7.3,8.2]         0              1                   0 0.000000        1.0000000
 9: (8.2,9.1]         0              1                   0 0.000000        1.0000000
10:  (9.1,10]         0              1                   0 0.000000        1.0000000

My code is the following:

    ggplot(Gain ) +
  geom_area(aes(x = quantile, y = Cumsum_Positives, group = 1), color = "red", fill = "red", alpha = 0.5, size = 2) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  geom_line(aes(x = quantile, y = seq(0, 1 , by = 0.1)  , group = 1), color = "blue", size = 2, alpha = 0.5) +
  scale_x_discrete(name ="% of the Data Set",
                   labels=c("0%", "10%","20%","30%", "40%", "50%", "60%","70%","80%", "90%", "100%"))

However, I get an error message :

  Error: Aesthetics must be either length 1 or the same as the data (10): x, y, group

I have read posts relating to this sort of error and usually the error implies that the variables called within the aesthetics are not present in the original dataframe. But this is not the case here.

I also tried this code, but it returns the same error message as well:

Gain$index <- row.names(Gain)


ggplot(Gain ) +
  geom_area(aes(x = index, y = Cumsum_Positives, group = 1), color = "red", fill = "red", alpha = 0.5, size = 2) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  geom_line(aes(x = quantile, y = seq(0, 1 , by = 0.1)  , group = 1), color = "blue", size = 2, alpha = 0.5) +
  scale_x_discrete(name ="% of the Data Set",
                   labels=c("0%", "10%","20%","30%", "40%", "50%", "60%","70%","80%", "90%", "100%"))

Your advice will be appreciated.

2条回答
家丑人穷心不美
2楼-- · 2019-08-23 09:11

Your data is of length 10, while your y aesthetic in geom_line is of length 11.

seq(0, 1 , by = 0.1)
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

Try seq(0,0.9,by=0.1) or seq(0.1,1,by=0.1)

查看更多
走好不送
3楼-- · 2019-08-23 09:28

If your aim is to draw a line from (x = 0, y = 0) to (x = 0.9, y = 1), you could also replace geom_line with geom_abline:

geom_abline(slope = 1/9,
            intercept = -0.109,
            color = "blue",
            size = 2,
            alpha = 0.5) +
查看更多
登录 后发表回答