Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
259 views
in Technique[技术] by (71.8m points)

r - Panel background color by column in plot matrix, ggplot2

I want to make a matrix of plots, with the background color coded to correspond with particular columns (i.e., I want the colors I want, and in a particular sequence).


I used info from here Conditionally change panel background with facet_grid? to come up with a way to color code background colors, by column, in a matrix of plots in ggplot2, running in RStudio.

But, previously I had been working with some colorblind colors (I'm not colorblind though), and I can't for the life of me get those colors to change to a new set of colors, even when I clear objects from the global environment in RStudio, then reopen the R script in a new RStudio session. Somehow, by old colors are still remembered.

What I see as output (as a JPG image file) is https://drive.google.com/file/d/1I_5GJHOW8VPZShJ4C61Uayo8zrEMPCDZ/ - you will certainly get other colors when running my code.

Two Questions:

  1. How can I control those colors/assign particular colors to climate$elevation levels?
  2. The approach I've used seems to mask my gridlines within plots - at the bottom of my code you can see I tried to add the gridlines back using 'theme' but it does not work, or is behind the colors of elevation level. Is there a better way to do this?

Here is my code:

# install.packages("ggplot2")
library(ggplot2)

#### create Data ####
#####################
temperature<-c(12,43,15,8,7,9,12,15,14,10,34,27,10,12,33,11,15,7,9,12,25,14,9,10,34,37,10,12,33,15,8,7,9,12,15,14,10,34,37,10,12,33,11,15,7,9,12,15,14,9,10,34,37,10,12,33,15,8,7,9,12,15,14,10,34,37,10,12,33,11,15,7,9,12,15,14,9,10,34,37,10,12,15,14,9,36,10,34,37,10)
hour<-c(2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12)
elevation<-c("Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast","Alpine","Montane","Steppe","Valley","Coast")
region<-c("Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America","Europe","N America","S America")
climate<-data.frame(region,elevation,hour,temperature) # create data frame

# Ensures sequence corresponds to sequence of cave zones
climate$elevation <-factor(climate$elevation,
                      levels = c('Alpine','Montane','Steppe','Valley','Coast'),order=TRUE)

# create plot matrix, background colored by elevation
base<-ggplot(data = climate, aes(hour, temperature)) +
  geom_rect(aes(fill = elevation),xmin = -Inf,xmax = Inf, ymin = -Inf,ymax = Inf,alpha = 0.3) +
  geom_line(color = "steelblue", size = 1) +
  geom_point(color="steelblue") +
  labs(title = "Elevation by Region & Time of Day",
       subtitle = "(Temperature)",
       y = "Mean Temperature", x = "Hour of Day") + 
  facet_grid(region ~ elevation)
base

###Plot looks like this to me:
https://drive.google.com/file/d/1I_5GJHOW8VPZShJ4C61Uayo8zrEMPCDZ/
# I'm certain colors will look different for you!

# Trying to add gridlines (does not work)
base + theme(
  panel.background = element_rect(fill = "transparent",colour = NA),
  plot.background = element_rect(fill = "transparent",colour = NA),
  panel.grid.major = element_line(size = 0.5, linetype = 'solid',
                                  colour = "white"), 
  panel.grid.minor = element_blank()
)

question from:https://stackoverflow.com/questions/65861717/panel-background-color-by-column-in-plot-matrix-ggplot2

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Actually I got the same colors as you. The reason is that your elevation is an ordered factor. Therefore ggplot2 by default makes use of the viridis color palette.

  1. You can set the fill colors using scale_fill_manual and e.g. a named vector of colors.

  2. There are two options for the grid lines. You can simply add the grid lines manually using geom_h/vline. Or you could set the fill for the plot and panel background to NA and make use of panel.ontop which will plot the panel and the grid lines on top of the plot.

library(ggplot2)

cols <- rev(scales::hue_pal()(5))
cols <- setNames(cols, levels(climate$elevation))
cols
#>    Alpine   Montane    Steppe    Valley     Coast 
#> "#E76BF3" "#00B0F6" "#00BF7D" "#A3A500" "#F8766D"

base <- ggplot(data = climate, aes(hour, temperature)) +
  geom_rect(aes(fill = elevation), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) +
  scale_fill_manual(values = cols) +
  geom_line(color = "steelblue", size = 1) +
  geom_point(color = "steelblue") +
  labs(
    title = "Elevation by Region & Time of Day",
    subtitle = "(Temperature)",
    y = "Mean Temperature", x = "Hour of Day"
  ) +
  facet_grid(region ~ elevation)

breaks_x <- seq(2.5, 10, 2.5)
breaks_y <- seq(10, 40, 10)

base +
  geom_vline(xintercept = breaks_x, color = "white", size = 0.5) +
  geom_hline(yintercept = breaks_y, color = "white", size = 0.5) +
  scale_x_continuous(breaks = breaks_x) +
  scale_y_continuous(breaks = breaks_y)

# Trying to add gridlines (does not work)
base + theme(
  panel.background = element_rect(fill = NA, colour = NA),
  plot.background = element_rect(fill = NA, colour = NA),
  panel.grid.major = element_line(
    size = 0.5, linetype = "solid",
    colour = "white"
  ),
  panel.ontop = TRUE,
  panel.grid.minor = element_blank()
)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...