corybrunson / ggalluvial

ggplot2 extension for alluvial plots
http://corybrunson.github.io/ggalluvial/
GNU General Public License v3.0
497 stars 34 forks source link

Mixed flow overlap when many flows? #20

Closed giocomai closed 6 years ago

giocomai commented 6 years ago

As appears from the image below (see the flows on the right), some of the flows seem to overlap untidily. This is odd, as the same seem to work nicely when there are fewer flows (see left part of the graph). Am I getting something wrong, or is it a ggalluvial issue?

Reprex

library(tidyverse)
#> ── Attaching packages ──────────────────────────────── tidyverse 1.2.1 ──
#> ✔ ggplot2 2.2.1.9000     ✔ purrr   0.2.5     
#> ✔ tibble  1.4.2          ✔ dplyr   0.7.5     
#> ✔ tidyr   0.8.1          ✔ stringr 1.3.1     
#> ✔ readr   1.1.1          ✔ forcats 0.3.0
#> ── Conflicts ─────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag()    masks stats::lag()
library(ggalluvial)
temp <- structure(list(Year = c(2013, 2013, 2013, 2013, 2013, 2013, 2013, 
                                2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 
                                2013, 2013, 2013, 2013, 2013, 2013, 2014, 2014, 2014, 2014, 2014, 
                                2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 
                                2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 
                                2014, 2014, 2014, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 
                                2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 
                                2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 
                                2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2016, 2016, 2016, 
                                2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 
                                2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 
                                2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 
                                2016, 2016, 2016, 2016, 2016, 2016, 2017, 2017, 2017, 2017, 2017, 
                                2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 
                                2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 
                                2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 
                                2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 
                                2017, 2017, 2017, 2017, 2017, 2017, 2017, 2018, 2018, 2018, 2018, 
                                2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 
                                2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 
                                2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 
                                2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 
                                2018, 2018),
                       author = c("T0AyKT8Bkx", "0ytwbceM2D", "HjlQ2M1lJG", 
                                  "ynwBekOt3r", "28tbzZPwLN", "MwGYdVwqSM", "Jz4DnutsjK", "38xc9xteGj", 
                                  "NBAmFujl7g", "rZnOB4J8KR", "fykgBmmPF4", "7d4bBkDK4y", "LA7La6qEgR", 
                                  "dvcaFXbxAI", "CY7azmOSim", "DDm2KDepEf", "IdAzlUoUGB", "aemSd860xK", 
                                  "2pO3wvNnM7", "Slr7CRJ6LJ", "q7W2DC5XbL", "lrCnv2P8rT", "QGP2CBiQTZ", 
                                  "kFDTwFMibh", "T0AyKT8Bkx", "0ytwbceM2D", "HjlQ2M1lJG", "ynwBekOt3r", 
                                  "28tbzZPwLN", "MwGYdVwqSM", "Jz4DnutsjK", "38xc9xteGj", "NBAmFujl7g", 
                                  "4Kn0atzZFP", "rZnOB4J8KR", "5hHsvqvKZF", "fykgBmmPF4", "7d4bBkDK4y", 
                                  "LA7La6qEgR", "GueFiaWtnW", "dvcaFXbxAI", "cWore5NgIs", "CY7azmOSim", 
                                  "DDm2KDepEf", "IdAzlUoUGB", "aemSd860xK", "czXcvHIFy4", "2pO3wvNnM7", 
                                  "Slr7CRJ6LJ", "wvXDqFCvFV", "q7W2DC5XbL", "lrCnv2P8rT", "QGP2CBiQTZ", 
                                  "kFDTwFMibh", "T0AyKT8Bkx", "0ytwbceM2D", "HjlQ2M1lJG", "28tbzZPwLN", 
                                  "MwGYdVwqSM", "JwZsfUbzUp", "Jz4DnutsjK", "38xc9xteGj", "NBAmFujl7g", 
                                  "FXHpg4VjPH", "4Kn0atzZFP", "gWCbNVKyWl", "rZnOB4J8KR", "5hHsvqvKZF", 
                                  "LA7La6qEgR", "GueFiaWtnW", "yELABSC7gp", "cWore5NgIs", "CY7azmOSim", 
                                  "DDm2KDepEf", "Nwelt1CWEz", "YN1Pw1fjK5", "IdAzlUoUGB", "Su7wWVm2Gw", 
                                  "uO18Qgm925", "r0Ja8MA03Y", "aemSd860xK", "czXcvHIFy4", "IqzI1yVaz6", 
                                  "2pO3wvNnM7", "BJ2uRTH6f7", "wvXDqFCvFV", "q7W2DC5XbL", "lrCnv2P8rT", 
                                  "QGP2CBiQTZ", "kFDTwFMibh", "6VvUqZeSYe", "racFifdA2g", "T0AyKT8Bkx", 
                                  "0ytwbceM2D", "HjlQ2M1lJG", "JwZsfUbzUp", "Jz4DnutsjK", "38xc9xteGj", 
                                  "NBAmFujl7g", "wi4F0au1HN", "aWJeQfE62d", "FXHpg4VjPH", "txI2GzelQA", 
                                  "4Kn0atzZFP", "gWCbNVKyWl", "rZnOB4J8KR", "LA7La6qEgR", "qnaNRRiDae", 
                                  "GueFiaWtnW", "yELABSC7gp", "cWore5NgIs", "CY7azmOSim", "DDm2KDepEf", 
                                  "Nwelt1CWEz", "YN1Pw1fjK5", "MRLW2zcjko", "IdAzlUoUGB", "Su7wWVm2Gw", 
                                  "qfPqbxTtB9", "uO18Qgm925", "r0Ja8MA03Y", "aemSd860xK", "czXcvHIFy4", 
                                  "IqzI1yVaz6", "fO7QhQEX4o", "2pO3wvNnM7", "BJ2uRTH6f7", "wvXDqFCvFV", 
                                  "q7W2DC5XbL", "ukHKiCws04", "QGP2CBiQTZ", "kFDTwFMibh", "6VvUqZeSYe", 
                                  "racFifdA2g", "9d2Oy7HxPz", "T0AyKT8Bkx", "0ytwbceM2D", "7pNjujyFhe", 
                                  "JwZsfUbzUp", "Jz4DnutsjK", "38xc9xteGj", "NBAmFujl7g", "wi4F0au1HN", 
                                  "aWJeQfE62d", "FXHpg4VjPH", "txI2GzelQA", "4Kn0atzZFP", "gWCbNVKyWl", 
                                  "rZnOB4J8KR", "Jxq6QlbtSK", "WIeUtBGpRi", "avA1T4HgeJ", "LA7La6qEgR", 
                                  "qnaNRRiDae", "80ZZOoDntE", "GueFiaWtnW", "yELABSC7gp", "5x07Qj2vzq", 
                                  "961XIHRqvc", "cWore5NgIs", "v2g2sR7L9B", "ILdncRKorY", "DDm2KDepEf", 
                                  "Nwelt1CWEz", "5nCHudWuUN", "YN1Pw1fjK5", "mWnGqheIlO", "MRLW2zcjko", 
                                  "IdAzlUoUGB", "Su7wWVm2Gw", "qfPqbxTtB9", "uO18Qgm925", "r0Ja8MA03Y", 
                                  "wTeHMGaIIm", "8bhRaQT1NQ", "aemSd860xK", "IqzI1yVaz6", "fO7QhQEX4o", 
                                  "jLgEctfLhN", "2pO3wvNnM7", "BJ2uRTH6f7", "q7W2DC5XbL", "lrCnv2P8rT", 
                                  "ukHKiCws04", "QGP2CBiQTZ", "wCu3xGRejA", "TD2FL6JCTG", "kFDTwFMibh", 
                                  "VamRn8btwT", "racFifdA2g", "9d2Oy7HxPz", "T0AyKT8Bkx", "0ytwbceM2D", 
                                  "7pNjujyFhe", "38xc9xteGj", "NBAmFujl7g", "aWJeQfE62d", "FXHpg4VjPH", 
                                  "4Kn0atzZFP", "gWCbNVKyWl", "rZnOB4J8KR", "Jxq6QlbtSK", "WIeUtBGpRi", 
                                  "avA1T4HgeJ", "LA7La6qEgR", "qnaNRRiDae", "80ZZOoDntE", "GueFiaWtnW", 
                                  "yELABSC7gp", "5x07Qj2vzq", "961XIHRqvc", "v2g2sR7L9B", "ILdncRKorY", 
                                  "DDm2KDepEf", "5nCHudWuUN", "YN1Pw1fjK5", "NG1EGiBoDJ", "mWnGqheIlO", 
                                  "MRLW2zcjko", "IdAzlUoUGB", "Su7wWVm2Gw", "qfPqbxTtB9", "uO18Qgm925", 
                                  "r0Ja8MA03Y", "wTeHMGaIIm", "8bhRaQT1NQ", "aemSd860xK", "IqzI1yVaz6", 
                                  "fO7QhQEX4o", "jLgEctfLhN", "2pO3wvNnM7", "BJ2uRTH6f7", "lrCnv2P8rT", 
                                  "ukHKiCws04", "QGP2CBiQTZ", "wCu3xGRejA", "TD2FL6JCTG", "kFDTwFMibh", 
                                  "VamRn8btwT", "racFifdA2g"),
                       Working = c("Working", "Working", 
                                   "Working", "Working", "Working", "Working", "Working", "Working", 
                                   "Working", "Working", "Working", "Working", "Working", "Working", 
                                   "Working", "Working", "Working", "Working", "Working", "Working", 
                                   "Working", "Working", "Working", "Working", "Working", "Working", 
                                   "Working", "Left", "Working", "Working", "Working", "Working", 
                                   "Working", "Joined", "Working", "Joined", "Left", "Left", "Working", 
                                   "Joined", "Left", "Joined", "Working", "Working", "Working", 
                                   "Left", "Joined", "Working", "Left", "Joined", "Working", "Working", 
                                   "Working", "Working", "Working", "Working", "Working", "Left", 
                                   "Left", "Joined", "Working", "Working", "Working", "Joined", 
                                   "Working", "Joined", "Working", "Left", "Left", "Working", "Joined", 
                                   "Working", "Working", "Working", "Joined", "Joined", "Working", 
                                   "Joined", "Joined", "Joined", "Working", "Working", "Joined", 
                                   "Working", "Joined", "Left", "Working", "Left", "Working", "Working", 
                                   "Joined", "Joined", "Working", "Working", "Left", "Working", 
                                   "Working", "Working", "Working", "Joined", "Joined", "Working", 
                                   "Joined", "Working", "Working", "Working", "Working", "Joined", 
                                   "Working", "Working", "Working", "Left", "Working", "Working", 
                                   "Working", "Joined", "Working", "Working", "Joined", "Working", 
                                   "Working", "Working", "Left", "Working", "Joined", "Working", 
                                   "Working", "Working", "Working", "Joined", "Working", "Working", 
                                   "Left", "Working", "Joined", "Working", "Working", "Joined", 
                                   "Left", "Left", "Working", "Working", "Left", "Working", "Working", 
                                   "Left", "Working", "Working", "Working", "Joined", "Joined", 
                                   "Joined", "Working", "Working", "Joined", "Working", "Working", 
                                   "Joined", "Joined", "Left", "Joined", "Joined", "Working", "Left", 
                                   "Joined", "Working", "Joined", "Working", "Working", "Working", 
                                   "Working", "Working", "Working", "Joined", "Joined", "Working", 
                                   "Working", "Working", "Joined", "Working", "Working", "Left", 
                                   "Working", "Working", "Working", "Joined", "Joined", "Working", 
                                   "Joined", "Working", "Left", "Left", "Working", "Left", "Working", 
                                   "Working", "Working", "Left", "Working", "Working", "Working", 
                                   "Left", "Working", "Working", "Working", "Working", "Working", 
                                   "Left", "Working", "Working", "Working", "Left", "Working", "Working", 
                                   "Working", "Working", "Joined", "Left", "Working", "Left", "Working", 
                                   "Working", "Working", "Working", "Working", "Working", "Working", 
                                   "Working", "Working", "Working", "Working", "Working", "Working", 
                                   "Left", "Working", "Working", "Working", "Working", "Left", "Working"
                       )), .Names = c("Year", "author", "Working"),
                  row.names = c(NA, 
                                -240L), na.action = structure(c(1L, 5L, 9L, 13L, 14L, 15L, 16L, 
                                                                17L, 18L, 20L, 21L, 22L, 25L, 27L, 28L, 29L, 30L, 31L, 32L, 34L, 
                                                                35L, 37L, 39L, 40L, 41L, 42L, 43L, 44L, 46L, 47L, 48L, 49L, 50L, 
                                                                51L, 53L, 54L, 55L, 56L, 58L, 60L, 63L, 65L, 66L, 68L, 69L, 70L, 
                                                                71L, 75L, 79L, 83L, 84L, 85L, 86L, 88L, 90L, 91L, 95L, 97L, 98L, 
                                                                100L, 101L, 102L, 105L, 107L, 109L, 110L, 111L, 112L, 113L, 114L, 
                                                                116L, 117L, 118L, 119L, 120L, 121L, 124L, 125L, 126L, 128L, 133L, 
                                                                135L, 136L, 138L, 139L, 140L, 141L, 145L, 146L, 153L, 154L, 156L, 
                                                                160L, 161L, 163L, 164L, 165L, 167L, 168L, 171L, 172L, 173L, 175L, 
                                                                177L, 180L, 182L, 183L, 184L, 187L, 190L, 191L, 195L, 196L, 199L, 
                                                                203L, 205L, 206L, 209L, 211L, 215L, 216L, 217L, 218L, 230L, 231L, 
                                                                232L, 233L, 234L, 235L, 238L, 241L, 242L, 243L, 245L, 247L, 250L, 
                                                                252L, 253L, 260L, 261L, 266L, 269L, 272L, 275L, 276L, 279L, 284L, 
                                                                286L, 287L, 288L, 302L, 303L, 304L, 313L, 316L, 322L, 333L, 339L, 
                                                                340L, 348L, 354L, 356L, 357L, 358L, 359L, 360L, 363L, 366L, 372L, 
                                                                373L, 374L, 383L, 384L, 386L, 389L, 403L, 409L, 410L, 411L, 418L
                                ), 
                                .Names = c("1", "5", "9", "13", "14", "15", "16", "17", "18", 
                                           "20", "21", "22", "25", "27", "28", "29", "30", "31", "32", "34", 
                                           "35", "37", "39", "40", "41", "42", "43", "44", "46", "47", "48", 
                                           "49", "50", "51", "53", "54", "55", "56", "58", "60", "63", "65", 
                                           "66", "68", "69", "70", "71", "75", "79", "83", "84", "85", "86", 
                                           "88", "90", "91", "95", "97", "98", "100", "101", "102", "105", 
                                           "107", "109", "110", "111", "112", "113", "114", "116", "117", 
                                           "118", "119", "120", "121", "124", "125", "126", "128", "133", 
                                           "135", "136", "138", "139", "140", "141", "145", "146", "153", 
                                           "154", "156", "160", "161", "163", "164", "165", "167", "168", 
                                           "171", "172", "173", "175", "177", "180", "182", "183", "184", 
                                           "187", "190", "191", "195", "196", "199", "203", "205", "206", 
                                           "209", "211", "215", "216", "217", "218", "230", "231", "232", 
                                           "233", "234", "235", "238", "241", "242", "243", "245", "247", 
                                           "250", "252", "253", "260", "261", "266", "269", "272", "275", 
                                           "276", "279", "284", "286", "287", "288", "302", "303", "304", 
                                           "313", "316", "322", "333", "339", "340", "348", "354", "356", 
                                           "357", "358", "359", "360", "363", "366", "372", "373", "374", 
                                           "383", "384", "386", "389", "403", "409", "410", "411", "418"
                                ), class = "omit"), class = c("tbl_df", "tbl", "data.frame"))
