ggplot aes: цвет против группы с отсутствующими данными временного ряда - PullRequest
0 голосов
/ 20 марта 2020

Я не знаю, идет ли этот вопрос здесь, но так как он конкретен c и (я думаю) у него есть один ответ, я задаю его здесь:

Я пытаюсь понять наверняка поведение в ggplot (через plotnine из python, что практически является копией ggplot). В спецификации c я пытаюсь понять поведение аргументов group и color, например, между aes() из ggplot() и geom_line().

У нас есть это данные:

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())

enter image description here

Выдает эту ошибку:

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

Там, где кажется, что ошибка each group has one observation, но на самом деле я вижу это, потому что нет никаких значений Income для некоторых наблюдений при определенных Category и Period. И я знаю, что есть только одно наблюдение на группу, для построения data Я сгруппировал его по Period и Category, но я не знаю, к какой группировке относится ошибка.

И я решил добавить аргумент group="Category":

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

enter image description here

Но если я изменю цвет и групповые аргументы на geom_line(aes()), как это :

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

Это даст мне точно такой же сюжет. Почему? в чем разница, называя его по другому aes()?.

Кроме того, куда я должен позвонить group = 1 как в этом ответе? Потому что, когда я пытаюсь использовать его с data, я не могу понять, что на самом деле делает ggplot:

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

enter image description here

1 Ответ

1 голос
/ 22 марта 2020

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)'))
)

Plot of assigned 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 - локальное отображение - это относится только к этому geom. В случае конфликта локальное отображение имеет приоритет.

...