GGPlot2:错误:美学必须是长度1或与数据(16)相同:x,y,组

时间:2016-10-09 17:37:56

标签: r ggplot2 linegraph

以下是我认为简单折线图的代码

(__ \ "realtime_accesses").format[List[Map[String, Map[String, Int]]]].inmap(
  m => {
    val markets = m.flatMap(_.values)
      .map { v => v("marketID") -> v("level") }
      .toMap
    RealTimeAccesses(markets)
  },
  (m: RealTimeAccesses) => m.markets.map {
    case (marketID, level) =>
      Map("realtime-access" ->
        Map(
          "marketID" -> marketID,
          "level" -> level
        ))
  }.toList
)

我收到了这个错误:

  

错误:美学必须是长度1或与数据(16)相同:x,y,group

我在r中的数据框中有数据。我的X轴将是多年,Y轴将是我每年建造的一些计算(其中16个)。

已编辑添加

ggplot(data=top15andAllDatasummary.df, aes(x=years, y=calculations, group=1)) +
    geom_line() +
    geom_point()

指向完整> 100K数据集的链接为here

2 个答案:

答案 0 :(得分:2)

根据您的数据,我会这样做:

library(tidyr)
top15andAllDatasummary.df$variable = rownames(top15andAllDatasummary.df)
df.long = gather(data = top15andAllDatasummary.df, 
                 key = years, 
                 value = calculations, 
                 -variable)

gather调用的重点是将您的数据重组为以下格式:

head(df.long)
#                        variable years calculations
# 1             AllDataMeanByYear  2001   349.315751
# 2         AllDataMeanAggAssault  2001   217.474364
# 3 AllDataMeanMurderManSlaughter  2001     5.179639
# 4            AllDataMeanRobbery  2001   126.661748
# 5           AllDataMedianByYear  2001    57.000000
# 6       AllDataMedianAggAssault  2001    39.000000

完成后,我们可以继续绘图:

ggplot(data = df.long, aes(x = years, 
                           y = calculations, 
                           group=variable, 
                           color=variable)) +
   geom_line() +
   geom_point()

这是您想要的结果吗?

答案 1 :(得分:2)

您的数据框(我们称之为df)每年都有一列,以及每个计算变量的rownames。这是“宽”数据,其中每行具有多个数据值。 ggplot 用于处理“长”数据,其中每一行都有一个包含数据值的列,而其他列则告诉我们有关该数据点的信息(即数据指向哪个变量)代表它来自哪一年。

Hadley Wickham(也写了 ggplot )的 tidyverse 软件包库可以轻松地将数据从宽到长再转换回来。

library(tidyverse)

df.new <- mutate(df, variable = rownames(df)) %>% 
    gather(year, value, -variable)

                        variable year      value
1              AllDataMeanByYear 2001 349.315751
2          AllDataMeanAggAssault 2001 217.474364
3  AllDataMeanMurderManSlaughter 2001   5.179639
4             AllDataMeanRobbery 2001 126.661748
5            AllDataMedianByYear 2001  57.000000
6        AllDataMedianAggAssault 2001  39.000000
7              AllDataMeanByYear 2002 703.266939
8          AllDataMeanAggAssault 2002 429.920000
9  AllDataMeanMurderManSlaughter 2002   9.328980
10            AllDataMeanRobbery 2002 264.017959
11           AllDataMedianByYear 2002 161.000000
12       AllDataMedianAggAssault 2002 108.000000
13             AllDataMeanByYear 2003 314.897775
14         AllDataMeanAggAssault 2003 193.792420
15 AllDataMeanMurderManSlaughter 2003   4.089360
16            AllDataMeanRobbery 2003 117.015994
17           AllDataMedianByYear 2003  54.000000
18       AllDataMedianAggAssault 2003  37.000000
19             AllDataMeanByYear 2004 305.988451
20         AllDataMeanAggAssault 2004 190.680027
... and 70 more rows

然后可以将此长数据发送到 ggplot 。请注意,您的原始尝试使用了一个名为“years”的变量,该变量在数据框中不存在。 R(和 ggplot )无法知道你的专栏名称(2001:2015)在某种程度上神奇地代表了几年。

plot.years <- ggplot(data = df.new, aes(x = year, y = value, color = variable, group = variable)) +
    geom_line()
print(plot.years)

enter image description here