ggplot2作图最全教程(上)

ggplot2作图最全教程(上)

2015年,我开始在组会上汇报自己的实验结果,也是从那时开始使用ggplot2来可视化我的数据。我不太喜欢R base的语法和风格,所以我很快就爱上了ggplot。特别有用的是它的facet函数。最近偶然间看到了Dr. Cédric Scherer写的一篇博客A GGPLOT2 TUTORIAL FOR BEAUTIFUL PLOTTING IN R,原文博客为 cedricscherer.com/2019/ ,系统地展示了ggplot2的特性,非常喜欢,现在特意翻译成中文,希望更多的人可以看到,作出漂亮的图表。

如果觉得有用,麻烦记得点一下赞,让更多希望做出漂亮图表的人看到,这也是我写下去的动力。

内容目录

  • 准备
  • 数据集
  • ggplot2包
  • 调整坐标轴
  • 调整图表标题
  • 调整图例(legend)
  • 调整背景和网格线(background & grid line)
  • 调整页边距
  • 做多面板图
  • 调整颜色
  • 调整主题
  • 调整线
  • 调整文本
  • 调整坐标
  • 调整图表类型
  • 调整条带
  • 调整平滑线
  • 做互作图

图片overview

准备

你需要安装以下包来执行代码,完成整个教程。

ggplot2, tidyverse, colorspace, corrr, cowplot, ggdark, ggforce, ggrepel, ggridges, ggsci, ggtext, ggthemes, grid, gridExtra, pathwork, rcarocolor, sicco, showtext, shiny.

交互图表还会用到以下包:

charter, echart4r, ggiraph, highcharter, plotly

# install CRAN packages
install.packages(c("tidyverse", "colorspace", "corrr",  "cowplot",
                   "ggdark", "ggforce", "ggrepel", "ggridges", "ggsci",
                   "ggtext", "ggthemes", "grid", "gridExtra", "patchwork",
                   "rcartocolor", "scico", "showtext", "shiny",
                   "plotly", "highcharter", "echarts4r"))
# install from GitHub since not on CRAN
install.packages(devtools)
devtools::install_github("JohnCoene/charter")


数据集

我们在本教程中使用来自空气污染致发病率和死亡率研究(nmaps)的数据。为了使作图易于管理,我们将数据限制在芝加哥1997-2000年间。关于这个数据集的更多细节,请参考Roger Peng的书《环境流行病学中的统计方法》。

我们可以使用readr包中read_csv()函数将数据导入到R中。为了以后访问数据,我们使用赋值箭头<-将数据存储在一个名为chic的变量中。

文中的数据集链接已经失效,评论区下面知友郭晋生提供的链接可以下载得到:

chic <- readr::read_csv("https://raw.githubusercontent.com/Z3tt/R-Tutorials/master/ggplot2/chicago-nmmaps.csv")
tibble::glimpse(chic)
head(chic, 10)
## # A tibble: 10 x 10
##    city  date       death  temp dewpoint  pm10    o3  time season  year
##    <chr> <date>     <dbl> <dbl>    <dbl> <dbl> <dbl> <dbl> <chr>  <dbl>
##  1 chic  1997-01-01   137  36      37.5  13.1   5.66  3654 Winter  1997
##  2 chic  1997-01-02   123  45      47.2  41.9   5.53  3655 Winter  1997
##  3 chic  1997-01-03   127  40      38    27.0   6.29  3656 Winter  1997
##  4 chic  1997-01-04   146  51.5    45.5  25.1   7.54  3657 Winter  1997
##  5 chic  1997-01-05   102  27      11.2  15.3  20.8   3658 Winter  1997
##  6 chic  1997-01-06   127  17       5.75  9.36 14.9   3659 Winter  1997
##  7 chic  1997-01-07   116  16       7    20.2  11.9   3660 Winter  1997
##  8 chic  1997-01-08   118  19      17.8  33.1   8.68  3661 Winter  1997
##  9 chic  1997-01-09   148  26      24    12.1  13.4   3662 Winter  1997
## 10 chic  1997-01-10   121  16       5.38 24.8  10.4   3663 Winter  1997


