Marcus
Marcus

Reputation: 23

Creating multiple overlaid density plots in ggplot2

I have a data.frame ("data") with 6 variables/columns. 1 of these variables is named "output" and can only take one of two values (0 or 1).

I want to generate density plots for the remaining 5 variables (with the plots shown side by side). I want each of the 5 plots to show 2 overlapping density plots (one corresponding to output of "0" and the other corresponding to output of "1".

To try to achieve this I have first "melted" the data frame using the melt() function from the reshape package. I have then used the subset() function to generate 2 dataframes (one containing the rows with output 0 and the other containing the rows with output 1. I have then created a ggplot with facet_grid as shown below:

melteddata = melt(data,id.vars="output",variable.name="variable")
melteddata0 = subset(melteddata, output==0)    
melteddata1 = subset(melteddata, output==1)
u <- ggplot()+geom_density(data=melteddata0,aes(x=variable),fill="green",alpha=0.5)+geom_density(data=melteddata1,aes(x=variable),fill="red",alpha=0.5)+facet_grid(~variable)
u

Plot of "u" (generated from the above code)

"facet_grid" has created individual plots as expected but each individual plot contains all of the variables. Are there any suggestions has to how I can fix this? Or how I can produce this graphic in an easy/quick way? For reference I am expecting the individual "age" plot to look like this:

enter image description here

The data.frame used is shown below:

data <- structure(list(age = structure(c(63L, 37L, 41L, 56L, 57L, 57L, 
56L, 44L, 52L, 57L, 54L, 48L, 49L, 64L, 58L, 50L, 58L, 66L, 43L, 
69L, 59L, 44L, 42L, 61L, 40L, 71L, 59L, 51L, 65L, 53L, 41L, 65L, 
44L, 54L, 51L, 46L, 54L, 54L, 65L, 65L, 51L, 48L, 45L, 53L, 39L, 
52L, 44L, 47L, 53L, 53L, 51L, 66L, 62L, 44L, 63L, 52L, 48L, 45L, 
34L, 57L, 71L, 54L, 52L, 41L, 58L, 35L, 51L, 45L, 44L, 62L, 54L, 
51L, 29L, 51L, 43L, 55L, 51L, 59L, 52L, 58L, 41L, 45L, 60L, 52L, 
42L, 67L, 68L, 46L, 54L, 58L, 48L, 57L, 52L, 54L, 45L, 53L, 62L, 
52L, 43L, 53L, 42L, 59L, 63L, 42L, 50L, 68L, 69L, 45L, 50L, 50L, 
64L, 57L, 64L, 43L, 55L, 37L, 41L, 56L, 46L, 46L, 64L, 59L, 41L, 
54L, 39L, 34L, 47L, 67L, 52L, 74L, 54L, 49L, 42L, 41L, 41L, 49L, 
60L, 62L, 57L, 64L, 51L, 43L, 42L, 67L, 76L, 70L, 44L, 60L, 44L, 
42L, 66L, 71L, 64L, 66L, 39L, 58L, 47L, 35L, 58L, 56L, 56L, 55L, 
41L, 38L, 38L, 67L, 67L, 62L, 63L, 53L, 56L, 48L, 58L, 58L, 60L, 
40L, 60L, 64L, 43L, 57L, 55L, 65L, 61L, 58L, 50L, 44L, 60L, 54L, 
50L, 41L, 51L, 58L, 54L, 60L, 60L, 59L, 46L, 67L, 62L, 65L, 44L, 
60L, 58L, 68L, 62L, 52L, 59L, 60L, 49L, 59L, 57L, 61L, 39L, 61L, 
56L, 43L, 62L, 63L, 65L, 48L, 63L, 55L, 65L, 56L, 54L, 70L, 62L, 
35L, 59L, 64L, 47L, 57L, 55L, 64L, 70L, 51L, 58L, 60L, 77L, 35L, 
70L, 59L, 64L, 57L, 56L, 48L, 56L, 66L, 54L, 69L, 51L, 43L, 62L, 
67L, 59L, 45L, 58L, 50L, 62L, 38L, 66L, 52L, 53L, 63L, 54L, 66L, 
55L, 49L, 54L, 56L, 46L, 61L, 67L, 58L, 47L, 52L, 58L, 57L, 58L, 
61L, 42L, 52L, 59L, 40L, 61L, 46L, 59L, 57L, 57L, 55L, 61L, 58L, 
58L, 67L, 44L, 63L, 63L, 59L, 57L, 45L, 68L, 57L, 57L), age = "Age of patient"), 
    trtbps = c(145L, 130L, 130L, 120L, 120L, 140L, 140L, 120L, 
    172L, 150L, 140L, 130L, 130L, 110L, 150L, 120L, 120L, 150L, 
    150L, 140L, 135L, 130L, 140L, 150L, 140L, 160L, 150L, 110L, 
    140L, 130L, 105L, 120L, 130L, 125L, 125L, 142L, 135L, 150L, 
    155L, 160L, 140L, 130L, 104L, 130L, 140L, 120L, 140L, 138L, 
    128L, 138L, 130L, 120L, 130L, 108L, 135L, 134L, 122L, 115L, 
    118L, 128L, 110L, 108L, 118L, 135L, 140L, 138L, 100L, 130L, 
    120L, 124L, 120L, 94L, 130L, 140L, 122L, 135L, 125L, 140L, 
    128L, 105L, 112L, 128L, 102L, 152L, 102L, 115L, 118L, 101L, 
    110L, 100L, 124L, 132L, 138L, 132L, 112L, 142L, 140L, 108L, 
    130L, 130L, 148L, 178L, 140L, 120L, 129L, 120L, 160L, 138L, 
    120L, 110L, 180L, 150L, 140L, 110L, 130L, 120L, 130L, 120L, 
    105L, 138L, 130L, 138L, 112L, 108L, 94L, 118L, 112L, 152L, 
    136L, 120L, 160L, 134L, 120L, 110L, 126L, 130L, 120L, 128L, 
    110L, 128L, 120L, 115L, 120L, 106L, 140L, 156L, 118L, 150L, 
    120L, 130L, 160L, 112L, 170L, 146L, 138L, 130L, 130L, 122L, 
    125L, 130L, 120L, 132L, 120L, 138L, 138L, 160L, 120L, 140L, 
    130L, 140L, 130L, 110L, 120L, 132L, 130L, 110L, 117L, 140L, 
    120L, 150L, 132L, 150L, 130L, 112L, 150L, 112L, 130L, 124L, 
    140L, 110L, 130L, 128L, 120L, 145L, 140L, 170L, 150L, 125L, 
    120L, 110L, 110L, 125L, 150L, 180L, 160L, 128L, 110L, 150L, 
    120L, 140L, 128L, 120L, 118L, 145L, 125L, 132L, 130L, 130L, 
    135L, 130L, 150L, 140L, 138L, 200L, 110L, 145L, 120L, 120L, 
    170L, 125L, 108L, 165L, 160L, 120L, 130L, 140L, 125L, 140L, 
    125L, 126L, 160L, 174L, 145L, 152L, 132L, 124L, 134L, 160L, 
    192L, 140L, 140L, 132L, 138L, 100L, 160L, 142L, 128L, 144L, 
    150L, 120L, 178L, 112L, 123L, 108L, 110L, 112L, 180L, 118L, 
    122L, 130L, 120L, 134L, 120L, 100L, 110L, 125L, 146L, 124L, 
    136L, 138L, 136L, 128L, 126L, 152L, 140L, 140L, 134L, 154L, 
    110L, 128L, 148L, 114L, 170L, 152L, 120L, 140L, 124L, 164L, 
    140L, 110L, 144L, 130L, 130L), chol = c(233L, 250L, 204L, 
    236L, 354L, 192L, 294L, 263L, 199L, 168L, 239L, 275L, 266L, 
    211L, 283L, 219L, 340L, 226L, 247L, 239L, 234L, 233L, 226L, 
    243L, 199L, 302L, 212L, 175L, 417L, 197L, 198L, 177L, 219L, 
    273L, 213L, 177L, 304L, 232L, 269L, 360L, 308L, 245L, 208L, 
    264L, 321L, 325L, 235L, 257L, 216L, 234L, 256L, 302L, 231L, 
    141L, 252L, 201L, 222L, 260L, 182L, 303L, 265L, 309L, 186L, 
    203L, 211L, 183L, 222L, 234L, 220L, 209L, 258L, 227L, 204L, 
    261L, 213L, 250L, 245L, 221L, 205L, 240L, 250L, 308L, 318L, 
    298L, 265L, 564L, 277L, 197L, 214L, 248L, 255L, 207L, 223L, 
    288L, 160L, 226L, 394L, 233L, 315L, 246L, 244L, 270L, 195L, 
    240L, 196L, 211L, 234L, 236L, 244L, 254L, 325L, 126L, 313L, 
    211L, 262L, 215L, 214L, 193L, 204L, 243L, 303L, 271L, 268L, 
    267L, 199L, 210L, 204L, 277L, 196L, 269L, 201L, 271L, 295L, 
    235L, 306L, 269L, 178L, 208L, 201L, 263L, 295L, 303L, 209L, 
    223L, 197L, 245L, 242L, 240L, 226L, 180L, 228L, 149L, 227L, 
    278L, 220L, 197L, 253L, 192L, 220L, 221L, 240L, 342L, 157L, 
    175L, 175L, 286L, 229L, 268L, 254L, 203L, 256L, 229L, 284L, 
    224L, 206L, 167L, 230L, 335L, 177L, 276L, 353L, 225L, 330L, 
    230L, 243L, 290L, 253L, 266L, 233L, 172L, 305L, 216L, 188L, 
    282L, 185L, 326L, 231L, 254L, 267L, 248L, 197L, 258L, 270L, 
    274L, 164L, 255L, 239L, 258L, 188L, 177L, 229L, 260L, 219L, 
    307L, 249L, 341L, 263L, 330L, 254L, 256L, 407L, 217L, 282L, 
    288L, 239L, 174L, 281L, 198L, 288L, 309L, 243L, 289L, 289L, 
    246L, 322L, 299L, 300L, 293L, 304L, 282L, 269L, 249L, 212L, 
    274L, 184L, 274L, 409L, 246L, 283L, 254L, 298L, 247L, 294L, 
    299L, 273L, 309L, 259L, 200L, 244L, 231L, 228L, 230L, 282L, 
    269L, 206L, 212L, 327L, 149L, 286L, 283L, 249L, 234L, 237L, 
    234L, 275L, 212L, 218L, 261L, 319L, 166L, 315L, 204L, 218L, 
    223L, 207L, 311L, 204L, 232L, 335L, 205L, 203L, 318L, 225L, 
    212L, 169L, 187L, 197L, 176L, 241L, 264L, 193L, 131L, 236L
    ), thalachh = c(150L, 187L, 172L, 178L, 163L, 148L, 153L, 
    173L, 162L, 174L, 160L, 139L, 171L, 144L, 162L, 158L, 172L, 
    114L, 171L, 151L, 161L, 179L, 178L, 137L, 178L, 162L, 157L, 
    123L, 157L, 152L, 168L, 140L, 188L, 152L, 125L, 160L, 170L, 
    165L, 148L, 151L, 142L, 180L, 148L, 143L, 182L, 172L, 180L, 
    156L, 115L, 160L, 149L, 151L, 146L, 175L, 172L, 158L, 186L, 
    185L, 174L, 159L, 130L, 156L, 190L, 132L, 165L, 182L, 143L, 
    175L, 170L, 163L, 147L, 154L, 202L, 186L, 165L, 161L, 166L, 
    164L, 184L, 154L, 179L, 170L, 160L, 178L, 122L, 160L, 151L, 
    156L, 158L, 122L, 175L, 168L, 169L, 159L, 138L, 111L, 157L, 
    147L, 162L, 173L, 178L, 145L, 179L, 194L, 163L, 115L, 131L, 
    152L, 162L, 159L, 154L, 173L, 133L, 161L, 155L, 170L, 168L, 
    162L, 172L, 152L, 122L, 182L, 172L, 167L, 179L, 192L, 143L, 
    172L, 169L, 121L, 163L, 162L, 162L, 153L, 163L, 163L, 96L, 
    140L, 126L, 105L, 157L, 181L, 173L, 142L, 116L, 143L, 149L, 
    171L, 169L, 150L, 138L, 125L, 155L, 152L, 152L, 131L, 179L, 
    174L, 144L, 163L, 169L, 166L, 182L, 173L, 173L, 108L, 129L, 
    160L, 147L, 155L, 142L, 168L, 160L, 173L, 132L, 114L, 160L, 
    158L, 120L, 112L, 132L, 114L, 169L, 165L, 128L, 153L, 144L, 
    109L, 163L, 158L, 142L, 131L, 113L, 142L, 155L, 140L, 147L, 
    163L, 99L, 158L, 177L, 141L, 111L, 150L, 145L, 161L, 142L, 
    157L, 139L, 162L, 150L, 140L, 140L, 146L, 144L, 136L, 97L, 
    132L, 127L, 150L, 154L, 111L, 174L, 133L, 126L, 125L, 103L, 
    130L, 159L, 131L, 152L, 124L, 145L, 96L, 109L, 173L, 171L, 
    170L, 162L, 156L, 112L, 143L, 132L, 88L, 105L, 166L, 150L, 
    120L, 195L, 146L, 122L, 143L, 106L, 125L, 125L, 147L, 130L, 
    126L, 154L, 182L, 165L, 160L, 95L, 169L, 108L, 132L, 117L, 
    126L, 116L, 103L, 144L, 145L, 71L, 156L, 118L, 168L, 105L, 
    141L, 152L, 125L, 125L, 156L, 134L, 181L, 138L, 120L, 162L, 
    164L, 143L, 130L, 161L, 140L, 146L, 150L, 144L, 144L, 136L, 
    90L, 123L, 132L, 141L, 115L, 174L), oldpeak = c(2.3, 3.5, 
    1.4, 0.8, 0.6, 0.4, 1.3, 0, 0.5, 1.6, 1.2, 0.2, 0.6, 1.8, 
    1, 1.6, 0, 2.6, 1.5, 1.8, 0.5, 0.4, 0, 1, 1.4, 0.4, 1.6, 
    0.6, 0.8, 1.2, 0, 0.4, 0, 0.5, 1.4, 1.4, 0, 1.6, 0.8, 0.8, 
    1.5, 0.2, 3, 0.4, 0, 0.2, 0, 0, 0, 0, 0.5, 0.4, 1.8, 0.6, 
    0, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.4, 1.2, 0.6, 0, 0, 0.4, 
    0, 0, 0, 0.2, 1.4, 2.4, 0, 0, 0.6, 0, 0, 0, 1.2, 0.6, 1.6, 
    1, 0, 1.6, 1, 0, 0, 0, 0, 0, 0, 1.2, 0.1, 1.9, 0, 0.8, 4.2, 
    0, 0.8, 0, 1.5, 0.1, 0.2, 1.1, 0, 0, 0.2, 0.2, 0, 0, 0, 2, 
    1.9, 0, 0, 2, 0, 0, 0, 0, 0.7, 0.1, 0, 0.1, 0.2, 0, 0, 0, 
    0, 0, 0, 0, 0, 1.5, 0.2, 0.6, 1.2, 0, 0.3, 1.1, 0, 0.3, 0.9, 
    0, 0, 2.3, 1.6, 0.6, 0, 0, 0.6, 0, 0, 0.4, 0, 0, 1.2, 0, 
    0, 0, 1.5, 2.6, 3.6, 1.4, 3.1, 0.6, 1, 1.8, 3.2, 2.4, 2, 
    1.4, 0, 2.5, 0.6, 1.2, 1, 0, 2.5, 2.6, 0, 1.4, 2.2, 0.6, 
    0, 1.2, 2.2, 1.4, 2.8, 3, 3.4, 3.6, 0.2, 1.8, 0.6, 0, 2.8, 
    0.8, 1.6, 6.2, 0, 1.2, 2.6, 2, 0, 0.4, 3.6, 1.2, 1, 1.2, 
    3, 1.2, 1.8, 2.8, 0, 4, 5.6, 1.4, 4, 2.8, 2.6, 1.4, 1.6, 
    0.2, 1.8, 0, 1, 0.8, 2.2, 2.4, 1.6, 0, 1.2, 0, 0, 2.9, 0, 
    2, 1.2, 2.1, 0.5, 1.9, 0, 0, 2, 4.2, 0.1, 1.9, 0.9, 0, 0, 
    3, 0.9, 1.4, 3.8, 1, 0, 2, 1.8, 0, 0.1, 3.4, 0.8, 3.2, 1.6, 
    0.8, 2.6, 1, 0.1, 1, 1, 2, 0.3, 0, 3.6, 1.8, 1, 2.2, 0, 1.9, 
    1.8, 0.8, 0, 3, 2, 0, 4.4, 2.8, 0.8, 2.8, 4, 0, 1, 0.2, 1.2, 
    3.4, 1.2, 0), output = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 
-303L), class = "data.frame")

Upvotes: 2

Views: 100

Answers (1)

stefan
stefan

Reputation: 124148

There is no need to subset your dataframe. Simply map output or factor(output) on fill and set the colors via scale_fill_manual. The main issue however is that you mapped variable on x instead of value. Additionally as you variables have different scales I would suggest to make use of scales=free inside facet_grid or as you have only one "dimension" facet_wrap:

library(ggplot2)

melteddata = reshape::melt(data,id.vars="output",variable.name="variable")

ggplot(melteddata)+
  geom_density(data=melteddata,aes(x=value, fill = factor(output)), alpha=0.5)+
  scale_fill_manual(values = c("0" = "green", "1" = "red")) +
  facet_wrap(~variable, scales = "free", nrow = 1)

enter image description here

Upvotes: 1

Related Questions