this.is.not.a.nick
this.is.not.a.nick

Reputation: 2701

Change text color for single facets in ggplot2

I have created the plot below with these commands:

ggplot(long.data, aes(owner,value)) + stat_summary(fun.y=mean,geom="bar",
       fill=c("deepskyblue","deepskyblue4")) + 
       stat_summary(fun.data=mean_cl_normal,geom="errorbar",position=
       position_dodge(width=.90),width=.1) +
       labs(x="",y="") + facet_grid(IV~experiment+type,scales="free_y") + 
       theme(strip.text.y = element_text(colour = 'red4'))

If I want to change the text color (and possibly also the background color) for only the upper x facet (in this case 'Implicit' and 'Explicit' levels), how can I do that? Is it possible? I have not read nothing about that in the ggplot2 documentation.

plot

EDIT: I'm sorry for the confusion. My aim is to change the text and background color of one of the upper strips, not the color of the facet.

Upvotes: 5

Views: 6673

Answers (3)

jaystruly
jaystruly

Reputation: 1

There's a cool library called "ggh4x" which allows for better handling of strip labels. Check this answer. You have to manually set a list of aesthetics (let that be color, font, size etc) through strip_themed() function. Then add the list to the ggh4x::facet_grid2() or ggh4x::facet_wrap2() functions via the "strip" argument.

Edit: addition of an example as requested in the comments:

library(tidyverse)

library(ggh4x)

 strip <- strip_themed(background_x = elem_list_rect(fill = c("#00000000", "#00000000", "#49d278", "#49d278", "red")), #strip background

                       text_x=elem_list_text(face = c("bold", "italic", "plain", "plain", "plain"))) #strip text
 
diamonds|> ggplot(aes(x=price, y=carat))+
geom_point()+
scale_x_continuous(labels=scales::label_number_si())+
facet_grid2(~cut, strip=strip) 

Resulting plot

Upvotes: -1

SlowLearner
SlowLearner

Reputation: 7997

You want to change the attributes of the strip element, not the facet. Try something like the code below. Note that this is a minimal example based on fake data made up at random, as you did not provide your own data for us to work with. You'll have to adapt the code to your needs.

require(reshape)
require(ggplot2)
require(scales)

# fake data
mydf <- data.frame(val1 = runif(10, 0, 1), val2 = runif(10, 0, 1))
mydf

# reshape to long format
long.data <- melt(mydf)
long.data$facetvar <- "implicit"
long.data$facetvar[seq(1, 19, 2)] <- "explicit"
long.data

# plot
ggplot(long.data, aes(y = value, x = variable)) +
    geom_bar(position = 'dodge', stat = "identity") +
    facet_wrap (~ facetvar) +
    theme(strip.background = element_rect(fill = alpha('green', 0.3))) +
    theme(strip.text.x = element_text(colour = 'blue', size = 10))

This produces a plot like this: screenshot

Upvotes: 6

Michele
Michele

Reputation: 8753

I get a warning... but this seems a good starting point for a more elegant solution:

ggplot(mtcars) + geom_rect(data = subset(mtcars, cyl == 4), aes(fill = cyl),xmin = -inf,xmax = Inf, ymin = -Inf,ymax = Inf, alpha = 0.05) +
  geom_point(aes(mpg, wt)) +  facet_grid(. ~ cyl)

enter image description here

Upvotes: 4

Related Questions