ggplot2包

ggplot2是一个基于图形语法的声明式创建图形的系统。你提供数据,告诉ggplot2如何将变量映射到美学(aesthetic),使用什么图形原语,然后它负责处理细节

ggplot由几个基本元素构成:

  1. 数据:作图用的原始数据
  2. 几何图形 geom_:表示数据的几何形状
  3. 美学 aes(): 几何或者统计对象的美学,比如位置,颜色,大小,形状等
  4. 刻度 scale_(): 数据与美学维度之间的映射,比如图形宽度的数据范围,
  5. 统计转换 stat_: 数据的统计,比如百分位,拟合曲线或者和
  6. 坐标系统 coord_: 数据的转换
  7. 面 facet_: 数据图表的排列
  8. 主题 theme(): 图形的整体视觉默认值,如背景、网格、轴、默认字体、大小和颜色
library(ggplot2)
library(tidyverse)

ggplot2的语法与base r不同。根据基本元素,默认的ggplot需要指定三样东西: 数据,美学和几何形状。我们总是通过调用ggplot(data = df)来定义绘图对象,它只告诉ggplot2我们将处理该数据。在大多数情况下,你可能希望绘制两个变量——一个在x轴上,一个在y轴上,这些是位置美学,因此我们将aes(x = var1, y = var2)添加到ggplot()调用中(是的,aes()代表美学,放到aes内的变量,代表数据变量到位置美学的映射)。然而,也有一些情况需要指定一个甚至三个或更多的变量。

我们在aes()外部指定数据,即chic,并将映射到美学的数据变量(即date和temp)添加到aes()内部

g <- ggplot(chic, aes(x = date, y = temp))

当运行时,只会创建一个面板。为什么?这是因为ggplot2不知道我们要如何绘制数据——我们仍然需要提供一个几何图形!

gplot2允许你将当前ggobject赋值给一个变量(在我们的例子中称为g)。稍后你可以通过添加其他层来扩展这个ggobject,要么一次性添加所有层,要么将其赋值给同一个或另一个变量。

有很多很多不同的几何图形(称为geoms,因为每个函数通常都以geom_开头),默认情况下可以添加到ggplot中,扩展包甚至提供更多的几何图形。让我们告诉ggplot2我们想使用哪种图形,例如通过添加geom_point()来创建散点图:

g + geom_point()

好了!但这些数据也可以被可视化为线形图(不是最优的,但人们总是这样做)。所以我们只需要添加geom_line():

你还可以组合几个几何层——这就是魔法和乐趣的开始!

g + geom_line() + geom_point()

调整几何图形的属性:

在geom_*命令中,你可以操作视觉美学,如点的颜色、形状和大小。让我们把所有的点转换成大的火红色钻石!

g + geom_point(color = "firebrick", shape = "diamond", size = 2)

注意:你可以使用预设颜色或十六进制颜色代码,甚至可以使用RGB()函数来使用RGB/RGBA颜色。

每个geom都有自己的属性(称为参数),相同的参数可能导致不同的变化,这取决于你使用的geom。

g + geom_point(color = "firebrick", shape = "diamond", size = 2) +
    geom_line(color = "firebrick", linetype = "dotted", size = .3)

替换默认的ggplot2主题

为了进一步说明ggplot的多用途性,让我们通过设置一个不同的内置主题(例如theme_bw())来摆脱灰色的默认ggplot2外观——通过调用theme_set()。

theme_set(theme_bw())
g + geom_point(color = "firebrick")

我们还将使用theme()函数来定制主题的特定元素。你还可以找到更多关于如何使用内置主题和如何自定义主题的信息。

调整坐标轴

改变坐标轴的title

让我们给坐标轴加上一些很好的标签。为此我们添加了labs(),为我们想要更改的每个标签提供一个字符串(这里是x和y)。你也可以通过xlab()和ylab() 来改变坐标轴title:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)")
ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  xlab("Year") +
  ylab("Temperature (°F)")

