Thursday 4th of March, 2021
teachers: Claire Vandiedonck & Magali Berland; helpers: Antoine Bridier-Nahmias, Yves Clément, Bruno Toupance, Jacques van Helden
Content of this tutorial:
Set your working directory and check it:
setwd('/shared/home/cvandiedonck/RSession2') #change with your login!!!
getwd() #change is visible
=> About this jupyter notebook
This a jupyter notebook in R, meaning that the commands you will enter or run in Code
cells are directly understood by the server in the R language.
You could run the same commands in a Terminal or in RStudio.
In this tutorial, you will run one cell at a time.
Do not hesitate to try other commands by adding other cells.
plot(c(1,2,3), c(2,2,3))
Ajoutez le titre Mon graphique
avec l’argument main
.
plot(c(1,2,3), c(2,2,3), main = "Mon graphique")
Sauvegardez ce graphique en format .jpeg
sous le nom initial_graph.jpeg
avec la fonction jpeg()
suivie de dev.off()
jpeg("initial.graph.jpeg")
plot(c(1,2,3), c(2,2,3))
dev.off()
plot()
¶Recommencez ce graphique en personnalisant l’affichage avec les options ou fonctions suivantes pas à pas (faites un nouveau graphique à chaque étape en ajoutant le nouveau paramètre):
xlim
et ylim
: délimitez l’affichage des échelles des deux axes entre 0 et 4plot(c(1,2,3), c(2,2,3),xlim = c(0,4), ylim = c(0,4))
cex
: doublez la taille des pointsplot(c(1,2,3), c(2,2,3), cex = 2, xlim = c(0,4), ylim = c(0,4))
pch
: donnez d’abord une forme de cercle plein à chaque point ;plot(c(1,2,3), c(2,2,3), cex = 2, pch = 16, xlim = c(0,4), ylim = c(0,4))# ou pch=19 ou 20 selon la taille choisie
puis recommencez en spécifiant une forme différente pour chaque point :
- le 1er sous forme d’une croix (comme un +)
- le 2ème sous forme d’un triangle pointé vers le bas vide
- le 3ème sous forme d’un losange plein
plot(c(1,2,3), c(2,2,3), cex = 2, pch = c(3,6,18), xlim = c(0,4), ylim = c(0,4))
palette()
: trouvez les couleurs de votre session et identifiez l’indice de la couleur grisepalette() # le nom des couleurs de base est affiche
index_grey <- grep("gray", palette())#gray=grey dans R!!!
col
: mettez tous les points en gris puis donnez une couleur différente à chaque point :
rouge pour le 1er
bleu pour le 2nd
contour en magenta et fond en cyan pour le 3ème (avec l’option bg en plus)
plot(c(1,2,3), c(2,2,3), cex = 2, pch = c(3,6,18), xlim = c(0,4), ylim = c(0,4), col = index_grey)# vous pouvez ecrire col="gray" ou col=8 ou col=grep("gray", palette()) indifferemment
plot(c(1,2,3), c(2,2,3), cex = 2, pch = c(3,6,23), xlim = c(0,4), ylim = c(0,4), col = c("red", "blue", "magenta"), bg = "cyan")
lwd
: doublez la largeur des traits tracés (ici des points)plot(c(1,2,3), c(2,2,3), cex = 2, pch = c(3,6,23), xlim = c(0,4), ylim = c(0,4), col = c("red", "blue", "magenta"), bg = "cyan", lwd = 2)
bty
: retirez la cadre entourant le graphique pour ne conserver que les axesplot(c(1,2,3), c(2,2,3), cex = 2, pch = c(3,6,23), xlim = c(0,4), ylim = c(0,4), col = c("red", "blue", "magenta"), bg = "cyan", lwd = 2, bty = "n")
xlab
et ylab
= nommez les axes Axe des abscisses et Axe Y.# et enfin, cette fois-ci avec le nom des axes et en ecrivant chaque argument l'un en dessous de l'autre pour plus de lisibilite (sans oublier la virgule entre chaque!!!)
plot(c(1,2,3), c(2,2,3),
cex = 2, pch = c(3,6,23),
xlim = c(0,4), ylim = c(0,4),
col = c("red", "blue", "magenta"),
bg = "cyan",
lwd = 2,
bty = "n",
xlab = "Axe des abcisses",
ylab = "Axe Y")
points()
plot(c(1,2,3), c(2,2,3),
cex = 2, pch = c(3,6,23),
xlim = c(0,4), ylim = c(0,4),
col = c("red", "blue", "magenta"),
bg = "cyan",
lwd = 2,
bty = "n",
xlab = "Axe des abcisses",
ylab = "Axe Y")
points(1.5, 3, pch = 16, col = "gray", cex = 2) # points() est une fonction graphique secondaire
abline()
et en particulier l’option lty
plot(c(1,2,3), c(2,2,3),
cex = 2, pch = c(3,6,23),
xlim = c(0,4), ylim = c(0,4),
col = c("red", "blue", "magenta"),
bg = "cyan",
lwd = 2,
bty = "n",
xlab = "Axe des abcisses",
ylab = "Axe Y")
points(1.5, 3, pch = 16, col = "gray", cex = 2) # points() est une fonction graphique secondaire
abline(h = 1, col = "green3", lty = 2) # abline() est aussi une fonction secondaire
Ajoutez une légende avec la fonction legend()
dans le coin en haut à droite et aidez-vous des arguments :
`col`, `pt.bg`, `pt.lwd` et `pt.cex`: pour respecter les couleurs, formes des points que vous mettrez à la taille 1.5
`legend` : pour nommer vos points A, B, C et D
`title` : pour donner un nom Mes 4 points à la légende
`horiz` : pour positionner les points côte à côte plutôt que les uns en dessous des autres
plot(c(1,2,3), c(2,2,3),
cex = 2, pch = c(3,6,23),
xlim = c(0,4), ylim = c(0,4),
col = c("red", "blue", "magenta"),
bg = "cyan",
lwd = 2,
bty = "n",
xlab = "Axe des abcisses",
ylab = "Axe Y")
points(1.5, 3, pch = 16, col = "gray", cex = 2) # points() est une fonction graphique secondaire
abline(h = 1, col = "green3", lty = 2) # abline() est aussi une fonction secondaire
legend("topright",
legend = c("A","B","C","D"),
col = c("red", "blue", "magenta", "gray"),
pch = c(3,6,23, 16),
pt.bg = "cyan",
pt.cex = 1.5,
pt.lwd = 1.5,
title = "mes 4 points",
bty = "n",
horiz = T)
Mon graphique personnalisé
à votre figureplot(c(1,2,3), c(2,2,3),
cex = 2, pch = c(3,6,23),
xlim = c(0,4), ylim = c(0,4),
col = c("red", "blue", "magenta"),
bg = "cyan",
lwd = 2,
bty = "n",
xlab = "Axe des abcisses",
ylab = "Axe Y")
points(1.5, 3, pch = 16, col = "gray", cex = 2) # points() est une fonction graphique secondaire
abline(h = 1, col = "green3", lty = 2) # abline() est aussi une fonction secondaire
legend("topright",
legend = c("A","B","C","D"),
col = c("red", "blue", "magenta", "gray"),
pch = c(3,6,23, 16),
pt.bg = "cyan",
pt.cex = 1.5,
pt.lwd = 1.5,
title = "mes 4 points",
bty = "n",
horiz = T)
title("Mon graphique personnalisé")
# ici j'ai utilise la fonction secondaire title() pour ajouter un titre, mais j'aurais pu utiliser l'argument "main" lors de la fonction plot:
# plot(c(1,2,3), c(2,2,3),
# cex = 2, pch = c(3,6,23),
# xlim = c(0,4), ylim = c(0,4),
# col = c("red", "blue", "magenta"),
# bg = "cyan",
# lwd = 2,
# bty = "n",
# xlab = "Axe des abcisses",
# ylab = "Axe Y",
# main="Mon graphique personnalise")
cutom_graph.pdf
pdf("custom_graph.pdf")
plot(c(1,2,3), c(2,2,3),
cex = 2, pch = c(3,6,23),
xlim = c(0,4), ylim = c(0,4),
col = c("red", "blue", "magenta"),
bg = "cyan",
lwd = 2,
bty = "n",
xlab = "Axe des abcisses",
ylab = "Axe Y",
main = "Mon graphique personnalis?")
points(1.5, 3, pch = 16, col = "gray", cex = 2)
abline(h = 1, col = "green3", lty = 2)
legend("topright", legend = c("A","B","C","D"),
col = c("red", "blue", "magenta", "gray"),
pch = c(3,6,23, 16),
pt.bg = "cyan", pt.cex = 1.5, pt.lwd = 1.5,
title = "mes 4 points",
bty = "n",
horiz = T)
dev.off()
Tip : fonctions recommandées pour l'exercice:
jpeg()
pdf()
dev.off()
plot()
palette()
grep()
points()
abline()
legend()
title()
=> Pour aller plus loin:
Jouez avec l'affichage des axes:
plot(c(1,2,3), c(2,2,3),
cex = 2, pch = c(3,6,23),
xlim = c(0,4), ylim = c(0,4),
col = c("red", "blue", "magenta"),
bg = "cyan", lwd = 2, bty = "n",
xlab = "Axe des abcisses", ylab = "Axe Y",
xaxt = "n", yaxt = "n" )
axis(1, at = 0:4,labels = F )
mtext(0:4,side = 1,at = 0:4, line = 1,col = "blue")
axis(2, at = 0:4, tcl = -0.2, cex = 0.7, labels = F )
mtext(0:4,side = 2,at = 0:4, line = 1, cex = 0.7)
abline(h = 1, col = "green3", lty = 2)
legend("topright", legend = c("A","B","C","D"),
col = c("red", "blue", "magenta", "gray"),
pch = c(3,6,23, 16), pt.bg = "cyan",
pt.cex = 1.5, pt.lwd = 1.5,
title = "mes 4 points",
bty = "n", horiz = T)
title("Mon graphique personnalise")
Importez dans R le fichier motorisation.txt
qui est sur la page du cours ou dans dans: /shared/procjets/dubii2021/trainers/module3/data
.
Générez un camembert de la répartition des différentes motorisations et choisissez vous-mêmes des couleurs.
Générez également un diagramme en bâtons avec les proportions (fréquences relatives) des différentes motorisations colorées comme dans le camembert.
Disposez à présent les deux graphes côte à côte sur un même graphique. Essayez dans une premier temps de faire chaque graphique independamment avec les bonnes commandes avant de les afficher sur une même fenêtre graphique
Note: lorsque vous utilisez Rstudio, une erreur peur se produire si votre fenetre graphique est trop petite, compte tenu des marges et de la taille de votre ecran-> pensez alors a redimensionner la fenetre graphique avant de lancer vos commandes graphiques
Tip :fonctions recommandées :
read.table()
,
table()
,
pie()
,
barplot()
par()
avec l’argument mfrow
Avant de lire ce fichier et de l'assigner dans un objet R, ouvrez le avec un editeur de texte pour voir s'il y a une en-tete, combien il contient de lignes, de colonnes et quel est leur separateur (espace, tabulation, virgule, point virgule, etc...) Ici motorisation.txt est un fichier texte de 22 lignes, avec une seule colonne (donc vous pouvez garder le separateur de champs "espace" par defaut dans la commande read.table qui suit), et sans en-tete (donc il faut le specifier avec l'argument header sinon votre premiere valeur serait lue comme un nom de colonne par defaut)
motorisation <- read.table("/shared/projects/dubii2021/trainers/module3/data/motorisation.txt", header = F, stringsAsFactors = F) # nommez votre objet R present d
# Alternativement, si le fichier motorisation est dans votre repertoire de travail ou un autre, donnez son chemin absolu ou relatif
# motorisation <- read.table("./motorisation.txt", header = F, stringsAsFactors = F)
Toujours verifier ensuite la structure des objets importés et se demander si elle est conforme a ce que vous souhaitez!
str(motorisation)
'data.frame': 22 obs. of 1 variable: $ V1: chr "Hybride" "Diesel" "Diesel" "Essence" ...
On ajoute un nome à la variable V1 pour plus de lisibilité:
names(motorisation) <- "type_de_motorisation"
pie(table(motorisation$type_de_motorisation))
Si je choisis mes couleurs:
pie(table(motorisation$type_de_motorisation), col = c("green3","blue","magenta","orange"))
N’hesitez pas à decomposer la commande ci-dessus élement par élement pour bien la comprendre en tapant successivement:
? pie
table(motorisation$type_de_motorisation) #cette commande vous retourne un tableau de contingence comptant le nombre d'observationns de chaque valeur de la variable "type de motorisation". C'est ce qui est le plus pratique! Il s'agit d'un objet R a une seule dimension.
Diesel Electrique Essence Hybride 9 1 7 5
pie {graphics} | R Documentation |
Draw a pie chart.
pie(x, labels = names(x), edges = 200, radius = 0.8, clockwise = FALSE, init.angle = if(clockwise) 90 else 0, density = NULL, angle = 45, col = NULL, border = NULL, lty = NULL, main = NULL, ...)
x |
a vector of non-negative numerical quantities.
The values in |
labels |
one or more expressions or character strings giving
names for the slices. Other objects are coerced by
|
edges |
the circular outline of the pie is approximated by a polygon with this many edges. |
radius |
the pie is drawn centered in a square box whose sides range from -1 to 1. If the character strings labeling the slices are long it may be necessary to use a smaller radius. |
clockwise |
logical indicating if slices are drawn clockwise or counter clockwise (i.e., mathematically positive direction), the latter is default. |
init.angle |
number specifying the starting angle (in
degrees) for the slices. Defaults to 0 (i.e., ‘3 o'clock’)
unless |
density |
the density of shading lines, in lines per inch.
The default value of |
angle |
the slope of shading lines, given as an angle in degrees (counter-clockwise). |
col |
a vector of colors to be used in filling or shading
the slices. If missing a set of 6 pastel colours is used,
unless |
border, lty |
(possibly vectors) arguments passed to
|
main |
an overall title for the plot. |
... |
graphical parameters can be given as arguments to
|
Pie charts are a very bad way of displaying information. The eye is good at judging linear measures and bad at judging relative areas. A bar chart or dot chart is a preferable way of displaying this type of data.
Cleveland (1985), page 264: “Data that can be shown by pie charts always can be shown by a dot chart. This means that judgements of position along a common scale can be made instead of the less accurate angle judgements.” This statement is based on the empirical investigations of Cleveland and McGill as well as investigations by perceptual psychologists.
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Cleveland, W. S. (1985) The Elements of Graphing Data. Wadsworth: Monterey, CA, USA.
dotchart
.
require(grDevices) pie(rep(1, 24), col = rainbow(24), radius = 0.9) pie.sales <- c(0.12, 0.3, 0.26, 0.16, 0.04, 0.12) names(pie.sales) <- c("Blueberry", "Cherry", "Apple", "Boston Cream", "Other", "Vanilla Cream") pie(pie.sales) # default colours pie(pie.sales, col = c("purple", "violetred1", "green3", "cornsilk", "cyan", "white")) pie(pie.sales, col = gray(seq(0.4, 1.0, length = 6))) pie(pie.sales, density = 10, angle = 15 + 10 * 1:6) pie(pie.sales, clockwise = TRUE, main = "pie(*, clockwise = TRUE)") segments(0, 0, 0, 1, col = "red", lwd = 2) text(0, 1, "init.angle = 90", col = "red") n <- 200 pie(rep(1, n), labels = "", col = rainbow(n), border = NA, main = "pie(*, labels=\"\", col=rainbow(n), border=NA,..") ## Another case showing pie() is rather fun than science: ## (original by FinalBackwardsGlance on http://imgur.com/gallery/wWrpU4X) pie(c(Sky = 78, "Sunny side of pyramid" = 17, "Shady side of pyramid" = 5), init.angle = 315, col = c("deepskyblue", "yellow", "yellow3"), border = FALSE)
# Si besoin, vous pouvez extraire les noms attribues a ces valeurs avec la commande
names(table(motorisation$type_de_motorisation))
palette() # n'est pas incluse dans la fonction pie() mais vous sert a connaitre les couleurs utilisees par defaut dans votre session R
c("green3","blue","magenta","orange")# vous definissez ici le vecteur pour l'argument col avec 4 elements: une couleur par type possible de motorisation; les couleurs seront affichees dans l'odre alphabetique de chacune des 4 valeurs de la variable "type de motorisation"
Alternativement: vous pouviez utiliser la commande pie()
sans utiliser de tableau de contingence en donnant comme argument x un vecteur avec les comptes de chaque valeur comme ci-dessous
pie(c(9,1,7,5), labels = c("Diesel","Electrique", "Essence", "Hybride"),
col = c("green3","blue","magenta","orange"))
Vous pouvez ajouter l'argument clocwise=T pour changer l'orientation des parts
Ici, j'ai ecrit labels=c("Diesel","Electrique", "Essence", "Hybride")
mais on aurait pu ecrire egalement labels = names(table(motorisation$type_de_motorisation))
ou labels = sort(unique(motorisation$type_de_motorisation)
car unique()
retourne chaque occurence/valeur possible de la variable et la fonction sort()
les trie par ordre alphanumerique
Enfin, si vous voulez afficher les parts du camembert par ordre croissant, vous pouvez appliquer la fonction sort()
sur la valeur obtenue par la commande (table(motorisation$type_de_motorisation))`.
pie(sort(table(motorisation$type_de_motorisation)), col = c("green3","blue","magenta","orange")) # les couleurs sont attribuées dans le nouvel ordre...qui est peut etre mieux car diesel n'est plus en vert!
barplot(table(motorisation$type_de_motorisation)/length(motorisation$type_de_motorisation),
col = c("green3","blue","magenta","orange"))
Il s'agit bien d'un barplot (diagramme en batons) adapté a des donnees qualitatives ou quantitatives discrètes et non d'un histogramme adapté a des variables continues
N’hesitez pas à aggrandir votre fenetre d’affichage pour voir les noms sous les batons si vous êtes sur rstudio…ou reduisez leur taille en utilisant l’argument cex.names:
barplot(table(motorisation$type_de_motorisation)/length(motorisation$type_de_motorisation),
cex.names = 1.5,
col = c("green3","blue","magenta","orange"))
Il est aussi possible d’utiliser barplot avec une matrice comme argument x
. Dans ce cas, par defaut avec l’argument beside=F
, les élements du diagramme en baton seront empilés.
barplot(matrix(table(motorisation$type_de_motorisation)/length(motorisation$type_de_motorisation)),
col = c("green3","blue","magenta","orange"),
legend.text = unique(sort(motorisation$type_de_motorisation)),
args.legend = list(x = "topright", cex = 0.8, bty = "n"),
width = 1,
xlim = c(0,5) )
Si vous voulez les afficher du plus grand au plus petit effectif, ajouter sort()
en precisant decreasing=T
barplot(matrix(sort(table(motorisation$type_de_motorisation)/length(motorisation$type_de_motorisation),decreasing = T)),
col = c("green3","blue","magenta","orange"),
legend.text = unique(sort(motorisation$type_de_motorisation)),
args.legend = list(x = "topright", cex = 0.8, bty = "n"),
width = 1,
xlim = c(0,5) )
opar <- par()
par(mfrow = c(1,2))
pie(table(motorisation$type_de_motorisation), col = c("green3","blue","magenta","orange"))
barplot(table(motorisation$type_de_motorisation)/length(motorisation$type_de_motorisation),col = c("green3","blue","magenta","orange"))
suppressWarnings(par(opar, warn=F))# avec supressWarnings() j'évite l'affichage des warnings
=> Version finale pour aller plus loin en integrant des alternatives décrites pour chaque figure et avec les bonnes règles d’affichage du script R:
opar <- par()
par(mfrow = c(1,2))
pie(sort(table(motorisation$type_de_motorisation)),
col = c("green3","blue","magenta","orange"),
clockwise = T)
barplot(matrix(sort(table(motorisation$type_de_motorisation)/length(motorisation$type_de_motorisation),
decreasing = T)),
col = c("orange","magenta","blue","green3"),
legend.text = names(sort(table(motorisation$type_de_motorisation)
,decreasing = T)),
args.legend = list(x = "topright", cex = 0.8, bty = "n"),
width = 1,
xlim = c(0,5))
suppressWarnings(par(opar))
Vous noterez qu’il est préférable de visualiser les donnees qualitatives, comme ici le type de motorisation, au moyen d’un diagramme en bâtons. Cela vous ai rappele en ‘Note’ dans la fenetre d’aide de la fonction pie!
Tirez aléatoirement un ensemble de 100 nombres compatibles avec une distribution normale de moyenne 10 et d’écart type 5.
Sauvegardez-les dans un objet R.
Tip :
fonction recommandée : norm()
myrandomdata <- rnorm(100, mean = 10, sd = 5)# bien penser à assigner le resultat de votre tirage dans un objet, sinon, les valeurs changent à chaque fois que vous effectuez un tirage avec la commande rnorm!
Tracez la représentation histogramme des valeurs obtenues.
Tip :fonction recommandée : hist()
Changez le nombre d’intervalles de l’histogramme : environ 5, 50 et 100.
Tip :fonction recommandée : hist()
avec l'argument breaks
Tracez également une boite à moustache horizontale de ces data.
Tip :fonction recommandée : boxplot()
Affichez les 3 histogrammes et le boxplot les uns en dessous des autres dans une même fenêtre graphique.
Tip :fonction recommandée : par()
avec l'argument mfrow
Je ne vous détaille pas ici chaque graphique, je les empile tout de suite:
opar <- par()
par(mfrow = c(4,1))
hist(myrandomdata, breaks = 5)
hist(myrandomdata, breaks = 50)
hist(myrandomdata, breaks = 100)
boxplot(myrandomdata, horizontal = T)
Copiez dans votre environnement le fichier airquality.png
disponible avec la commande suivante:
file.copy("/shared/projects/dubii2021/trainers/module3/data/airquality.png", "./airquality.png", overwrite=TRUE)
Ouvrez cette image dans le lab en double cliquant dessus.
Récupérez le jeu de données airquality
disponible sous R.
Créez les graphes de la figure ci-dessus avec ce jeu de données.
Tip :fonctions recommandées : data()
,
par()
avec les arguments mfrow
et mar
,
plot()
,
lines()
,
boxplot()
,
abline()
,
lm()
,
title()
data(airquality)
str(airquality)
'data.frame': 153 obs. of 6 variables: $ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ... $ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ... $ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ... $ Temp : int 67 72 74 62 56 66 65 59 61 69 ... $ Month : int 5 5 5 5 5 5 5 5 5 5 ... $ Day : int 1 2 3 4 5 6 7 8 9 10 ...
opar <- par()
par(mfrow = c(2,2),
mar = c(4.1, 2.1, 5.1, 2.1))
stripchart(airquality$Temp~airquality$Month,
pch = 22,
xlab = "Temperature", ylab = "Month",
main = "A. stripchart of temperatures",
col = 6)
hist(airquality$Temp,
xlab = "Temp",
freq = FALSE,
main = "B. histogram of temperatures")
lines(density(airquality$Tem), col = 5)
boxplot(airquality$Ozone~airquality$Month,
names = c("May", "June", "July", "August", "September"),
cex.axis = 0.7,
col = 4,
pch = "'",
main = "C. boxplot of ozon level per month")
plot(airquality$Ozone~airquality$Wind,
xlab = "Wind",
ylab = "Ozone",
xlim = c(5,14),
pch = "'",
main = "D. ozone level versus wind")
abline(lm(airquality$Ozone~airquality$Wind),
col = 2, lty = 2, lwd = 1.5)
title("Graphs from the airquality dataset", outer = T, line = -1)
suppressWarnings(par(opar))
For the boxplots, you could also have generated a factor with names to each level:
fmonth <- factor(airquality$Month,levels = 5:9)
levels(fmonth) <- c("May","June","July","August","September")
boxplot(airquality$Ozone ~ fmonth ,
col = "blue",
ylab = "Ozone",
main = "C. boxplot of ozon level per month")
IMPORTANT NOTE ON NAMES OF VARIABLES:
Here for boxplot as for most R functions, you may enter the name of the dataframe for once with the argument data
, and then just put the name of the variables without repeating the name of the dataframe:
boxplot(data = airquality, Ozone~fmonth , col = "blue", ylab = "Ozone", main = "C. boxplot of ozon level per month")
Alternatively, you may use attach()
to access to the variables of the dataset directly by their name, then enter your commands, and then detach()
once finsihed. I don't recommand this last method as we often forget to detach.
attach(airquality)
boxplot(Ozone ~ fmonth , col = "blue", ylab = "Ozone", main = "C. boxplot of ozon level per month")
detach(airquality)
sessionInfo()
R version 4.0.2 (2020-06-22) Platform: x86_64-conda_cos6-linux-gnu (64-bit) Running under: CentOS Linux 7 (Core) Matrix products: default BLAS/LAPACK: /shared/ifbstor1/software/miniconda/envs/r-4.0.2/lib/libopenblasp-r0.3.10.so locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_4.0.2 ellipsis_0.3.1 IRdisplay_0.7.0 pbdZMQ_0.3-3.1 [5] tools_4.0.2 htmltools_0.5.1 pillar_1.4.7 base64enc_0.1-3 [9] crayon_1.3.4 uuid_0.1-4 IRkernel_1.1.1 jsonlite_1.7.2 [13] digest_0.6.27 lifecycle_0.2.0 repr_1.1.0 rlang_0.4.10 [17] evaluate_0.14