ggplot2之主题设置#

ggplot2中的theme elements 语法

theme(element_name = element_function())
Error in theme(element_name = element_function()): 没有"theme"这个函数
Traceback:

这里element_function()有四个

  • element_text(), 文本,一般用于控制标签和标题的字体风格

  • element_line(), 线条,一般用于控制线条或线段的颜色或线条类型

  • element_rect(), 矩形区域,一般用于控制背景矩形的颜色或者边界线条类型

  • element_blank(), 空白,就是不分配相应的绘图空间,即删去这个地方的绘图元素。

library(tidyverse)
── Attaching core tidyverse packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
 dplyr     1.1.4      readr     2.1.5
 forcats   1.0.0      stringr   1.5.1
 ggplot2   3.5.0      tibble    3.2.1
 lubridate 1.9.3      tidyr     1.3.1
 purrr     1.0.2     
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
 dplyr::filter() masks stats::filter()
 dplyr::lag()    masks stats::lag()
 Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
glimpse(mpg)
Rows: 234
Columns: 11
$ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "audi", "…
$ model        <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 quattro", "…
$ displ        <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0, 2.…
$ year         <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999, 200…
$ cyl          <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, …
$ trans        <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)", "auto…
$ drv          <chr> "f", "f", "f", "f", "f", "f", "f", "4", "4", "4", "4", "4…
$ cty          <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 17, 1…
$ hwy          <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 25, 2…
$ fl           <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p…
$ class        <chr> "compact", "compact", "compact", "compact", "compact", "c…
df <- mpg %>% 
  as_tibble() %>% 
  filter(class != "2seater", manufacturer %in% c("toyota", "volkswagen"))
df %>% head()
A tibble: 6 × 11
manufacturermodeldisplyearcyltransdrvctyhwyflclass
<chr><chr><dbl><int><int><chr><chr><int><int><chr><chr>
toyota4runner 4wd2.719994manual(m5)41520rsuv
toyota4runner 4wd2.719994auto(l4) 41620rsuv
toyota4runner 4wd3.419996auto(l4) 41519rsuv
toyota4runner 4wd3.419996manual(m5)41517rsuv
toyota4runner 4wd4.020086auto(l5) 41620rsuv
toyota4runner 4wd4.720088auto(l5) 41417rsuv
df %>% 
  ggplot(aes(x = displ, y = hwy, color = factor(cyl)))+
  geom_point()+
  facet_grid(vars(manufacturer), vars(class))+
  ggtitle("This is my title")+
  labs(x = "x_displ", y = "y_hwy")
../_images/f36d6e1949e3aa2c77f84b1a091aac36e21af8744a1a83b263ae962e2f7ca704.png

1 图表整体元素#

图表整体元素包括:

描述

主题元素

类型

整个图形背景

plot.background

element_rect()

图形标题

plot.title

element_text()

图形边距

plot.margin

margin()

df %>% 
  ggplot(aes(x = displ, y = hwy, color = factor(cyl)))+
  geom_point()+
  facet_grid(vars(manufacturer), vars(class))+
  ggtitle("This is my title")+
  labs(x = "x_displ", y = "y_hwy")+
  theme(plot.background = element_rect(fill = "orange", color = "black", size = 10),
        plot.title = element_text(hjust = 1, color = "red", face = "italic"),
        plot.margin = margin(t = 29, r = 20, b = 20, l = 20, unit = "pt"))
Warning message:
“The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
 Please use the `linewidth` argument instead.”
../_images/15d0e6a9d532bf0a40089fba76963d1e11eacd482f16944fdd569494185dc577.png

2 坐标轴元素#

坐标轴元素包括:

描述

主题元素

类型

坐标轴刻度

axis.ticks

element_line()

坐标轴标题

axis.title

element_text()

坐标轴标签

axis.text

element_text()

直线和坐标轴

axis.line

element_line()

df %>% 
  ggplot(aes(x = displ, y = hwy, color = factor(cyl)))+
  geom_point()+
  facet_grid(vars(manufacturer), vars(class))+
  ggtitle("This is my title")+
  labs(x = "x_displ", y = "y_hwy")+
  theme(axis.line = element_line(color = "orange", size = 2),
        axis.title = element_text(color = "red", face = "italic"),
        axis.ticks = element_line(color = "purple", size = 3),
        axis.text = element_text(color = "blue"),
        axis.text.x = element_text(angle = 45, hjust = 1))
Warning message:
“The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
 Please use the `linewidth` argument instead.”
../_images/db3c4d7e3e63a5b0c13ac13e9322fd15a24fd5f64ccd06f532bf492c4172e7ef.png

3 面板元素#

注意!!!这与背景是有区别的

面板元素包括:

描述

主题元素

类型

面板背景

panel.background

element_rect()

面板网格线

panel.grid

element_line()

面板边界

panel.border

element_rect()