通常你也可以通过添加符号本身来指定符号(这里是“°”),但下面的代码不仅允许添加符号,还可以添加上标:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = expression(paste("Temperature (", degree ~ F, ")"^"(Hey, why should we use metric units?!)")))

增加轴和轴标题之间的空间

Theme()是修改特定主题元素(文本、标题、框、符号、背景等)的必要命令。我们将会经常用到它们! 现在我们将修改文本元素。我们可以通过在theme()调用中重写默认的element_text()来改变所有或特定文本元素的属性(这里是axis标题):

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(axis.title.x = element_text(vjust = 0, size = 15),
        axis.title.y = element_text(vjust = 2, size = 15))

vjust指的是垂直对齐,它的范围通常在0和1之间,但你也可以指定该范围之外的值。注意,即使我们水平移动y轴上的轴标题,我们也需要指定vjust(从标签的角度来看,这是正确的)。你也可以通过指定两个文本元素的边距来改变距离:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(axis.title.x = element_text(margin = margin(t = 10), size = 15),
        axis.title.y = element_text(margin = margin(r = 10), size = 15))

margin()对象中的标签t和r分别指代top和right。你还可以将这四个边距指定为margin(t, r, b, l)。请注意,我们现在必须更改右边边距来修改y轴上的空间,而不是底部边距。

改变轴标题的美学

同样,我们使用theme()函数并修改元素axis.title.x和axis.title.y。例如,在element_text()中,我们可以覆盖大小、颜色和外观的默认值。

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(axis.title = element_text(size = 15, color = "firebrick",
                                  face = "italic"))

face参数可用于使字体加粗或倾斜。

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(axis.title.x = element_text(color = "sienna", size = 15),
        axis.title.y = element_text(color = "orangered", size = 15))

调整坐标轴文本美学

类似地,还可以使用axis更改坐标轴文本(这里是数字)的外观。通过文本和/或附属元素axis.text.x和axis.text.y:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(axis.text = element_text(color = "dodgerblue", size = 12),
        axis.text.x = element_text(face = "italic"))

旋转坐标轴文本

指定角度可以旋转任何文本元素。使用hjust和vjust你可以在水平(0 =左,1 =右)和垂直(0 =上,1 =下)调整文本的位置:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(axis.text.x = element_text(angle = 50, vjust = 1, hjust = 1, size = 12))

删除坐标轴标题

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = NULL, y = "")

我们可以使用theme_blank(),但是通过labs()(或xlab())中删除标签要更简单。

限制坐标轴范围

有时你想要放大到更近距离地查看一些数据。你可以在不划分数据的情况下做到这一点:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  ylim(c(0, 50))

或者,您可以使用scale_y_continuous(limits = c(0,50))或coord_cartesian(ylim = c(0,50))。前者去除范围外的所有数据点,而后者调整可见区域,类似于ylim(c(0,50))。你可能会想:所以最后两者的结果是一样的。但并非如此,有一个重要的区别——比较以下两个图:

使图表从坐标原点开始

library(tidyverse)
chic_high <- dplyr::filter(chic, temp > 25, o3 > 20)
ggplot(chic_high, aes(x = temp, y = o3)) +
  geom_point(color = "darkcyan") +
  labs(x = "Temperature higher than 25°F",
       y = "Ozone higher than 20 ppb") +
  expand_limits(x = 0, y = 0)

相同比例的坐标轴

为了演示目的,让我们用一些绘制包含随机噪声的温度值与温度值的关系图。coord_equal()是一个坐标系统,其指定的比率表示y轴上的单位数与x轴上的单位数相等。默认ratio = 1,确保x轴上的一个单位与y轴上的一个单位长度相同:

ggplot(chic, aes(x = temp, y = temp + rnorm(nrow(chic), sd = 20))) +
  geom_point(color = "sienna") +
  labs(x = "Temperature (°F)", y = "Temperature (°F) + random noise") +
  xlim(c(0, 100)) + ylim(c(0, 150)) +
  coord_fixed()