temp %>% 
  ggplot(aes(x = Year, stratum = Working, alluvium = author,
             fill = Working, label = Working)) +
  geom_flow(stat = "alluvium", lode.guidance = "rightleft",
            color = "darkgray") +
  geom_stratum() +
  scale_x_continuous("") +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        legend.text = element_text(margin = margin(l =1, r = 10), hjust = 0))
#> Warning in is_alluvial_lodes(data, key = "x", value = "stratum", id =
#> "alluvium", : Missing id-axis pairings.

#> Warning in is_alluvial_lodes(data, key = "x", value = "stratum", id =
#> "alluvium", : Missing id-axis pairings.

corybrunson commented 6 years ago

Thanks for raising the issue! I've reproduced it and am looking into it. The same problem was raised before in issue #8, and i'm not yet sure whether i didn't completely solve it then or broke the solution with some more recent change.

corybrunson commented 6 years ago

The previous solution addressed the default stat–geom pairings (*_alluvium() and *_flow()) but failed to anticipate the pairing of stat_alluvium() with geom_flow(). As a quick fix, i added a step to the geom_flow() internals to sort the data by axis and then by any color aesthetics—in a way that hopefully avoids undermining any factor orders of the input data. @giocomai please try installing from the z-order branch to see if it works for you!

giocomai commented 6 years ago

Excellent, fixed, works for me! Beautiful. Thanks a lot for the great package and for the quick response!

corybrunson commented 6 years ago

Great! And thanks for your support. : ) I'll run checks and update the release shortly.