df %>%
  ggplot(aes(x = displ, y = hwy, color = factor(cyl))) +
  geom_point() +
  facet_grid(vars(manufacturer), vars(class)) +
  ggtitle("This is my title") +
  labs(x = "x_displ", y = "y_hwy") +
  theme(panel.background = element_rect(fill = "orange", color = "red"),
        panel.grid = element_line(color = "white", size = 0.5))
../_images/8b130b046f7ae7b652250711b0df6545c50723d7bd88b72b288287fea444580e.png

或者

df %>%
  ggplot(aes(x = displ, y = hwy, color = factor(cyl))) +
  geom_point() +
  facet_grid(vars(manufacturer), vars(class)) +
  ggtitle("This is my title") +
  labs(x = "x_displ", y = "y_hwy") +
  theme(
    panel.background = element_rect(fill = "orange"),
    panel.grid = element_line(color = "grey80", size = 0.5),
    panel.border = element_rect(color = "red", fill = NA)
  )
../_images/45616009601cab08ac7a0aa0609a09e01544c99e51896a629e7f4537cfe33c4a.png

4 图例元素#

图例元素包括:

描述

主题元素

类型

图例背景

legend.background

element_rect()

图例符号

legend.key

element_rect()

图例标签

legend.text

element_text()

图例标题

legend.title

element_text()

图例边距

legend.margin

margin

图例位置

legend.postion

“top”, “bottom”, “left”, “right”

df %>%
  ggplot(aes(x = displ, y = hwy, color = factor(cyl))) +
  geom_point() +
  facet_grid(vars(manufacturer), vars(class)) +
  ggtitle("This is my title") +
  labs(x = "x_displ", y = "y_hwy") +
  theme(legend.background = element_rect(fill = "orange"),
        legend.title = element_text(color = "blue", size = 10),
        legend.key = element_rect(fill = "grey80"),
        legend.text = element_text(color = "red"),
        legend.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt"),
        legend.position = "bottom")
../_images/7814fc0715a3c25a38d8c7f113ac100bc2c9eaf9e7c1644672c4df938d3596c1.png

5 分面元素#

分面元素包括:

描述

主题元素

类型

分面标签背景

strip.background

element_rect()

条状文本

strip.text

element_text()

分面间隔

panel.spacing

unit

df %>%
  ggplot(aes(x = displ, y = hwy, color = factor(cyl))) +
  geom_point() +
  facet_grid(vars(manufacturer), vars(class)) +
  ggtitle("This is my title") +
  labs(x = "x_displ", y = "y_hwy") +
  theme(strip.background = element_rect(fill = "orange"),
        strip.text = element_text(color = "red"),
        panel.spacing = unit(0.3, "inch"))
../_images/b3df70735177c959fd97cca51fd6bc7ea33875af98f05a8959153a9834a5ec8a.png

6 案例#

diamonds %>% 
  ggplot(aes(carat, price))+
  geom_bin_2d()+
  labs(title = "Diamond")+
  theme(axis.title.x = element_text(size = 30, color = "red",
                                    face = "bold", angle = 10),
        legend.title = element_text(size = 25, color = "#ff6361",
                                    margin = margin(b = 5)),
        plot.title = element_text(size = 25, face = "bold", color = "blue"))
../_images/bb9850f3e9ed4dcd32f32f235a5d4ee306bf6077394b37a392c3410567ac2ed8.png
library(palmerpenguins)
penguins %>% 
  ggplot(aes(bill_length_mm, bill_depth_mm))+
  geom_point()+
  theme(axis.line.y = element_line(color = "black", size = 1.2, 
                                   arrow = grid::arrow()),
        axis.line.x = element_line(color = "brown", size = 1.2,
                                   linetype = "dashed"),
        axis.ticks = element_line(color = "red", size = 1.1),
        axis.ticks.length = unit(3, "mm"),
        panel.grid.minor = element_line(color = "#58508d", size = 1.2,
                                        linetype = "dotted"), 
        panel.grid.major = element_line(color = "blue", size = 1.2))
Warning message:
“Removed 2 rows containing missing values or values outside the scale range (`geom_point()`).”
../_images/b0bf70347cdff4684087932d19bc87e778a9711c2a12960e457921570993e5c0.png
penguins %>% 
  ggplot(aes(bill_length_mm, bill_depth_mm)) +
  geom_point(aes(color = species)) +
  theme(legend.background = element_rect(fill = "#fff6c2", color = "black",
                                         linetype = "dashed"),
        legend.key = element_rect(fill = "grey", color = "brown"),
        panel.background = element_rect(fill = "#005F59", color = "red",
                                        size = 3),
        panel.border = element_rect(color = "black", fill = "transparent",
                                    linetype = "dashed", size = 3),
        plot.background = element_rect(fill = "#a1dce9", color = "black",
                                       size = 3),
        legend.position = "bottom")