高于1的比率会使y轴上的单位比x轴上的单位长,反之亦然:

ggplot(chic, aes(x = temp, y = temp + rnorm(nrow(chic), sd = 20))) +
  geom_point(color = "sienna") +
  labs(x = "Temperature (°F)", y = "Temperature (°F) + random noise") +
  xlim(c(0, 100)) + ylim(c(0, 150)) +
  coord_fixed(ratio = 1/5)

使用函数调整标签

有时稍微修改一下标签是很方便的,比如添加单位或百分号,而不在数据中直接添加这些标签。在这种情况下你可以使用一个函数:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = NULL) +
  scale_y_continuous(label = function(x) {return(paste(x, "Degrees Fahrenheit"))})

调整标题

添加标题

我们可以通过ggtitle()函数添加标题:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  ggtitle("Temperatures in Chicago")

或者,你也可以使用labs()函数。在这里你可以添加几个参数,例如副标题,标题和标签(以及如前所示的坐标轴标题)

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)",
       title = "Temperatures in Chicago",
       subtitle = "Seasonal pattern of daily temperatures from 1997 to 2001",
       caption = "Data: NMMAPS",
       tag = "Fig. 1")

加粗标题,并在基线上添加空格

同样,因为我们想要修改主题的属性,所以我们使用theme()函数,axis.title 和 axis.text来修改字体和边距。以下所有主题元素的修改不仅适用于标题plot.title,还适用于所有其他标签,如plot.subtitle, plot.caption, plot.caption, legend.title, legend.text, axis.title和axis.text。

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)",
       title = "Temperatures in Chicago") +
  theme(plot.title = element_text(face = "bold",
                                  margin = margin(10, 0, 10, 0),
                                  size = 14))

调整标题位置

一般的对齐方式(左、中、右)是由hjust()控制, hjust是horizontal adjustment的缩写。当然,也可以通过vjust来调整垂直对齐。

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = NULL,
       title = "Temperatures in Chicago",
       caption = "Data: NMMAPS") +
  theme(plot.title = element_text(hjust = 1, size = 16, face = "bold.italic"))

2019年以来,用户可以根据面板区域(默认)或通过plot.title.position和plot.caption.position指定标题、副标题和标题的对齐方式。在大多数情况下,后者实际上是更好的选择,许多人非常喜欢这个新功能,因为如果y轴标签非常长,对齐后看起来会很糟糕。

(g <- ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  scale_y_continuous(label = function(x) {return(paste(x, "Degrees Fahrenheit"))}) +
  labs(x = "Year", y = NULL,
       title = "Temperatures in Chicago between 1997 and 2001 in Degrees Fahrenheit",
       caption = "Data: NMMAPS") +
  theme(plot.title = element_text(size = 14, face = "bold.italic"),
        plot.caption = element_text(hjust = 0)))
g + theme(plot.title.position = "plot",
          plot.caption.position = "plot")

标题中使用非传统字体

你还可以使用不同的字体,不仅仅是ggplot提供的默认字体(不同的操作系统会有所不同)。有几个软件包可以帮助你使用安装在你电脑上的字体。在这里,我使用了showtext包,它可以方便地在R图中使用各种类型的字体(TrueType、OpenType、Type 1、web字体等)。在我们加载了包之后,你需要导入必须安装在你电脑上的字体。我经常使用谷歌字体,它可以用font_add_google()函数导入,但你也可以用font_add()添加其他字体。(注意,即使在使用谷歌字体的情况下,你必须安装字体并重启rstudio 以使用字体)

library(showtext)
font_add_google("Playfair Display", ## name of Google font
                "Playfair")  ## name that will be used in R
font_add_google("Bangers", "Bangers")

