Составная гистограмма с точками, но с разной эстетической длиной - ggplot2

I have a dataframe which I used the melt function to get to this (length = 118): 

 record_id          value Values
1           8     int_to_out     20
2          14     int_to_out     32
3           5     int_to_out     22
4           6     int_to_out     19
5          31     int_to_out     15
6          48     int_to_out     20
7         100     int_to_out     30
...       ...        ...        ...
113        87 symptom_to_int      7
114        72 symptom_to_int      4
115        99 symptom_to_int      3
116       102 symptom_to_int     36
117       103 symptom_to_int     13
118       111 symptom_to_int      6

Я сделал сложенный штриховой график с помощью этого:

введите описание изображения здесь

На графике 59 элементов y, и мне нужно добавить к ним точки на основе исходных (не плавленных) данных. Итак, я написал это:

ggplot(t, aes(y=as.factor(record_id), x=Values, fill=value)) + 
    geom_bar(position=position_stack(reverse= TRUE), stat="identity") +
    geom_point(data = new_df, aes(x=sorolog, y = record_id), 
                colour = "#a81802", size = 4, shape = 1)

x = sorolog имеет 59 значений для 59 идентификаторов, обнаруженных в record_id.

Но когда я запускаю его, я получаю следующее:

    Error: Aesthetics must be either length 1 or the same as the data (59): fill
Run `rlang::last_error()` to see where the error occurred.

Я считаю, что это конфликт с расплавленными данными, поскольку его длина вдвое больше исходного фрейма данных.

Возникает вопрос: как сложить баллы при такой разнице эстетической длины?

Еще одна проблема: как добавить в сюжет вторую легенду?

Я использовал этот код:

ggplot() + 
    geom_bar(data=t, aes(y=as.factor(record_id), x=Values, fill=value), 
        position=position_stack(reverse= FALSE), stat="identity", width = 0.5) +
        scale_fill_manual(values = c("brown1","chocolate1"),name = "", 
            labels = c("Hospitalization to Discharge", "Symptom to Hospitalization")) +
    geom_point(data = new_df, aes(x=sorolog, y = as.factor(record_id)), 
                colour = "darkcyan", size = 5, shape = 1)+
    geom_point(data = new_df, aes(x=final, y = as.factor(record_id)), 
                colour = "darkred", size = 4, shape = 16)+

        theme_minimal()+
    labs(title="Patient timeline - from symptoms to hospitalization and discharge",
        x ="Days", y = "Patient ID")+
    theme(text = element_text(family = "Garamond", color = "grey20"))

и получил это:  введите описание изображения здесь

но я не могу добавить легенду для элементов geom_point, как я могу это сделать?

ИЗМЕНИТЬ

С редактированием Дэйва Армстронга я получил следующее:

введите описание изображения здесь


person Lucas Lazari    schedule 01.09.2020    source источник
comment
На столбчатой ​​диаграмме вы устанавливаете y=as.factor(record_id), тогда как ваш new_df имеет y сопоставление только с record_id. Если вы заранее не установили new_df$record_id на факторизацию, вероятно, ggplot2 пытается использовать это как непрерывный эстетический, а не дискретный (as.factor). Это то, что здесь происходит?   -  person chemdork123    schedule 01.09.2020
comment
Есть ли что-то еще с именем sorolog или record_id, которое он мог бы попытаться построить? Кажется бессмысленным, что в ошибке указано, что длина должна быть 59, а вы говорите, что существует 59 значений. Возможно, если бы одна переменная была фактором, она могла бы иметь рудиментарные уровни.   -  person Tanner33    schedule 01.09.2020
comment
@ chemdork123, только что пытался это сделать, но проблема осталась.   -  person Lucas Lazari    schedule 01.09.2020
comment
... поскольку ошибка связана с fill aes (см. сообщение об ошибке), я бы попытался сделать fill=value локальным aes для geom_bar.   -  person stefan    schedule 01.09.2020
comment
Да, только что обнаружил, что это в сообщении об ошибке, и собирался опубликовать что-то, пока не увидел, что на это ответили.   -  person chemdork123    schedule 01.09.2020


Ответы (1)


