boxplot() i R: Hvordan lage BoxTomter i RStudio
⚡ Smart oppsummering
BoxPlottet i R oppsummerer en numerisk fordeling gjennom median, kvartiler, værhår og uteliggere ved hjelp av geom_boxplot() fra ggplot2. Denne gjennomgangen bygger et boksplott på luftkvalitetsdatasettet og legger lag på farge, prikker, jitter, hakk og gruppesammenligninger.
boxplot() i R
boxplot() i R hjelper til med å visualisere fordelingen av dataene etter kvartil og oppdage tilstedeværelsen av uteliggere. Du kan bruke det geometriske objektet geom_boxplot() fra ggplot2-biblioteket til å tegne et boxplot() i R.
Vi vil bruke luftkvalitetsdatasettet til å introdusere boxplot() i R med ggplot. Datasettet registrerer daglige luftkvalitetsmålinger i New York fra mai til september 1973 og inneholder 153 observasjoner. Vi vil bruke følgende variabler:
- Ozon: Numerisk variabel
- Vind: Numerisk variabel
- Måned: mai til september. Numerisk variabel
Før du tegner en, er det verdt å vite nøyaktig hva hver del av boksen representerer.
Hvordan lese en Box Plott: Kvartiler, IQR og uteliggere
Hvert element i et boksplott koder for ett tall fra femtallssammendraget. Å vite hvilket som er hvilket, forvandler diagrammet fra dekorasjon til analyse.
- Nedre hengsel: den første kvartilen, Q1. Tjuefem prosent av observasjonene ligger under den.
- Median linje: den andre kvartilen. Plasseringen inne i boksen avslører skjevhet: en linje som er skjøvet mot bunnen betyr at dataene er høyreskjev.
- Øvre hengsel: den tredje kvartilen, Q3. Syttifem prosent av observasjonene ligger under den.
- Box høyde: interkvartilområdet, IQR = Q3 – Q1, som inneholder den midterste halvdelen av dataene og er det standard robuste målet på spredning.
- værhår: De strekker seg til den mest ekstreme observasjonen, fortsatt innenfor 1.5 ganger IQR-en til nærmeste hengsel. De er ikke minimum og maksimum.
- Poeng bak værhårene: observasjoner markert som avvikere av den 1.5 IQR-regelen.
To advarsler. For det første er en «avviker» her et statistisk flagg, ikke en feil: i en skjev fordeling, som for eksempel ozonkonsentrasjon, forventes høye verdier og bør ikke slettes. For det andre skjuler et boksplott formen på fordelingen, slik at to grupper med identiske bokser kan ha svært forskjellige underliggende data. Å legge til skjevpunkter, som vist nedenfor, beskytter mot dette.
Box Plott vs. histogram vs. fiolinplott i R
Alle tre diagrammene beskriver en numerisk fordeling, men hver avslører noe de andre skjuler.
| Kriterier | Box Plott | histogram | Fiolinplot |
|---|---|---|---|
| Viser | Median, kvartiler, uteliggere | Frekvens i hver beholder | Full tetthetskurve |
| Revoppnår flere topper | Nei | Ja | Ja |
| Flagger avvikere | Ja, eksplisitt | Bare visuelt | Ikke direkte |
| Sammenligning av mange grupper | Utmerket | Pinlig | Flink |
| Trenger et valg av tuning | Nei | Ja, antall søppelbøtter | Ja, båndbredde |
| ggplot2-objekt | geom_boksplott() | geom_histogram() | geom_fiolin() |
Et vanlig kompromiss er å tegne et fiolinplott med et smalt boksplott inni, som beholder tetthetsformen og kvartilsammendraget i et enkelt diagram. Se histogram-veiledning for binning-siden av sammenligningen.
Opprett Box Plott
Før du begynner å lage ditt første boxplot() i R, må du manipulere dataene som følger:
- Trinn 1: Importer dataene
- Trinn 2: Slipp unødvendige variabler
- Trinn 3: Konverter Måned til en ordnet faktor
- Trinn 4: Opprett en ny kategorisk variabel som deler hver måned inn i tre deler: Start, Midt og Slutt
- Trinn 5: Fjern manglende observasjoner
Alle disse trinnene gjøres med dplyr og rørledningsoperatøren %>%.
library(dplyr) library(ggplot2) # Step 1 data_air <- airquality %>% #Step 2 select(-c(Solar.R, Temp)) %>% #Step 3 mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), #Step 4 day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))
En god praksis er å sjekke strukturen til dataene med funksjonen glimpse().
glimpse(data_air)
Utgang:
## Observations: 153 ## Variables: 5 ## $ Ozone <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ... ## $ Wind <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6... ## $ Month <ord> May, May, May, May, May, May, May, May, May, May, May,... ## $ Day <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,... ## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...
Både Ozone og Solar.R inneholder NA-verdier. Fordi geom_boxplot() ville slette dem i stillhet og skrive ut en advarsel, er det renere å fjerne dem eksplisitt.
# Step 5
data_air_nona <-data_air %>% na.omit()
Grunnleggende boksplott
Plott nå fordelingen av ozon per måned.
# Store the graph box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone)) # Add the geometric object box plot box_plot + geom_boxplot()
Code Forklaring
- Lagre grafen for videre bruk
- box_plot: basisplottet lagres i objektet box_plot, som lar deg legge til lag senere uten å gjenta hele kallet
- Legg til det geometriske objektet
- Du sender datasettet data_air_nona til ggplot boxplot.
- Inne i aes()-argumentet legger du til x-aksen og y-aksen.
- +-tegnet betyr at du vil at R skal fortsette å lese koden. Det gjør koden mer lesbar ved å bryte den.
- Bruk geom_boxplot() for å lage et boksplott
Utgang:
Bytt side av grafen
Du kan snu siden av grafen.
box_plot +
geom_boxplot()+
coord_flip()
Code Forklaring
- box_plot: Du bruker grafen du lagret. Den unngår å skrive om alle kodene hver gang du legger til ny informasjon i grafen.
- geom_boxplot(): tegn boksene og værhårene
- coord_flip(): Vend siden av grafen
Utgang:
Endre farge på ytterside
Du kan endre farge, form og størrelse på uteliggere.
box_plot +
geom_boxplot(outlier.colour = "red",
outlier.shape = 2,
outlier.size = 3) +
theme_classic()
Code Forklaring
- outlier.colour=”rød”: Kontroller fargen på uteliggere
- outlier.shape=2: Endre formen på uteliggeren. 2 refererer til trekant
- outlier.size=3: Endre størrelsen på trekanten. Større tall tegner større markører.
Utgang:
Legg til en sammendragsstatistikk
Du kan legge over en sammendragsstatistikk, for eksempel gruppegjennomsnittet, som selve boksplottet ikke viser.
box_plot +
geom_boxplot() +
stat_summary(fun.y = mean,
geom = "point",
size = 3,
color = "steelblue") +
theme_classic()
Code Forklaring
- stat_summary() legger til en beregnet statistikk oppå boksplottet
- Argumentet fun styrer hvilken statistikk som returneres. Her er det gjennomsnittet. Merk at eldre kode bruker fun.y, som ggplot2 ble avskrevet i versjon 3.3.0.
- Merk: Annen statistikk er tilgjengelig som min og maks. Mer enn én statistikk kan vises i samme graf
- geom = "punkt": Plott gjennomsnittet med et punkt
- størrelse=3: Størrelsen på punktet
- farge =”stålblå”: Farge på punktene
Utgang:
Box Plott med prikker
Deretter legger du til et punktplottlag oppå boksene. Hver prikk representerer én observasjon, noe som gjør utvalgsstørrelsen bak hver boks synlig.
box_plot +
geom_boxplot() +
geom_dotplot(binaxis = 'y',
dotsize = 1,
stackdir = 'center') +
theme_classic()
Code Forklaring
- geom_dotplot() tegner én prikk per observasjon, stablet innenfor hver beholder
- binaxis='y': Endre posisjonen til prikkene langs y-aksen. Som standard, x-aksen
- dotsize=1: Størrelsen på prikkene
- stackdir='center': Måte å stable prikkene på: Fire verdier:
- "opp" (standard),
- "ned"
- "senter"
- "hele midten"
Utgang:
Kontroll Estetikk av Box Plott
Endre fargen på boksen
Du kan endre fargene på gruppen.
ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) + geom_boxplot() + theme_classic()
Code Forklaring
- Fargene på gruppene kontrolleres i aes()-kartetpingDu kan bruke color=Month for å endre fargen på boks-og-hår-plottet i henhold til månedene.
Utgang:
Box plott med flere grupper
Det er også mulig å legge til flere grupper. Du kan visualisere forskjellen i luftkvaliteten i henhold til måledagen.
ggplot(data_air_nona, aes(Month, Ozone)) + geom_boxplot(aes(fill = day_cat)) + theme_classic()
Code Forklaring
- aes()-kartetping av det geometriske objektet styrer gruppene som skal vises (denne variabelen må være en faktor)
- aes(fill= day_cat) lar deg lage tre bokser for hver måned i x-aksen
Utgang:
Box Plott med rystede prikker
En annen måte å vise individuelle observasjoner på er med dirrende punkter. Dirring er det vanlige valget når en kategorisk x-akse fører til at mange punkter lander på samme posisjon.
Denne metoden unngår overlappingping av de diskrete dataene.
box_plot +
geom_boxplot() +
geom_jitter(shape = 15,
color = "steelblue",
position = position_jitter(width = 0.21)) +
theme_classic()
Code Forklaring
- geom_jitter() legger til en liten tilfeldig forskyvning til hvert punkt slik at overlappingen skjerping verdier blir synlige.
- shape=15 endrer formen på punktene. 15 representerer rutene
- farge = "stålblå": Endre fargen på punktet
- posisjon = posisjonsjitter(bredde = 0.21): kontrollerer hvor langt punktene forskyves sidelengs, målt i x-akseenheter. Standardverdien er 40 prosent av avstanden mellom kategoriene.
Utgang:
Du kan se forskjellen mellom den første grafen med jittermetoden og den andre med punktmetoden.
box_plot +
geom_boxplot() +
geom_point(shape = 5,
color = "steelblue") +
theme_classic()
hakk Box Plott
Et interessant trekk ved geom_boxplot(), er en notched boxplot-funksjon i R. Notchplotten begrenser boksen rundt medianen. Hovedformålet med et hakkede boksplott er å sammenligne betydningen av medianen mellom grupper. Det er sterke bevis for at to grupper har forskjellige medianer når hakkene ikke overlapper hverandre. Et hakk beregnes som følger:
Her er IQR interkvartilområdet og n er antall observasjoner i gruppen. Hakket spenner omtrent over 95 prosent konfidensintervall for medianen.
box_plot +
geom_boxplot(notch = TRUE) +
theme_classic()
Code Forklaring
- geom_boxplot(notch = TRUE): tegn boksplottet med hakk rundt medianen
Utgang:
Slik legger du til titler, etiketter og egendefinerte farger i en Box Plott i R
Plottene ovenfor bruker ggplot2-standarder, som tar variabelnavn direkte fra datarammen. Et publiserbart diagram trenger lesbare etiketter og en bevisst palett.
Titler og akseetiketter. Ett labs()-kall setter hvert tekstelement:
box_plot +
geom_boxplot(fill = "coral", alpha = 0.7) +
labs(title = "Ozone concentration by month",
subtitle = "New York, May to September 1973",
x = "Month",
y = "Ozone (parts per billion)",
caption = "Source: airquality dataset") +
theme_classic()
Å velge dine egne farger. Bruk scale_fill_manual() når fyll er kartlagt i aes(), og scale_colour_manual() når fargen er:
ggplot(data_air_nona, aes(x = Month, y = Ozone, fill = Month)) + geom_boxplot() + scale_fill_manual(values = c("#0e9cd1", "coral", "#7dc27d", "#c9a227", "grey60")) + theme_classic() + theme(legend.position = "none")
Forklaringen er slått av her fordi x-aksen allerede navngir hver måned, så å gjenta den ville sløse med plass.
Omorganisering av boksene. Faktornivåene styrer rekkefølgen på aksen. Fordi Måned ble opprettet som en ordnet faktor, leses den allerede kronologisk. For en uordnet faktor, sorter etter medianen i stedet:
ggplot(data_air_nona, aes(x = reorder(Month, Ozone, FUN = median), y = Ozone)) + geom_boxplot() + theme_classic()
Lagrer diagrammet. ggsave() skriver det siste plottet til disken med en oppløsning du kontrollerer:
ggsave("ozone_boxplot.png", width = 8, height = 5, dpi = 300)
Box Plott i R: Code Referanse
Tabellen nedenfor viser ggplot2-kallet for hver boksplotvariant som er dekket ovenfor:
| Målet | Code |
|---|---|
| Grunnleggende boksplott |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() |
| Snu retningen |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + coord_flip() |
| Hakket boksplott |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(notch = TRUE) |
| Box plott med rystede prikker |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21)) |
| Fargelegging etter gruppe |
ggplot(df, aes(x = x1, y = y, color = x1)) + geom_boxplot() |
| Flere grupper per kategori |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(aes(fill = x2)) |
| Legg til gruppens gjennomsnitt |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + stat_summary(fun = mean, geom = "point") |
Sjekk også: - R-opplæring for nybegynnere: Lær R-programmeringsspråk