现在,我们可以使用这些字体家族使用-是的,你猜对了- theme():

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)",
       title = "Temperatures in Chicago",
       subtitle = "Daily temperatures in °F from 1997 to 2001") +
  theme(plot.title = element_text(family = "Bangers", hjust = .5, size = 25),
        plot.subtitle = element_text(family = "Playfair", hjust = .5, size = 15))

更改多行文本的间距

可以使用lineheight参数来更改行与行之间的间距。在这个例子中,我把线条压在一起(lineheight < 1)。

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  ggtitle("Temperatures in Chicago\nfrom 1997 to 2001") +
  theme(plot.title = element_text(lineheight = .8, size = 16))

调整图例

我们将根据季节类别对数据进行颜色编码。或者用更通俗的说法:我们把季节的变化映射到色彩上。ggplot2的一个优点是,当将变量映射到美学时,它会默认添加一个图例。你可以看到,默认情况下,图例标题就是我们在color参数中指定的:

ggplot(chic,
       aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)")

移除图列

非常简单,使用 theme(legend.position = "none"):

ggplot(chic,
       aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.position = "none")

你还可以根据具体情况使用guides(color = "none")或scale_color_discrete(guide = "none")。虽然theme()的更改会一次性删除所有图例,但你可以使用后一种选项会删除特定的图例,同时保留其他图例。例如在这里,我们保留形状的图例,而放弃颜色的图例。


ggplot(chic,
       aes(x = date, y = temp,
           color = season, shape = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  guides(color = "none")

移除图例标题

正如你猜到的,使用element_blank():

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.title = element_blank())

改变图例的位置

如果你不想把图例放在右边,就用 theme中的legend.position 参数。在theme中作为图例的位置可以是’top’, ‘bottom’, ‘left’, ‘right'。

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.position = "top")

你也可以在面板中指定一个相对的x和y坐标从0(左或下)到1(右或上)的向量:

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)",
       color = NULL) +
  theme(legend.position = c(.15, .15),
        legend.background = element_rect(fill = "transparent"))

改变图例的方向

图例的方向默认是垂直的,但当你选择“top”或“bottom”位置时,是水平的。但你也可以随心所欲地改变方向:

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.position = c(.5, .97),
        legend.background = element_rect(fill = "transparent")) +
  guides(color = guide_legend(direction = "horizontal"))

改变图例的风格

你可以通过调整theme中的legend.title来改变图例标题的外观:

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.title = element_text(family = "Playfair",
                                    color = "chocolate",
                                    size = 14, face = "bold"))

改变图例的标题

改变图例标题的最简单方法是使用labs()层:

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)",
       color = "Seasons\nindicated\nby colors:") +
  theme(legend.title = element_text(family = "Playfair",
                                    color = "chocolate",
                                    size = 14, face = "bold"))

改变图例键值的顺序

我们可以通过改变season的不同level来实现:

chic$season <-
  factor(chic$season,
         levels = c("Winter", "Spring", "Summer", "Autumn"))
ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)")

改变图例的标签

在scale_color_discrete()中提供一个名称向量,用月份来替换季节:

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  scale_color_discrete(
    name = "Seasons:", 
    labels = c("Mar—May", "Jun—Aug", "Sep—Nov", "Dec—Feb")
  theme(legend.title = element_text(
    family = "Playfair", color = "chocolate", size = 14, face = 2
  ))

更改图例中的背景

为了改变图例键值的背景色(填充),我们调整theme中legend.key的设置:

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.key = element_rect(fill = "darkgoldenrod1"),
        legend.title = element_text(family = "Playfair",
                                    color = "chocolate",
                                    size = 14, face = 2)) +
  scale_color_discrete("Seasons:")

如果你想完全去掉它们,可以使用fill = NA或fill = "transparent"。

改变图例符号的大小

图例中的点在默认大小下可能会丢失一些,特别是没有box的情况下。要覆盖默认图层,可以使用guides图层,如下所示:

ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(legend.key = element_rect(fill = NA),
        legend.title = element_text(color = "chocolate",
                                    size = 14, face = 2)) +
  scale_color_discrete("Seasons:") +
  guides(color = guide_legend(override.aes = list(size = 6)))