Warning message:
“Removed 2 rows containing missing values or values outside the scale range (`geom_point()`).”
../_images/ae12eda4e07d27033a8b501142225cd937c2aa7d4df267b2a6d6718910cd622c.png

7 小结#

image.png

8 主题风格#

当然可以使用自带的主题风格

ggplot有很多自带的theme,其拓展包ggthemes增加了更多的theme

thms <- list.files(path = "imags/img", pattern = "built-in", full.names = T)
knitr::include_graphics(thms)
character(0)
attr(,"class")
[1] "knit_image_paths" "knit_asis"       
penguins %>% 
  ggplot(aes(x = bill_depth_mm, y = bill_length_mm))+
  geom_point()+
  theme_minimal()
Warning message:
“Removed 2 rows containing missing values or values outside the scale range (`geom_point()`).”
../_images/76aa642deb2314ec03fcabd2bd452054ee452fe6395abbf33fe5fff21ac31301.png
penguins %>% 
  ggplot(aes(x = bill_depth_mm, y = bill_length_mm))+
  geom_point()+
  theme_bw()+
  theme(text = element_text(family = "serif", size = 20),
        panel.grid = element_blank(),
        panel.border = element_rect(color = "black", size = 1.2),
        axis.ticks = element_line(size = 1, color = "black"),
        axis.ticks.length = unit(2, "mm"))
Warning message:
“Removed 2 rows containing missing values or values outside the scale range (`geom_point()`).”
../_images/9c17a4a06b6bd72ab2c33b19f5fd6a28d668d62eef49bcf60980ed9bbbec4be8.png

当然,ggthemes宏包也提供了很多优秀的主题风格

# install.packages("ggthemes")
library(ggthemes)
penguins %>% 
  ggplot(aes(x = bill_depth_mm, y = bill_length_mm))+
  geom_point()+
  ggthemes::theme_economist()
Warning message:
“Removed 2 rows containing missing values or values outside the scale range (`geom_point()`).”
../_images/36d69791230917cab4d0365e6ec022c74b347b10975288b7400e6d05c1011efd.png
gapdata <- read_csv("./demo_data/gapminder.csv")
Rows: 1704 Columns: 6
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): country, continent
dbl (4): year, lifeExp, pop, gdpPercap
 Use `spec()` to retrieve the full column specification for this data.
 Specify the column types or set `show_col_types = FALSE` to quiet this message.
gapdata %>% 
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent))+
  geom_point()+
  geom_smooth(lwd = 3, se = FALSE, method = "lm")+
  theme_grey() # 默认为这个
`geom_smooth()` using formula = 'y ~ x'
../_images/42c8a6966f2692be510f2facb88fb09eb0a4173b6f5ff219c7032940c63a6b70.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  theme_bw()
`geom_smooth()` using formula = 'y ~ x'
../_images/bf9e26fc7f62d2a9a235e6b6414708113c363d2a10d4236931df789e95cab651.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  ggthemes::theme_calc()+
  ggtitle("ggthemes::theme_calc()")
`geom_smooth()` using formula = 'y ~ x'
../_images/58681f6e87150b117a4f0e96c209f18c51f51cf14b66bb6c2dbeebf3d64a6d88.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  ggthemes::theme_few()+
  ggtitle("ggthemes::theme_few()")
`geom_smooth()` using formula = 'y ~ x'
../_images/e243bff10558c443b269a2c11261af7d65cce6f62c02bdb3b22ab14e7574ceb9.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  ggthemes::theme_economist()+
  ggtitle("ggthemes::theme_economic()")
`geom_smooth()` using formula = 'y ~ x'
../_images/86cc830830a83b4d287fa1f766416ea99427397a8add06754e2f771525da1720.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  ggthemes::theme_economist_white()+
  ggtitle("ggthemes::theme_economist_white()")
`geom_smooth()` using formula = 'y ~ x'
../_images/272b6d1762e4d2f2742b77748fb463ce5fefd31d4c49ee60afbef2855e2c6d56.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  ggthemes::theme_gdocs()+
  ggtitle("ggthemes::theme_gdocs()")
`geom_smooth()` using formula = 'y ~ x'
../_images/2a9debdb93d976a78478ea519b6357db61b507b48b18d044f7026607d71f8023.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  ggthemes::theme_tufte()+
  ggtitle("ggthemes::theme_tufte()")
`geom_smooth()` using formula = 'y ~ x'
../_images/e29b6ef08fb89f85da5d0b7e67034f8bd92367887092c108557d0a82b20acc49.png
gapdata %>%
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) +
  geom_point() +
  geom_smooth(lwd = 3, se = FALSE, method = "lm") +
  ggthemes::theme_wsj()+
  ggtitle("ggthemes::theme_wsj()")
`geom_smooth()` using formula = 'y ~ x'
../_images/b2515fa5c35c5c8a1e14fd67ca6b7f965739f8f0fdf84d6cedfd444ba1c7d732.png