{"id":735,"date":"2023-03-25T12:01:42","date_gmt":"2023-03-25T11:01:42","guid":{"rendered":"https:\/\/www.datenleben.de\/?p=735"},"modified":"2023-03-27T10:51:57","modified_gmt":"2023-03-27T08:51:57","slug":"wie-erstelle-ich-histogramme-boxplots-und-violinenplots-in-r","status":"publish","type":"post","link":"https:\/\/www.datenleben.de\/index.php\/2023\/03\/25\/wie-erstelle-ich-histogramme-boxplots-und-violinenplots-in-r\/","title":{"rendered":"Wie erstelle ich Histogramme, Boxplots und Violinenplots in R?"},"content":{"rendered":"<p>Dieser Blogpost begleitet unsere Folge <a href=\"https:\/\/www.datenleben.de\/index.php\/2023\/03\/25\/dl036-graphentypen-2\/\" title=\"dl036: graphentypen 2 \u2013 histogramme, boxplots, etc\">dl036: graphentypen 2 \u2013 histogramme, boxplots, etc<\/a>. In unserer Reihe zu Graphentypen geht es um verschiedene Daten und welche Arten der Darstellung es f\u00fcr diese gibt. Im ersten Teil (<a href=\"https:\/\/www.datenleben.de\/index.php\/2022\/09\/03\/dl029-graphentypen-skalen-und-zeiger\/\" title=\"dl029: graphentypen \u2013 skalen und zeiger\">dl029: graphentypen \u2013 skalen und zeiger<\/a>) ging es um die kleinste Einheit: um eindimensionalen Daten. Im zweiten Teil wird es ein bisschen komplexer. Wir reden \u00fcber Graphentypen, mit denen sich eindimensionale Verteilungen abbilden lassen. Es geht um Histogramme, Boxplots, Violinenplots und kumulierte H\u00e4ufigkeiten. Hierf\u00fcr hat Helena Plotbeispiele erstellt, die wir in der Folge besprechen. Hier haben wir einmal alle Plots mit dem dazugeh\u00f6ren Code f\u00fcr R zusammengef\u00fchrt.<\/p>\n<p>F\u00fcr die Plotbeispiele wird ggplot2 genutzt, um in R Histogramme, Boxplots, Violinenplots und kumulierte H\u00e4ufigkeiten zu plotten. ggplot2 kann mit dem gro\u00dfen Paket tidyverse oder einzeln installiert werden. ggthemes wird ebenfalls benutzt und dient dazu, die Farbauswahl  der Plots so anzupassen, sodass sie auch f\u00fcr verschieden Formen von Farbenblindheit noch gut erkennbar sind.<br \/>\nAls Beispieldatensatz wird der frei verf\u00fcgbare Datensatz palmerpenguins verwendet, der auch auf GitHub heruntergeladen werden kann.<\/p>\n<h4>Quellen:<\/h4>\n<ul>\n<li><a href=\"https:\/\/ggplot2.tidyverse.org\/\" title=\"https:\/\/ggplot2.tidyverse.org\/\">https:\/\/ggplot2.tidyverse.org\/<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jrnold\/ggthemes\" title=\"GitHub, jrnold: ggthemes\">GitHub, jrnold: ggthemes<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/allisonhorst\/palmerpenguins\">GitHub, Horst AM, Hill AP, Gorman KB (2020). palmerpenguins: Palmer Archipelago (Antarctica) penguin data. R package version 0.1.0.<\/a><\/li>\n<\/ul>\n<p>Mit install.packages lassen sich die Pakete in R installieren:<\/p>\n<pre><code>install.packages(&quot;palmerpenguins&quot;)\ninstall.packages(&quot;ggplot2&quot;)\ninstall.packages(&quot;ggthemes&quot;)<\/code><\/pre>\n<p>Um die Pakete f\u00fcr die Anwendung zu nutzen, werden sie dann mit <code>library()<\/code> geladen:<\/p>\n<pre><code>library(palmerpenguins)\nlibrary(ggplot2)\nlibrary(ggthemes)<\/code><\/pre>\n<h1>Histogramme<\/h1>\n<p>Um ein Histogramm zu plotten, wird zuerst mit <code>ggplot(penguins)<\/code> der Datensatz ausgew\u00e4hlt, der geplottet werden soll. Dann wird mit <code>geom_histogram()<\/code> festgelegt, dass es ein Histogram werden soll. Mit <code>aes()<\/code> Funktion (aes steht f\u00fcr aesthetics) lassen sich die Achsen und andere Aspekte des Plots festlegen, die auf den Daten basieren.<\/p>\n<pre><code>ggplot(penguins) + geom_histogram(aes(flipper_length_mm))<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/hist1-1-300x214.png\" alt=\"\" \/><\/p>\n<p>Die Anzahl der Balken (bins) l\u00e4sst sich auch manuell einstellen in der <code>geom_histogram()<\/code>-Funktion.<\/p>\n<p>Bei 5 Bins sieht der Plot schon recht anders aus.<\/p>\n<pre><code>ggplot(penguins) + geom_histogram(aes(flipper_length_mm), bins = 5)<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/hist2-1-300x214.png\" alt=\"\" \/><\/p>\n<p>Es gibt die M\u00f6glichkeit, mehrere Histogramme f\u00fcr verschieden Kategorien untereinander zu plotten. Dazu gibt es in ggplot sogenannte Facets. Mit <code>facet_grid(species~.)<\/code> lassen sich die Histogramme untereinander plotten:<\/p>\n<pre><code>ggplot(penguins) + \n  geom_histogram(aes(flipper_length_mm)) +\n  facet_grid(species~.)<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/hist3-1-300x214.png\" alt=\"\" \/><\/p>\n<p>Alternativ l\u00e4sst sich die Spezies auch \u00fcber Farben darstellen. color w\u00e4re dabei aber die Umrandung der Balken, um die Balkenfarbe festzulegen, muss fill (f\u00fcr F\u00fcllung) verwendet werden. Mit <code>position=\u2018stack&#039;<\/code> wird festgelegt, dass die Balken aufeinander gelegt werden sollen.<\/p>\n<pre><code>ggplot(penguins) + geom_histogram(aes(flipper_length_mm,fill=species), position=&#039;stack&#039;)<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/hist4-1-300x214.png\" alt=\"\" \/><\/p>\n<h1>Boxplots<\/h1>\n<p>Boxplots lassen sich in ggplot mittels <code>geom_boxplot()<\/code> erstellen. Bei der Achsenauswahl l\u00e4sst sich \u00fcber <code>y<\/code>  festlegen, dass der Boxplot vertikal sein soll. W\u00fcrde <code>x<\/code> genommen werden, w\u00e4re der Boxplot horizontal.<\/p>\n<p>Mit <code>theme(axis.text.x = element_blank())<\/code> werden die Werte auf der x-Achse ausgeschaltet, da diese bei einem einzelnen Boxplot keine Bedeutung haben und eher verwirren als n\u00fctzen.<\/p>\n<pre><code>ggplot(penguins) + geom_boxplot(aes(y=flipper_length_mm)) + theme(axis.text.x = element_blank())<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/box1-300x214.png\" alt=\"\" \/><\/p>\n<p>Ein Vergleich zwischen den Spezies l\u00e4sst sich auch dar\u00fcber machen, dass die Spezies auf der x-Achse dargestellt werden sollen. Es ist aber auch n\u00f6tig die Daten nach Spezies zu gruppieren, darum steht dort <code>group=species<\/code>:<\/p>\n<pre><code>ggplot(penguins) +\n  geom_boxplot(\n    aes(\n      x=species,\n      y=flipper_length_mm, \n      group=species,\n      fill=species\n    )\n) + scale_fill_colorblind()<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/box2-300x214.png\" alt=\"\" \/><\/p>\n<p><code>scale_fill_colorblind()<\/code> kommt aus dem <code>ggthemes<\/code>-Paket, und passt die Farbauswahl so an, dass sie auch f\u00fcr verschieden Formen von Farbenblindheit noch gut erkennbar sind.<\/p>\n<h1>Violinenplots<\/h1>\n<p>Violinenplots lassen sich einfach \u00fcber <code>geom_violin()<\/code> plotten, was im Grunde so verwendet werden kann wie der Boxplot. Wenn <code>draw_quantiles=c(0.25,0.5,0.75)<\/code> gesetzt ist, werden Linien eingezeichnet die der Box und der Mittellinie im Boxplot entspricht.<\/p>\n<pre><code>ggplot(penguins) +\n  geom_violin(\n    aes(\n      x=species,\n      y=flipper_length_mm, \n      group=species,\n      fill=species\n    ),\n    draw_quantiles = c(0.25,0.5,0.75)\n) + scale_fill_colorblind()<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/violin1-300x214.png\" alt=\"\" \/><\/p>\n<h1>Kumulierte H\u00e4ufigkeiten<\/h1>\n<p>Bei einer kumulierten H\u00e4ufigkeit werden die Daten erst sortiert, und dann geschaut wie oft jeder einzelne Wert auftaucht. Das ganze wird dann noch normiert, also durch die Gesamtzahl der Datenpunkt geteilt, damit die Werte am Ende zwischen 0 und 1 liegen. Damit startet der Plot immer unten links und geht bis oben rechts. Das ganze l\u00e4sst sich mit <code>stat_ecdf()<\/code> machen. Das ist diesmal kein <code>geom_<\/code>, da es in erster Linie eine statistische Auswertungsfunktion ist. Daher werden die aesthetics vorher gesetzt. Da hier nur eine Linie geplottet wird, wird die Farbe der verschiedenen Gruppen mit <code>colour<\/code> gesetzt und auch gruppiert.<\/p>\n<pre><code>ggplot(penguins) +\n  aes(\n    x=flipper_length_mm,\n    colour=species\n  ) +\n  stat_ecdf() + scale_color_colorblind()<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/cumfreq1-300x214.png\" alt=\"\" \/><\/p>\n<p>Bei gleichverteilten Gr\u00f6\u00dfen ist es eine Gerade:<\/p>\n<pre><code>ggplot(data.frame(x=runif(10000))) +\n  aes(x) +\n  stat_ecdf()<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/cumfreq2-300x214.png\" alt=\"\" \/><\/p>\n<p>Bei normalverteilten Gr\u00f6\u00dfen nicht, sondern eher die klassische S-Form:<\/p>\n<pre><code>ggplot(data.frame(x=rnorm(10000))) +\n  aes(x) +\n  stat_ecdf()<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/www.datenleben.de\/wp-content\/uploads\/2023\/03\/cumfreq3-300x214.png\" alt=\"\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dieser Blogpost begleitet unsere Folge dl036: graphentypen 2 \u2013 histogramme, boxplots, etc. In unserer Reihe zu Graphentypen geht es um verschiedene Daten und welche Arten der Darstellung es f\u00fcr diese gibt. Im ersten Teil (dl029: graphentypen \u2013 skalen und zeiger) ging es um die kleinste Einheit: um eindimensionalen Daten. Im zweiten Teil wird es ein &hellip; <\/p>\n<p class=\"read-more\"><a class=\"readmore-btn\" href=\"https:\/\/www.datenleben.de\/index.php\/2023\/03\/25\/wie-erstelle-ich-histogramme-boxplots-und-violinenplots-in-r\/\">+<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":765,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-735","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/posts\/735","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/comments?post=735"}],"version-history":[{"count":8,"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/posts\/735\/revisions"}],"predecessor-version":[{"id":752,"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/posts\/735\/revisions\/752"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/media\/765"}],"wp:attachment":[{"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/media?parent=735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/categories?post=735"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.datenleben.de\/index.php\/wp-json\/wp\/v2\/tags?post=735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}