手动添加图例项(legend items)

ggplot2不会自动添加图例,除非你将外观(颜色,大小等)映射到一个变量。但有时候,我想要一个图例,这样就能清楚地知道你在画什么。

这是默认值:

ggplot(chic, aes(x = date, y = o3)) +
  geom_line(color = "gray") +
  geom_point(color = "darkorange2") +
  labs(x = "Year", y = "Ozone")

我们可以通过将guide映射到变量来强制生成图例。我们使用aes()映射线和点,我们不是映射到数据集中的一个变量,而是映射到一个字符串(这样我们就得到了每个颜色)。

ggplot(chic, aes(x = date, y = o3)) +
  geom_line(aes(color = "line")) +
  geom_point(aes(color = "points")) +
  labs(x = "Year", y = "Ozone") +
  scale_color_discrete("Type:")

我们已经很接近,但这还不是我们想要的。我们想要灰色和红色! 要更改颜色,我们使用scale_color_manual()。此外,我们使用guide()函数重写了图列中的美学。

瞧!现在,我们有一个带有灰线和橙红点的图,以及一个单独的灰线和一个单独的橙红点作为图例符号:

ggplot(chic, aes(x = date, y = o3)) +
  geom_line(aes(color = "line")) +
  geom_point(aes(color = "points")) +
  labs(x = "Year", y = "Ozone") +
  scale_color_manual(name = NULL,
                     guide = "legend",
                     values = c("points" = "darkorange2",
                                "line" = "gray")) +
  guides(color = guide_legend(override.aes = list(linetype = c(1, 0),
                                                  shape = c(NA, 16))))

使用其他图例风格

就像您在前面的几个例子中看到的那样,像season这样的分类变量的默认图例是guide_legend()。如果你将一个连续变量映射到美学,ggplot2默认将不使用guide_legend(),而是guide_colorbar()(或guide_colourbar()):

ggplot(chic,
       aes(x = date, y = temp, color = temp)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F)")

但是,通过使用guide_legend(),你可以强制图例显示离散的颜色,就像分类变量的情况一样:

ggplot(chic,
       aes(x = date, y = temp, color = temp)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F)") +
  guides(color = guide_legend())

你也可以用 binned scales:

ggplot(chic,
       aes(x = date, y = temp, color = temp)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F)") +
  guides(color = guide_bins())

调整背景和网格线

有一些方法可以用一个函数来改变图表的整体外观,但是如果你只是想改变一些元素的 颜色 ,你也可以这样做

改变面板背景颜色

要改变面板区域(即绘制数据的区域)的背景颜色(填充),需要调主题theme中的panel.background:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "#1D8565", size = 2) +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(panel.background = element_rect(
    fill = "#64D2AA", color = "#64D2AA", size = 2)
  )

改变网格线

有两种类型的网格线:一级网格线(major grid line)和二级网格线(minor grid line)。你可以通过覆盖面板的默认值来更改这些。对于每一组网格线,分别使用panel.grid.major和panel.grid.minor。

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(panel.grid.major = element_line(color = "gray10", size = .5),
        panel.grid.minor = element_line(color = "gray70", size = .25))

你甚至可以为所有的网格线指定4个不同水平的设置:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(panel.grid.major = element_line(size = .5, linetype = "dashed"),
        panel.grid.minor = element_line(size = .25, linetype = "dotted"),
        panel.grid.major.x = element_line(color = "red1"),
        panel.grid.major.y = element_line(color = "blue1"),
        panel.grid.minor.x = element_line(color = "red4"),
        panel.grid.minor.y = element_line(color = "blue4"))

当然,如果你愿意,你也可以删除一些或所有网格线:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(panel.grid.minor = element_blank())
ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(panel.grid = element_blank())

改变网格线的间距

你还可以定义一级网格线和二级网格线之间的断点:

ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "firebrick") +
  labs(x = "Year", y = "Temperature (°F)") +