Parallel Coordinates Plot in ggplot2
How to make Parallel Coordinates Plot in ggplot2 with Plotly.
New to Plotly?
Plotly is a free and open-source graphing library for R. We recommend you read our Getting Started guide for the latest installation or upgrade instructions, then move on to our Plotly Fundamentals tutorials or dive straight in to some Basic Charts tutorials.
Default parallel coordinates plot
The input dataset must be a data frame with several numeric variables, each being used as a vertical axis on the chart. Columns number of these variables are specified in the columns
argument of the function.
For this example, a categoric variable is used to color lines, as specified in the groupColumn
variable.
library(plotly)
library(GGally)
data <- iris
p <- ggparcoord(data,
columns = 1:4, groupColumn = 5
)
ggplotly(p)
Custom colour, theme and style
This is the same chart as the previous one, except for the following customizations:
- color palette is improved thanks to the
viridis
package - title is added with
title
, and customized intheme
- dots are added with
showPoints
- a bit of transparency is applied to lines with
alphaLines
theme_ipsum()
is used for the general appearance
library(plotly)
library(GGally)
library(viridis)
library(hrbrthemes)
data <- iris
p <- ggparcoord(data,
columns = 1:4, groupColumn = 5, order = "anyClass",
showPoints = TRUE,
title = "Parallel Coordinate Plot for the Iris Data",
alphaLines = 0.3
) +
scale_color_viridis(discrete=TRUE) +
theme_ipsum()+
theme(
plot.title = element_text(size=10)
)
ggplotly(p)
Scaling
Scaling transforms the raw data to a new scale that is common with other variables. It is a crucial step to compare variables that do not have the same unit, but can also help otherwise as shown in the example below.
The ggally
package offers a scale
argument. Four possible options are applied on the same dataset below:
globalminmax
→ No scalinguniminmax
→ Standardize to Min = 0 and Max = 1std
→ Normalize univariately (substract mean & divide by sd)center
→ Standardize and center variables
library(plotly)
library(GGally)
library(viridis)
library(hrbrthemes)
data <- iris
p <- ggparcoord(data,
columns = 1:4, groupColumn = 5, order = "anyClass",
scale="globalminmax",
showPoints = TRUE,
title = "No scaling",
alphaLines = 0.3
) +
scale_color_viridis(discrete=TRUE) +
theme_ipsum()+
theme(
legend.position="none",
plot.title = element_text(size=13)
) +
xlab("")
ggplotly(p)
Standardize to Min = 0 and Max = 1:
library(plotly)
library(GGally)
library(viridis)
library(hrbrthemes)
data <- iris
p <- ggparcoord(data,
columns = 1:4, groupColumn = 5, order = "anyClass",
scale="uniminmax",
showPoints = TRUE,
title = "Standardize to Min = 0 and Max = 1",
alphaLines = 0.3
) +
scale_color_viridis(discrete=TRUE) +
theme_ipsum()+
theme(
legend.position="none",
plot.title = element_text(size=13)
) +
xlab("")
ggplotly(p)
Normalize univariately (substract mean & divide by sd):
library(plotly)
library(GGally)
library(viridis)
library(hrbrthemes)
data <- iris
p <- ggparcoord(data,
columns = 1:4, groupColumn = 5, order = "anyClass",
scale="std",
showPoints = TRUE,
title = "Normalize univariately (substract mean & divide by sd)",
alphaLines = 0.3
) +
scale_color_viridis(discrete=TRUE) +
theme_ipsum()+
theme(
legend.position="none",
plot.title = element_text(size=13)
) +
xlab("")
ggplotly(p)
Standardize and center variables:
library(plotly)
library(GGally)
library(viridis)
library(hrbrthemes)
data <- iris
p <- ggparcoord(data,
columns = 1:4, groupColumn = 5, order = "anyClass",
scale="center",
showPoints = TRUE,
title = "Standardize and center variables",
alphaLines = 0.3
) +
scale_color_viridis(discrete=TRUE) +
theme_ipsum()+
theme(
legend.position="none",
plot.title = element_text(size=13)
) +
xlab("")
ggplotly(p)
Highlight a group
library(plotly)
library(GGally)
data <- iris
p <- data %>%
arrange(desc(Species)) %>%
ggparcoord(
columns = 1:4, groupColumn = 5, order = "anyClass",
showPoints = TRUE,
title = "Original",
alphaLines = 1
) +
scale_color_manual(values=c( "#69b3a2", "#E8E8E8", "#E8E8E8") ) +
theme_ipsum()+
theme(
legend.position="Default",
plot.title = element_text(size=10)
) +
xlab("")
ggplotly(p)
What About Dash?
Dash for R is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library.
Learn about how to install Dash for R at https://dashr.plot.ly/installation.
Everywhere in this page that you see fig
, you can display the same figure in a Dash for R application by passing it to the figure
argument of the Graph
component from the built-in dashCoreComponents
package like this:
library(plotly)
fig <- plot_ly()
# fig <- fig %>% add_trace( ... )
# fig <- fig %>% layout( ... )
library(dash)
library(dashCoreComponents)
library(dashHtmlComponents)
app <- Dash$new()
app$layout(
htmlDiv(
list(
dccGraph(figure=fig)
)
)
)
app$run_server(debug=TRUE, dev_tools_hot_reload=FALSE)