Creating multi column legend in ggplot
you must assign the guide to the correct aesthetic and you used fill:
guides(fill=guide_legend(ncol=2))
And you should take care of the warning with geom_bar
How to put ggplot2 legend in two columns for an area plot
You are referring to the wrong guide.
Q1 + guides(fill=guide_legend(ncol=2))
ggplot2: Divide Legend into Two Columns, Each with Its Own Title
You can shift the "Very Good" category to the second column of the legend by adding a dummy factor level and setting its colour to white in the legend, so that it can't be seen. In the code below, we add a blank factor level between "Good" and "Very Good", so now we have six levels. Then, we use scale_fill_manual
to set the color of this blank level to "white". drop=FALSE
forces ggplot
to keep the blank level in the legend. There might be a more elegant way to control where ggplot
places the legend values, but at least this will get the job done.
diamonds$cut = factor(diamonds$cut, levels=c("Fair","Good"," ","Very Good",
"Premium","Ideal"))
ggplot(diamonds, aes(color, fill=cut)) + geom_bar() +
scale_fill_manual(values=c(hcl(seq(15,325,length.out=5), 100, 65)[1:2],
"white",
hcl(seq(15,325,length.out=5), 100, 65)[3:5]),
drop=FALSE) +
guides(fill=guide_legend(ncol=2)) +
theme(legend.position="bottom")
UPDATE: I'm hoping there's a better way to add titles to each group in the legend, but the only option I can come up with for now is to resort to grobs, which always gives me a headache. The code below is adapted from the answer to this SO question. It adds two text grobs, one for each label, but the labels have to be positioned by hand, which is a huge pain. The code for the plot also has to be modified to create more room for the legend. In addition, even though I've turned off clipping for all grobs, the labels are still clipped by the legend grob. You can position the labels outside of the clipped area, but then they're too far from the legend. I'm hoping someone who really knows how to work with grobs can fix this and more generally improve upon the code below (@baptiste, are you out there?).
library(gtable)
p = ggplot(diamonds, aes(color, fill=cut)) + geom_bar() +
scale_fill_manual(values=c(hcl(seq(15,325,length.out=5), 100, 65)[1:2],
"white",
hcl(seq(15,325,length.out=5), 100, 65)[3:5]),
drop=FALSE) +
guides(fill=guide_legend(ncol=2)) +
theme(legend.position=c(0.5,-0.26),
plot.margin=unit(c(1,1,7,1),"lines")) +
labs(fill="")
# Add two text grobs
p = p + annotation_custom(
grob = textGrob(label = "First\nGroup",
hjust = 0.5, gp = gpar(cex = 0.7)),
ymin = -2200, ymax = -2200, xmin = 3.45, xmax = 3.45) +
annotation_custom(
grob = textGrob(label = "Second\nGroup",
hjust = 0.5, gp = gpar(cex = 0.7)),
ymin = -2200, ymax = -2200, xmin = 4.2, xmax = 4.2)
# Override clipping
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip <- "off"
grid.draw(gt)
And here's the result:
R - split legend in two columns
From this post here is a solution to get a multi-colum legend:
p <- dat %>%
gather("variable", "value", -FunctionClass, -legend) %>%
ggplot(aes(FunctionClass, value, fill = legend, group = variable)) +
geom_bar(stat="identity", position=position_dodge(), colour="seashell") +
xlab("COG Class") +
guides(fill=guide_legend(ncol=2)) # adjust the number of columns with ncol = xxx and be sure to use the right aes (fill, color, etc)
p + theme(legend.position="bottom")
Related Topics
Ggplot: Adding Regression Line Equation and R2 with Facet
Make R Exit with Non-Zero Status Code
Selecting a Subset of Columns in a Data.Table
How to Calculate the Probability for a Given Quantile in R
Filling in Missing (Blanks) in a Data Table, Per Category - Backwards and Forwards
Using R to Download Gzipped Data File, Extract, and Import Data
Extract File Extension from File Path
How to Resolve Spherical Geometry Failures When Joining Spatial Data
Relocating Alaska and Hawaii on Thematic Map of the Usa with Ggplot2
Select Na in a Data.Table in R
Using Un-Exported Function from Another R Package
Create Binary Column (0/1) Based on Condition in Another Column
Convert Many Formats of Date-Time to One Standard Format
How to Apply a Function to a Certain Column for All the Data Frames in Environment in R
How to Convert a Date from a Character String
Messy Plot When Plotting Predictions of a Polynomial Regression Using Lm() in R
Xpath and Namespace Specification for Xml Documents with an Explicit Default Namespace