I have been trying to create a pie chart with three hierarchical levels, following the codes provided in:
Unfortunately, I was unable to successfully replicate it. Here is an overview of my dataset:
My dataset looks like:
str(df2)
tibble [2,709 × 4] (S3: tbl_df/tbl/data.frame)
$ Taxon : chr [1:2709] "Acleris undulana" "Anchusa aegyptiaca" "Aonidiella taxus" "Aphanarthrum mairei" ...
$ Phylum: chr [1:2709] "Arthropoda" "Tracheophyta" "Arthropoda" "Arthropoda" ...
$ Class : chr [1:2709] "Insecta" "Magnoliopsida" "Insecta" "Insecta" ...
$ Family: chr [1:2709] "Tortricidae" "Boraginaceae" "Diaspididae" "Curculionidae" ...
Therefore, the levels of my chart should be Phylum > Class > Family
While the full dataset is accessible at https://drive.google.com/drive/folders/19NVphifzr-y9Q_8gDy41sMIAFHaCDXJ4?usp=drive_link, I have tried multiple R codes, but since none of them worked, I don't think including them would be helpful at this point.
Sample dataset:
> dput(df[sample(nrow(df), 100),])
structure(list(Taxon = c("Chasmanthe aethiopica", "Josephiella microcarpae",
"Rodolia cardinalis", "Tanacetum balsamita", "Acartia tonsa",
"Paspalum dilatatum", "Fimbristylis bisumbellata", "Coronilla valentina glauca",
"Passiflora caerulea", "Stenotaphrum secundatum", "Erythrura prasina",
"Triops longicaudatus", "Lilium candidum", "Amaranthus powellii",
"Rapistrum rugosum", "Medicago radiata", "Casuarina cunninghamiana",
"Lathyrus oleraceus", "Chamaeleo chamaeleon", "Mustela putorius",
"Glycyrrhiza glabra", "Punica granatum", "Cenchrus longisetus",
"Myoporum tenuifolium", "Kalanchoe prolifera", "Cuscuta epilinum",
"Valerianella dentata", "Trachycarpus fortunei", "Zaprionus indianus",
"Cenchrus americanus", "Lepidium spinosum", "Sander lucioperca",
"Anethum graveolens", "Mercurialis annua", "Podarcis siculus",
"Digitaria violascens", "Tockus deckeni", "Crepis bellidifolia",
"Aratinga pertinax", "Medicago lupulina", "Ligustrum japonicum",
"Erythrostemon gilliesii", "Rhinella marina", "Tradescantia cerinthoides",
"Hasarius adansoni", "Opuntia robusta Pfeiff.", "Prosopis juliflora",
"Passer montanus", "Cyperus alternifolius flabelliformis", "Predaea huismanii",
"Hydrocotyle bonariensis", "Lagurus ovatus", "Arrhenatherum elatius",
"Agapornis personatus", "Quadrastichodella nova", "Mentha villosa",
"Eliomys quercinus", "Ploceus intermedius", "Arabidopsis thaliana",
"Ipomoea sagittata", "Bromus catharticus", "Wisteria sinensis",
"Gymnophycus hapsiphorus", "Carcinops pumilio", "Ulmus minor",
"Ploceus nigerrimus", "Crithagra mozambica", "Morus alba", "Lonicera etrusca",
"Cisurgus wollastoni", "Rhynchosia caribaea", "Oxalis stricta",
"Symphyotrichum lanceolatum", "Nandayus nenday", "Melampyrum arvense",
"Phoenix canariensis hort. ex Chabaud", "Amphilophium buccinatorium",
"Bidens pilosa", "Columba livia", "Antithamnionella spirographidis",
"Angelica archangelica", "Asparagopsis armata", "Ploceus vitellinus",
"Datura metel", "Clematis vitalba", "Amphibalanus improvisus",
"Aburria cumanensis", "Euphorbia milii", "Passer domesticus",
"Oxalis debilis", "Sansevieria trifasciata", "Cosmopolites sordidus",
"Hordeum distichon", "Artemisia verlotiorum", "Symphytum asperum",
"Platycorypha nigrivirga", "Orobanche minor", "Hemidactylus turcicus",
"Campsis radicans", "Ulex europaeus"), Phylum = c("Tracheophyta",
"Arthropoda", "Arthropoda", "Tracheophyta", "Arthropoda", "Tracheophyta",
"Tracheophyta", "Tracheophyta", "Tracheophyta", "Tracheophyta",
"Chordata", "Arthropoda", "Tracheophyta", "Tracheophyta", "Tracheophyta",
"Tracheophyta", "Tracheophyta", "Tracheophyta", "Chordata", "Chordata",
"Tracheophyta", "Tracheophyta", "Tracheophyta", "Tracheophyta",
"Tracheophyta", "Tracheophyta", "Tracheophyta", "Tracheophyta",
"Arthropoda", "Tracheophyta", "Tracheophyta", "Chordata", "Tracheophyta",
"Tracheophyta", "Chordata", "Tracheophyta", "Chordata", "Tracheophyta",
"Chordata", "Tracheophyta", "Tracheophyta", "Tracheophyta", "Chordata",
"Tracheophyta", "Arthropoda", "Tracheophyta", "Tracheophyta",
"Chordata", "Tracheophyta", "Rhodophyta", "Tracheophyta", "Tracheophyta",
"Tracheophyta", "Chordata", "Arthropoda", "Tracheophyta", "Chordata",
"Chordata", "Tracheophyta", "Tracheophyta", "Tracheophyta", "Tracheophyta",
"Tracheophyta", "Arthropoda", "Tracheophyta", "Chordata", "Chordata",
"Tracheophyta", "Tracheophyta", "Arthropoda", "Tracheophyta",
"Tracheophyta", "Tracheophyta", "Chordata", "Tracheophyta", "Tracheophyta",
"Tracheophyta", "Tracheophyta", "Chordata", "Rhodophyta", "Tracheophyta",
"Rhodophyta", "Chordata", "Tracheophyta", "Tracheophyta", "Arthropoda",
"Chordata", "Tracheophyta", "Chordata", "Tracheophyta", "Tracheophyta",
"Arthropoda", "Tracheophyta", "Tracheophyta", "Tracheophyta",
"Arthropoda", "Tracheophyta", "Chordata", "Tracheophyta", "Tracheophyta"
), Class = c("Liliopsida", "Insecta", "Insecta", "Magnoliopsida",
"Hexanauplia", "Liliopsida", "Liliopsida", "Magnoliopsida", "Magnoliopsida",
"Liliopsida", "Aves", "Branchiopoda", "Liliopsida", "Magnoliopsida",
"Magnoliopsida", "Magnoliopsida", "Magnoliopsida", "Magnoliopsida",
"Reptilia", "Mammalia", "Magnoliopsida", "Magnoliopsida", "Liliopsida",
"Magnoliopsida", "Magnoliopsida", "Magnoliopsida", "Magnoliopsida",
"Liliopsida", "Insecta", "Liliopsida", "Magnoliopsida", "Actinopterygii",
"Magnoliopsida", "Magnoliopsida", "Reptilia", "Liliopsida", "Aves",
"Magnoliopsida", "Aves", "Magnoliopsida", "Magnoliopsida", "Magnoliopsida",
"Amphibia", "Liliopsida", "Arachnida", "Magnoliopsida", "Magnoliopsida",
"Aves", "Liliopsida", "Florideophyceae", "Magnoliopsida", "Liliopsida",
"Liliopsida", "Aves", "Insecta", "Magnoliopsida", "Mammalia",
"Aves", "Magnoliopsida", "Magnoliopsida", "Liliopsida", "Magnoliopsida",
"Florideophyceae", "Insecta", "Magnoliopsida", "Aves", "Aves",
"Magnoliopsida", "Magnoliopsida", "Insecta", "Magnoliopsida",
"Magnoliopsida", "Magnoliopsida", "Aves", "Magnoliopsida", "Liliopsida",
"Magnoliopsida", "Magnoliopsida", "Aves", "Florideophyceae",
"Magnoliopsida", "Florideophyceae", "Aves", "Magnoliopsida",
"Magnoliopsida", "Maxillopoda", "Aves", "Magnoliopsida", "Aves",
"Magnoliopsida", "Liliopsida", "Insecta", "Liliopsida", "Magnoliopsida",
"Magnoliopsida", "Insecta", "Magnoliopsida", "Reptilia", "Magnoliopsida",
"Magnoliopsida"), Family = c("Iridaceae", "Agaonidae", "Coccinellidae",
"Asteraceae", "Acartiidae", "Poaceae", "Cyperaceae", "Fabaceae",
"Passifloraceae", "Poaceae", "Estrildidae", "Triopsidae", "Liliaceae",
"Amaranthaceae", "Brassicaceae", "Fabaceae", "Casuarinaceae",
"Fabaceae", "Chamaeleonidae", "Mustelidae", "Fabaceae", "Lythraceae",
"Poaceae", "Scrophulariaceae", "Crassulaceae", "Convolvulaceae",
"Caprifoliaceae", "Arecaceae", "Drosophilidae", "Poaceae", "Brassicaceae",
"Percidae", "Apiaceae", "Euphorbiaceae", "Lacertidae", "Poaceae",
"Bucerotidae", "Asteraceae", "Psittacidae", "Fabaceae", "Oleaceae",
"Fabaceae", "Bufonidae", "Commelinaceae", "Salticidae", "Cactaceae",
"Fabaceae", "Passeridae", "Cyperaceae", "Nemastomataceae", "Apiaceae",
"Poaceae", "Poaceae", "Psittacidae", "Eulophidae", "Lamiaceae",
"Gliridae", "Ploceidae", "Brassicaceae", "Convolvulaceae", "Poaceae",
"Fabaceae", "Ceramiaceae", "Histeridae", "Ulmaceae", "Ploceidae",
"Fringillidae", "Moraceae", "Caprifoliaceae", "Curculionidae",
"Fabaceae", "Oxalidaceae", "Asteraceae", "Psittacidae", "Orobanchaceae",
"Arecaceae", "Bignoniaceae", "Asteraceae", "Columbidae", "Ceramiaceae",
"Apiaceae", "Bonnemaisoniaceae", "Ploceidae", "Solanaceae", "Ranunculaceae",
"Balanidae", "Cracidae", "Euphorbiaceae", "Passeridae", "Oxalidaceae",
"Asparagaceae", "Dryophthoridae", "Poaceae", "Asteraceae", "Boraginaceae",
"Psyllidae", "Orobanchaceae", "Gekkonidae", "Bignoniaceae", "Fabaceae"
)), row.names = c(824L, 173L, 70L, 1426L, 299L, 777L, 803L, 1955L,
912L, 728L, 1834L, 339L, 830L, 2111L, 2063L, 1163L, 2340L, 1954L,
459L, 1805L, 1167L, 2194L, 1899L, 2383L, 2440L, 1035L, 952L,
822L, 216L, 2243L, 2073L, 377L, 1261L, 1305L, 2610L, 1888L, 486L,
2410L, 494L, 1157L, 1533L, 2502L, 1797L, 844L, 313L, 2510L, 1992L,
1830L, 809L, 35L, 1260L, 1895L, 756L, 520L, 200L, 2477L, 437L,
2274L, 1299L, 1055L, 744L, 2506L, 19L, 77L, 2013L, 625L, 2279L,
2017L, 1938L, 8L, 1961L, 2657L, 2611L, 549L, 2378L, 2406L, 2462L,
2153L, 649L, 696L, 2044L, 1858L, 621L, 1059L, 1252L, 2324L, 560L,
1323L, 1828L, 977L, 2701L, 95L, 2534L, 1434L, 1008L, 266L, 1542L,
1814L, 1537L, 1129L), class = "data.frame")
There are far too many groups to label all of them. I would probably shape your dataset into rectangles first:
library(tidyverse)
df <- mutate(df, Phylum = factor(Phylum, unique(Phylum)[c(1, 3, 2, 5, 4)]))
phyla_df <- count(df, Phylum) %>%
mutate(xmin = cumsum(lag(n, 1, 0)),
xmax = cumsum(n),
mid_x = (xmin + xmax) / 2,
ymin = 0, ymax = 10) %>%
mutate(label = Phylum)
class_df <- count(df, Phylum, Class) %>%
mutate(xmin = cumsum(lag(n, 1, 0)),
xmax = cumsum(n),
mid_x = (xmin + xmax) / 2,
ymin = 10, ymax = 20) %>%
rename(label = Class)
family_df <- count(df, Phylum, Class, Family) %>%
mutate(xmin = cumsum(lag(n, 1, 0)),
xmax = cumsum(n),
mid_x = (xmin + xmax) / 2,
ymin = 20, ymax = 30) %>%
select(-Class) %>%
rename(label = Family)
plot_df <- bind_rows(phyla_df, class_df, family_df) %>%
mutate(alpha = ifelse(label == Phylum, 0.8, 0.1 + (row_number() %% 2)/2))
Then plot with the phyla and pertinent large groups labeled:
library(geomtextpath)
plot_df %>%
ggplot(aes(fill = Phylum)) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin,
ymax = ymax, alpha = alpha),
show.legend = FALSE) +
geom_hline(yintercept = c(10, 20), color = "white") +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin,
ymax = 30, alpha = 0),
show.legend = FALSE, data = phyla_df, color = "black") +
geom_textpath(data = phyla_df,
aes(y = c(5, 15, 5, 5, 15), x = mid_x, label = label),
color = "black", angle = c(0, 90, 0, 0, 90)) +
geom_textpath(aes(label = ifelse(n > 100 & label != Phylum, label, " "),
y = (ymax + ymin)/2, x = mid_x, group = label)) +
scale_y_continuous(limits = c(-50, 30), expand = c(0, 0)) +
scale_alpha_identity() +
coord_polar() +
theme_void()