-
Notifications
You must be signed in to change notification settings - Fork 230
/
histogram_several_group.Rmd
152 lines (104 loc) · 3.67 KB
/
histogram_several_group.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
---
title: "Histogram with several groups - ggplot2"
descriptionMeta: "How to build histograms showing the distribution of several groups with R and ggplot2."
descriptionTop: "A [histogram](https://www.data-to-viz.com/graph/histogram.html) displays the distribution of a numeric variable. A common task is to compare this distribution through several groups. This document explains how to do so using R and [ggplot2](ggplot2-package.html)."
sectionText: "Histogram Section"
sectionLink: "histogram.html"
DataToVizText: "About histogram"
DataToVizLink: "data-to-viz.com/graph/histogram.html"
url: "histogram_several_group.html"
output:
html_document:
self_contained: false
mathjax: default
lib_dir: libs
template: template_rgg.html
css: style.css
toc: TRUE
toc_float: TRUE
toc_depth: 2
df_print: "paged"
---
```{r global options, include = FALSE}
knitr::opts_chunk$set( warning=FALSE, message=FALSE)
```
<div class="container">
# Several histograms on the same axis
***
<div class = "row">
<div class = "col-md-6 col-sm-12 align-self-center">
If the number of group or variable you have is relatively low, you can display all of them on the same axis, using a bit of transparency to make sure you do not hide any data.
<u>Note</u>: with 2 groups, you can also build a [mirror histogram](density_mirror_ggplot2.html)
```{r}
# library
library(ggplot2)
library(dplyr)
library(hrbrthemes)
# Build dataset with different distributions
data <- data.frame(
type = c( rep("variable 1", 1000), rep("variable 2", 1000) ),
value = c( rnorm(1000), rnorm(1000, mean=4) )
)
# Represent it
p <- data %>%
ggplot( aes(x=value, fill=type)) +
geom_histogram( color="#e9ecef", alpha=0.6, position = 'identity') +
scale_fill_manual(values=c("#69b3a2", "#404080")) +
theme_ipsum() +
labs(fill="")
```
</div>
<div class = "col-md-6 col-sm-12 align-self-center">
```{r, out.width=c('100%'), echo=FALSE}
p
```
</div>
</div>
# Using small multiple
***
<div class = "row">
<div class = "col-md-6 col-sm-12 align-self-center">
If the number of group you need to represent is high, drawing them on the same axis often results in a <u>cluttered</u> and unreadable figure.
A good workaroung is to use <u>small multiple</u> where each group is represented in a fraction of the plot window, making the figure easy to read. This is pretty easy to build thanks to the `facet_wrap()` function of ggplot2.
<u>Note:</u> read more about the dataset used in this example [here](https://www.data-to-viz.com/story/OneNumOneCatSeveralObs.html).
</div>
<div class = "col-md-6 col-sm-12 align-self-center">
```{r}
# Libraries
library(tidyverse)
library(hrbrthemes)
library(viridis)
library(forcats)
# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/zonination/perceptions/master/probly.csv", header=TRUE, sep=",")
data <- data %>%
gather(key="text", value="value") %>%
mutate(text = gsub("\\.", " ",text)) %>%
mutate(value = round(as.numeric(value),0))
# plot
p <- data %>%
mutate(text = fct_reorder(text, value)) %>%
ggplot( aes(x=value, color=text, fill=text)) +
geom_histogram(alpha=0.6, binwidth = 5) +
scale_fill_viridis(discrete=TRUE) +
scale_color_viridis(discrete=TRUE) +
theme_ipsum() +
theme(
legend.position="none",
panel.spacing = unit(0.1, "lines"),
strip.text.x = element_text(size = 8)
) +
xlab("") +
ylab("Assigned Probability (%)") +
facet_wrap(~text)
```
</div>
</div>
```{r out.width='80%', echo=FALSE, fig.align='center', fig.height=7}
p
```
<!-- Close container -->
</div>
```{r, echo=FALSE}
htmltools::includeHTML("htmlChunkRelatedDistribution.html")
```