【问题标题】:ggplot aes: color vs group with time series data missingggplot aes:颜色与时间序列数据缺失的组
【发布时间】:2020-03-20 19:05:55
【问题描述】:

我不知道这个问题是否在这里,但由于它是具体的并且(我认为)它有一个答案我在这里问它:

我试图了解ggplot 中的某些行为(通过python 中的plotnine,它实际上是ggplot 的副本)。具体来说,我试图了解group 和color 参数的行为,例如ggplot() 和geom_line() 之间的aes()。

我们有这些数据:

data = pd.DataFrame({'Period': {0: '2019/07', 1: '2019/07', 2: '2019/07', 3: '2019/08', 4: '2019/09', 5: '2019/09', 6: '2019/10', 7: '2019/10', 8: '2019/11', 9: '2019/11', 10: '2019/12', 11: '2019/12', 12: '2019/12', 13: '2020/01', 14: '2020/01', 15: '2020/01', 16: '2020/02', 17: '2020/02', 18: '2020/02', 19: '2020/03', 20: '2020/03', 21: '2020/03'},
                     'Category': {0: 'A', 1: 'B', 2: 'C', 3: 'A', 4: 'A', 5: 'C', 6: 'A', 7: 'C', 8: 'A', 9: 'C', 10: 'A', 11: 'B', 12: 'C', 13: 'A', 14: 'B', 15: 'C', 16: 'A', 17: 'B', 18: 'C', 19: 'A', 20: 'B', 21: 'C'},
                     'Income': {0: 350.6, 1: 52.4, 2: 33.4, 3: 105.5, 4: 203.4, 5: 114.7, 6: 272.3, 7: 157.4, 8: 288.0, 9: 24.1, 10: 345.5, 11: 27.2, 12: 10.8, 13: 187.8, 14: 111.7, 15: 49.2, 16: 293.1, 17: 77.7, 18: 132.8, 19: 221.8, 20: 27.6, 21: 87.0}})

当我尝试绘制它时:

(ggplot(data, aes(x="Period", y="Income", color="Category"))
 + geom_line())

它给出了这个错误:

PlotnineWarning: geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?

错误似乎是each group has one observation,但实际上我可以看到这是因为在给定某个Category 和Period 的情况下,某些观察没有Income 值。而且我知道每个组只有一个观察值,至于构造data,我将它按Period和Category分组,但我不知道错误指的是哪种分组。

我解决了添加参数group="Category":

(ggplot(data, aes(x="Period", y="Income", color="Category", group = "Category"))
 + geom_line())

但如果我像这样将颜色和组参数更改为geom_line(aes()):

(ggplot(data, aes(x="Period", y="Income"))
 + geom_line(aes(color="Category", group = "Category")))

它会给我完全相同的情节。 为什么?在不同的aes() 上调用它有什么区别?。

另外,我应该在哪里打电话给group = 1,就像this 一样?因为当我尝试将它与 data 一起使用时,我无法理解 ggplot 实际上在做什么:

(ggplot(data, aes(x="Period", y="Income", color="Category", group = 1))
 + geom_line())

【问题讨论】:

    标签: ggplot2 plotnine


    【解决方案1】:

    group 如果没有显式映射,则使用所有其他离散美学的组合来计算。在这些映射中

    aes(x="Period", y="Income", color="Category")
    

    Period 和 Category 是离散的,它们以这样一种方式组合在一起,即没有一个结果组有一个以上的点。您实际上可以使用

    查看计算的组
    (ggplot(data, aes(x="Period", y="Income", color="Category"))
     + geom_line()
     + geom_label(aes(label='stat(group)'))
    )
    

    您需要两个或更多点(在一组中)才能获得一条线。如果您希望所有点都属于同一个组,那么您将 group 设置为一个常量,这就是 group=1 实现的。

    关于 aes

    您可以在 3 个地方放置 aes 映射。

    ggplot(data, aes(..)) + geom_point()     # 1
    ggplot(data) + aes(...) + geom_point()   # 2
    ggplot(data) + geom_point(aes(...))      # 3
    

    1 和 2 为您提供全局映射,即所有几何图形都可以看到它们,而 3 是局部映射——它仅适用于该几何图形。如果发生冲突,本地映射优先。

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2021-06-09
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 2015-04-06
      • 2016-11-21
      相关资源
      最近更新 更多