Без доступа к данным вам придется подтвердить, но если вы удалите данные и эстетику из ggplot() и поместите их в geom_bar(), все должно работать:

ggplot() + 
    geom_bar(data=t, aes(y=as.factor(record_id), x=Values, fill=value), 
        position=position_stack(reverse= TRUE), stat="identity") +
    geom_point(data = new_df, aes(x=sorolog, y = record_id), 
                colour = "#a81802", size = 4, shape = 1)

ИЗМЕНИТЬ

Добавляю ответ на вопрос о добавлении цветовой легенды для точек. Также добавил размер и форму точкам.

ggplot() + 
  geom_bar(data=t, aes(y=as.factor(record_id), x=Values, fill=value), 
           position=position_stack(reverse= FALSE), stat="identity", width = 0.5) +
  scale_fill_manual(values = c("brown1","chocolate1"),name = "", 
                    labels = c("Hospitalization to Discharge", "Symptom to Hospitalization")) +
  geom_point(data = new_df, aes(x=sorolog, y = as.factor(record_id), colour="Point Label 1",
                                size="Point Label 1", shape="Point Label 1")) +  
  geom_point(data = new_df, aes(x=final, y = as.factor(record_id), colour="Point Label 2", 
                                size="Point Label 2", shape="Point Label 2")) + 
  scale_colour_manual("points", values=c("Point Label 1" = "darkcyan", "Point Label 2" = "darkred"), 
                      labels= c("Point Label 1", "Point Label 2")) + 
  scale_shape_manual("points", values=c("Point Label 1" = 1, "Point Label 2" = 16), 
                      labels= c("Point Label 1", "Point Label 2")) + 
  scale_size_manual("points", values=c("Point Label 1" = 5, "Point Label 2" = 4), 
                     labels= c("Point Label 1", "Point Label 2")) + 
  theme_minimal()+
  labs(title="Patient timeline - from symptoms to hospitalization and discharge",
       x ="Days", y = "Patient ID")+
  theme(text = element_text(family = "Garamond", color = "grey20"))

Хитрость здесь в том, чтобы поместить все атрибуты точки - цвет, размер и форму - в эстетику с одинаковыми метками. Сами атрибуты, предоставленные values, должны быть названы векторами, имена которых совпадают с эстетическими именами. Я нашел этот пост помогает собрать все воедино.

Основная идея заключается в том, что вам нужно добавить эстетику цвета к точкам, но это не обязательно должно исходить из переменной во фрейме данных, вы можете исправить это на лету.

person DaveArmstrong    schedule 01.09.2020
comment
Это сработало, мне просто нужно было поместить y = as.factor (record_id) в geom_point (). Спасибо - person Lucas Lazari; 01.09.2020
comment
у вас есть идеи, как добавить две разные легенды, одну для geom_bar, а другую для geom_point? - person Lucas Lazari; 02.09.2020
comment
@LucasLazari Я добавил ответ к ответу на исходный вопрос - person DaveArmstrong; 02.09.2020
comment
Это сработало, однако два разных стека точек, мне нужно, чтобы они были разделены .. Я пытаюсь понять это ... Я отредактировал сообщение с результатом - person Lucas Lazari; 02.09.2020
comment
@LucasLazari, что ты имеешь в виду под разделением? Вы имеете в виду, что хотите, чтобы они были рядом друг с другом, а не друг на друге? Если да, то вы можете использовать position = position_nudge(y=.2) для одного набора точек и position = position_nudge(y=-.2) для другого набора точек. - person DaveArmstrong; 02.09.2020
comment
Например, метка точки 1 должна быть только пустым синим кружком. И метка точки 2 должна быть только закрашенным красным кружком. В легенде оба сложены вместе. - person Lucas Lazari; 02.09.2020
comment
@LucasLazari Я отредактировал ответ, чтобы включить эстетику размера и формы. Это должно доставить вас туда, куда вам нужно. - person DaveArmstrong; 02.09.2020
comment
Это сработало отлично, спасибо вам большое! Я почти добирался туда ... Я использовал функцию melt для new_df, что значительно упростило удаление одной geom_point (). Но я все еще изо всех сил пытался понять эстетическую часть. Еще раз спасибо! - person Lucas Lazari; 02.09.2020