R: Plot multiple box plots using columns from data frame
You could use the reshape
package to simplify things
data <- data.frame(v1=rnorm(100),v2=rnorm(100),v3=rnorm(100), v4=rnorm(100))
library(reshape)
meltData <- melt(data)
boxplot(data=meltData, value~variable)
or even then use ggplot2
package to make things nicer
library(ggplot2)
p <- ggplot(meltData, aes(factor(variable), value))
p + geom_boxplot() + facet_wrap(~variable, scale="free")
Boxplot in for-loop over multiple columns in r
You could go via column numbers:
# random example data as no reproducible example was given
df <- data.frame(
real = sample(1:4, 20, TRUE),
one = runif(20),
two = runif(20),
three = runif(20))
)
# graphics paramaters so we see all at once
par(mfrow = c(3,1), mar = c(2, 2, 1, 1))
# the easiest way is through column numbers
for(column in 2:4)
boxplot(df[[column]] ~ df$real)
how to create multiple boxplots from the same dataframe?
Using ggplot::facet_wrap()
makes it easy to make a bunch of panels of a graph from one dataset. However for it to work the variable that defines the different panels has to be in a single column. In this case that means you have to get from the 'wide' format to a 'long' format of your data. For this I suggest tidyr::pivot_longer()
. Last point is that you need to treat your label
as a factor
otherwise you won't get separate boxes as you do in base R because I think that converts the x variable into a factor by default which {ggplot2} won't do (although it will give an informative warning). Finally, if you want to have separate y
axes for each plot you can set scales = "free_y"
inside facet_wrap()
.
library(tidyverse)
df <- data.frame(var_1 = c(1,2,3,4,5,6,7,8,9),
var_2 = c(21,23,34,45,23,56,76,54,65),
var_3 = c(6,5,4,3,5,7,3,2,5),
label = c(1,1,1,2,1,2,2,1,2))
df %>%
pivot_longer(-label) %>%
ggplot(aes(factor(label), value)) +
geom_boxplot() +
facet_wrap(vars(name), nrow = 1)
Created on 2022-02-12 by the reprex package (v2.0.1)
How to make a box plot for every column from dataframe using ggplot
I created a dataframe below first.
> data
X X1 X2 X3 X4
X1H 8 2 0 0
X2H 2 0 2 2
X3H 0 2 0 0
X4H 0 0 0 2
X5H 2 0 0 2
X6H 2 0 2 0
Then, reshaped it by using the melt function.
data.melt<-melt(data, id="X")
Given that you wanted to draw a boxplot with your own computations, I calculated mean, sd, min, max for each column
data.sum<-ddply(data.melt, .(variable), summarise,
mean = mean(value),
sd = sd(value),
min = min(value),
max = max(value))
Then, you can create a boxplot for each column with this code below.
ggplot(data.sum, aes(x=variable))+geom_boxplot(aes(ymin =min, lower = mean-sd, middle = mean, upper = mean+sd, ymax =max), stat="identity")
Building a box plot from all columns of data frame with column names on x in ggplot2
You can use stack
to transform the data frame:
library(ggplot2)
ggplot(stack(df), aes(x = ind, y = values)) +
geom_boxplot()
Make boxplots of columns in R
You can do it as well using tidyverse
library(tidyverse)
SUS %>%
#create new column and save the row.names in it
mutate(variable = row.names(.)) %>%
#convert your data from wide to long
tidyr::gather("var", "value", 1:7) %>%
#plot it using ggplot2
ggplot(., aes(x = variable, y = value)) +
geom_boxplot()+
theme(axis.text.x = element_text(angle=35,hjust=1))
Related Topics
How to Remove Rows With Any Zero Value
Find All Combinations of a Set of Numbers That Add Up to a Certain Total
How to Keep Columns When Grouping/Summarizing
How to Declare a Vector of Zeros in R
Converting Year and Month ("Yyyy-Mm" Format) to a Date
Error in If/While (Condition) {: Missing Value Where True/False Needed
How to Create a Lag Variable Within Each Group
Using Reshape from Wide to Long in R
How to Drop Columns by Name in a Data Frame
Delete Rows That Exist in Another Data Frame
Deleting Rows in R Based on Values Over Multiple Columns
Using Ifelse Statement on the Whole Dataset Instead of a Single Column
Counting Unique Values Across Variables (Columns) in R
Filter Data.Frame Rows by a Logical Condition
Why Are My Dplyr Group_By & Summarize Not Working Properly? (Name-Collision With Plyr)
Combine (Rbind) Data Frames and Create Column With Name of Original Data Frames