The UpSetR R package offers a wonderful method to upgrade the traditional Venn-diagram when multiple components/sets are to be compared. However, the upset plot in R (using UpSetR package) plots the set size (horizontal bars) on the left side of the plot. Is there any way to make them on the right side?
Asked
Active
Viewed 2,072 times
1 Answers
2
It is not easy to move horizontal bars from the left to the right side.
You need to modify the Make_size_plot
and the NoAttBasePlot
of the UpSetR
package as suggested below (before each modified line of code I wrote # Modified
for your convenience).
library(UpSetR)
library(grid)
library(gridExtra)
library(ggplot2)
NoAttBasePlot <- function (legend, size_plot_height, Main_bar_plot, Matrix_plot,
hratios, Size_plot, query_legend, set_metadata, set_metadata_plots,
newpage) {
top <- 1
bottom <- 100
if ((!is.null(legend)) && (query_legend != tolower("none"))) {
if (query_legend == tolower("top")) {
top <- 3
bottom <- 102
legend_top <- 1
legend_bottom <- 3
size_plot_height <- (size_plot_height + 2)
}
else if (query_legend == tolower("bottom")) {
legend_top <- 101
legend_bottom <- 103
}
}
if (is.null(set_metadata)) {
matrix_and_mainbar_right <- 100
matrix_and_mainbar_left <- 21
size_bar_right <- 20
size_bar_left <- 1
}
else if (!is.null(set_metadata)) {
matrix_and_mainbar_right <- set_metadata$ncols + 100
matrix_and_mainbar_left <- set_metadata$ncols + 21
size_bar_right <- set_metadata$ncols + 20
size_bar_left <- set_metadata$ncols + 1
metadata_right <- set_metadata$ncols
metadata_left <- 1
}
if (newpage) {
grid::grid.newpage()
}
if ((!is.null(legend)) && (query_legend != tolower("none"))) {
if (query_legend == tolower("top")) {
pushViewport(viewport(layout = grid.layout(102, matrix_and_mainbar_right)))
}
else if (query_legend == tolower("bottom")) {
pushViewport(viewport(layout = grid.layout(103, matrix_and_mainbar_right)))
}
}
else if ((is.null(legend)) || (query_legend == tolower("none"))) {
pushViewport(viewport(layout = grid.layout(100, matrix_and_mainbar_right)))
}
# Modified
vp = UpSetR:::vplayout(top:bottom, 1:(matrix_and_mainbar_right-matrix_and_mainbar_left))
pushViewport(vp)
grid.draw(arrangeGrob(Main_bar_plot, Matrix_plot, heights = hratios))
popViewport()
# Modified
vp = UpSetR:::vplayout(size_plot_height:bottom, (matrix_and_mainbar_right-matrix_and_mainbar_left-1):96)
pushViewport(vp)
grid.draw(arrangeGrob(Size_plot))
popViewport()
if (!is.null(set_metadata)) {
for (i in 1:length(set_metadata_plots)) {
if (i != 1) {
metadata_left <- 1 + metadata_right
metadata_right <- metadata_right + set_metadata$plots[[i]]$assign
}
else {
metadata_left <- 1
metadata_right <- set_metadata$plots[[i]]$assign
}
vp = UpSetR:::vplayout(size_plot_height:bottom, metadata_left:metadata_right)
pushViewport(vp)
grid.draw(arrangeGrob(set_metadata_plots[[i]]))
popViewport()
}
}
if ((!is.null(legend)) && (query_legend != tolower("none"))) {
vp = UpSetR:::vplayout(legend_top:legend_bottom, matrix_and_mainbar_left:matrix_and_mainbar_right)
pushViewport(vp)
grid.draw(arrangeGrob(legend))
popViewport()
}
}
Make_size_plot <- function (Set_size_data, sbar_color, ratios, ylabel, scale_sets,
text_scale, set_size_angle, set_size.show, set_size.scale_max,
set_size.number_size) {
if (length(text_scale) > 1 && length(text_scale) <= 6) {
x_axis_title_scale <- text_scale[3]
x_axis_tick_label_scale <- text_scale[4]
}
else {
x_axis_title_scale <- text_scale
x_axis_tick_label_scale <- text_scale
}
if (ylabel == "Set Size" && scale_sets != "identity") {
ylabel <- paste("Set Size", paste0("( ",
scale_sets, " )"))
if (scale_sets == "log2") {
Set_size_data$y <- log2(Set_size_data$y)
}
if (scale_sets == "log10") {
Set_size_data$y <- log10(Set_size_data$y)
}
}
if (!is.null(set_size.number_size)) {
num.size <- (set_size.number_size/2.845276) * x_axis_tick_label_scale
}
else {
num.size <- (7/2.845276) * x_axis_tick_label_scale
}
Size_plot <- (ggplot(data = Set_size_data, aes_string(x = "x",
y = "y")) + geom_bar(stat = "identity", colour = sbar_color,
width = 0.4, fill = sbar_color, position = "identity") +
scale_x_continuous(limits = c(0.5, (nrow(Set_size_data) +
0.5)), breaks = c(0, max(Set_size_data)), expand = c(0,
0)) + theme(panel.background = element_rect(fill = "white"),
plot.margin = unit(c(-0.11, -1.3, 0.5, 0.5), "lines"),
axis.title.x = element_text(size = 8.3 * x_axis_title_scale),
axis.text.x = element_text(size = 7 * x_axis_tick_label_scale,
vjust = 1, hjust = 0.5), axis.line = element_line(colour = "gray0"),
axis.line.y = element_blank(), axis.line.x = element_line(colour = "gray0",
size = 0.3), axis.text.y = element_blank(), axis.ticks.y = element_blank(),
panel.grid.minor = element_blank(), panel.grid.major = element_blank()) +
xlab(NULL) + ylab(ylabel) + coord_flip())
if (set_size.show == TRUE) {
Size_plot <- (Size_plot + geom_text(aes(label = y, vjust = 0.5,
hjust = 1.2, angle = set_size_angle), size = num.size))
}
if (scale_sets == "log10") {
if (!is.null(set_size.scale_max)) {
Size_plot <- (Size_plot + scale_y_continuous(limits = c(set_size.scale_max,
0), trans = log10_reverse_trans()))
}
else {
Size_plot <- (Size_plot + scale_y_continuous(trans = log10_reverse_trans()))
}
}
else if (scale_sets == "log2") {
if (!is.null(set_size.scale_max)) {
Size_plot <- (Size_plot + scale_y_continuous(limits = c(set_size.scale_max,
0), trans = log2_reverse_trans()))
}
else {
Size_plot <- (Size_plot + scale_y_continuous(trans = log2_reverse_trans()))
}
}
else {
if (!is.null(set_size.scale_max)) {
Size_plot <- (Size_plot + scale_y_continuous(limits = c(set_size.scale_max,
0), trans = "reverse"))
}
else {
# Modified
#Size_plot <- (Size_plot + scale_y_continuous(trans = "reverse"))
}
}
Size_plot <- ggplot_gtable(ggplot_build(Size_plot))
return(Size_plot)
}
assignInNamespace(x="NoAttBasePlot", value=NoAttBasePlot, ns="UpSetR")
assignInNamespace(x="Make_size_plot", value=Make_size_plot, ns="UpSetR")
movies <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"),
header=TRUE, sep=";")
upset(movies, nsets = 7, nintersects = 30, mb.ratio = c(0.5, 0.5),
order.by = c("freq", "degree"), decreasing = c(TRUE,FALSE))

Marco Sandri
- 23,289
- 7
- 54
- 58
-
That works perfectly. However, there is still one challenge. The set names (Adventure, Horror, ....) are still on the left side. – Alemu Assefa Sep 28 '19 at 14:10
-
@AlemuAssefa OK. I will try to move set names of the right side. – Marco Sandri Sep 28 '19 at 16:39