个性化阅读
专注于IT技术分析

关于R编程绘图的15个问题

本文概述

R使你可以创建不同的图类型, 从基本图类型(例如密度图, 点图, 箱线图和散点图)到统计上更复杂的图类型(例如概率图)。

此外, 它还允许你从几乎没有定制的基础图形生成到完全成熟的定制与交互式图形结合绘制高级图形的过程。但是, 并非总是能获得R图所需的结果:堆栈溢出充满了我们对图中的问题, 还有许多重复出现的问题。

题

这就是为什么srcmini决定将所有常见问题及其评分最高的答案放到博客文章中。

要练习在R中创建图, 请尝试在R中进行数据可视化这门课程。

15个问题

  1. 如何绘制一个空白的R图
  2. 如何设置R图的轴标签和标题
  3. 如何添加和更改R图的刻度线的间距
  4. 如何创建两个不同的X轴或Y轴
  5. 如何添加或更改R图的图例
  6. 如何在R图中绘制网格
  7. 如何以PNG为背景绘制图
  8. 如何调整R图中点的大小
  9. 如何将平滑曲线拟合到R数据
  10. 如何在R图中添加误差线
  11. 如何将绘图另存为光盘上的图像
  12. 如何绘制彼此相邻的两个R图
  13. 如何绘制多条线或点
  14. 如何确定R图的宽高比
  15. ggplot2中的just和vjust有什么功能

1.如何绘制空白的R图?

打开一个新的图框

你可以打开一个空的绘图框并按如下所示激活R中的图形设备:

请注意, plot.new()和frame()函数定义了一个新的绘图框架, 而没有任何轴, 标签或轮廓。它表示将要创建一个新的绘图:如果你还没有打开一个新的图形窗口, 则会打开, 否则, 现有的窗口将准备容纳该新绘图。你可以在这里阅读这些功能。

  • x11()也可以在R中为X窗口系统(版本11)打开新的Windows设备!
  • crystal()启动OS X系统的图形设备驱动程序。

设置图形窗口的度量

你还可以使用plot.window()函数来设置刚刚制作的空图的水平和垂直尺寸:

plot.new()
pWidth = 3
pHeight = 2
plot.window(c(0, pWidth), c(0, pHeight))

绘制实际的空图

你可以使用plot()函数绘制一个空图。此外, 使用mtext()和title()函数用轴, 轴标签和标题填充空白图。

你给出了绘图的坐标(5, 5), 但是通过将type参数设置为” n”却没有显示任何绘图。

提示:尝试将此参数设置为” p”或” b”, 看看会发生什么!

而且, 你无需注释绘图, 但可以在x轴和y轴上设置从0到10的限制。

最后, 你可以选择使用box()函数在绘图周围绘制一个框, 并使用points()函数向其中添加一些点:

请注意, 你可以将x坐标和y坐标放入向量中, 以一次绘制多个点。 pch参数允许你选择一个符号, 而cex参数具有为其分配的值, 该值指示相对于默认比例, 应缩放多少已绘制的文本和符号。

提示:如果要查看什么数字链接到什么符号, 请单击此处。

2.如何设置R图的轴标签和标题?

R图的轴构成了Stack Overflow问题中最受欢迎的主题之一。与该主题相关的问题非常多样。

继续阅读以发现srcmini发现了哪些常见问题!

命名轴(带有上标或下标)并在R图中添加标题?

你可以轻松命名轴并放置标题, 以使你的R图更加具体和易于听众理解。

可以通过以下方式轻松实现此目的:添加主标题main, 副标题subsub, xlab标签x轴和ylab标签y轴的参数。

请注意, 如果要使用上标或下标标题, 则可以轻松地将其添加到plot()函数的主参数中。确保使用expression()并将^符号用于上标, 将方括号用于下标。

在下面的srcmini Light块中尝试一下:

你还可以使用结合了expression()和paste()函数的代码来确保轴标签中包含希腊字母。执行以下代码:

调整轴标签的外观

要调整x和y轴标签的外观, 可以使用参数col.lab和cex.lab。第一个参数用于更改x和y轴标签的颜色, 而第二个参数用于确定x和y轴标签相对于cex的(默认)设置的大小。

有关这些参数的更多信息, 请转到此页面。

删除图解的轴标签和注释

如果要摆脱绘图的轴值, 可以先添加参数xaxt和yaxt, 并将其设置为” n”。这些自变量被分配了一个字符, 该字符指定x轴类型。如果输入” n”(如下面的命令所示), 则可以抑制轴的绘制。

注意, 通过给xaxt和yaxt参数赋予任何其他字符, 将绘制x和y轴。

接下来, 你可以添加注释参数ann并将其设置为FALSE以确保删除所有轴标签。

提示:不是你要查找的信息?转到此页面。

旋转绘图的轴标签

你可以将las参数添加到axis()函数中, 以旋转与每个轴对应的数字:

请注意, 这实际上是如何要求你向plot()函数添加一个参数的, 该参数基本上表示还没有要绘制的轴:这是接下来的两个axis()函数的任务。

las参数可以具有三个值。根据选择的选项, 标签的位置将有所不同:如果选择0, 则标签将始终与轴平行(默认设置);否则, 标签将始终与轴平行。如果选择1, 则标签将水平放置。如果要使其垂直于轴, 则选择2;如果要垂直放置, 则选择3。

但是还有更多。如果你想进一步了解axis()函数的可能性, 请继续阅读!

移动R图的轴标签

因此, 你想四处移动轴的标签吗?

不用担心, 你可以使用axis()函数执行此操作;正如你在本教程中之前可能已经注意到的那样, 此功能允许你首先指定要绘制轴的位置。假设你要在绘图区域上方绘制x轴, 并在其右侧绘制y轴。

请记住, 如果将1或2传递给axis()函数, 则将在绘图区域的底部和左侧绘制轴。向上滚动一点, 以查看上一段代码中的示例!

这意味着你将需要将3和4传递给axis()函数:

如你所见, 起初, 你基本上绘制了x和y, 但是省略了轴和注释。然后, 添加要查看的轴并指定其相对于图的位置。

axis()函数为你创建的灵活性不断提高!查看下一个常见问题, 以了解使用此基本R函数还能解决的其他问题。

提示:转至最后一个问题, 以了解更多有关如何使用”对齐”和”对齐”在轴标签中移动文本的更多信息!

3.如何添加和更改R图刻度线的间距

如何更改R图的刻度线的间距

让R确定绘图的刻度线可能会很烦人, 可能会有一段时间你想调整这些刻度线。

1.使用axis()函数确定绘图的刻度线

考虑以下代码:

如你所见, 首先定义刻度线及其标签的位置。然后, 绘制图, 将x轴类型指定为” n”, 从而抑制轴的绘制。

然后, 真正的工作开始了:

  • axis()函数允许你指定要在其上绘制轴的绘图侧。在这种情况下, 自变量以1结束, 这表示将在下面绘制轴。如果值为2, 则将在左侧绘制轴, 如果值为3或4, 则将分别在上方或右侧绘制轴;
  • 使用at参数可以指示要绘制刻度线的点。在这种情况下, 你将使用V1中定义的位置。
  • 同样, 你要使用的标签是V2中指定的标签。
  • 你可以通过tck调整刻度的方向:通过给此参数一个负值, 你可以指定刻度应出现在轴的下方。

提示:尝试将正值传递给tck参数, 看看会发生什么!

你可以通过tcl进一步指定刻度的大小, 刻度标签的外观由cex.axis, col.axis和font.axis控制。

2.使用其他功能确定你的R图的刻度线

你还可以使用par()和plot()函数来定义刻度线的位置以及刻度线之间的间隔数。

请注意, 然后使用参数xaxp, 将位于x轴的最末端的刻度线的位置传递给参数xaxp, 然后是刻度线之间的间隔数:

你还可以运行以下代码来基本获得相同的结果:

请注意, 这仅在不使用对数标度的情况下有效。如果将日志坐标设置为true, 或者换句话说, 如果par(xlog = T), 则传递给xaxp的三个值具有不同的含义:对于较小的范围, n为负。否则, n在1:3中指定一个案例号, x1和x2是用户坐标内10的最低和最高幂10 ^ par(” usr”)[1:2]。

一个例子:

在此示例中, 使用par()函数:将xlog设置为TRUE, 并添加xaxp参数以提供极限刻度线的坐标以及它们之间的间隔数。在这种情况下, 将最小值设置为1, 将最大值设置为4, 并添加每个刻度线之间的间隔数应为3。

然后, 绘制x和y, 并添加log参数以指定是在对数刻度上绘制x轴还是y轴。你可以将” x”, ” y”和” xy”作为值传递给日志参数以执行此操作。

以对数标度显示两个轴的示例是:

如何在R图上添加小刻度线

你可以使用Hmisc包中的minor.tick()函数将小刻度线快速添加到绘图中:

  • nx参数允许你指定要在轴上主要刻度线之间划分区域的间隔数。如果将值1传递给它, 次刻度线将被抑制;
  • ny允许你执行与nx相同的操作, 但随后执行y轴操作;
  • tick.ratio表示次要刻度线与主要刻度线的长度之比。后者的长度从par(tck = x)中检索。

4.如何创建两个不同的X轴或Y轴

第一种选择是创建第一个图并使用新参数TRUE来执行par()函数, 以防止R清除图形设备:

然后, 使用plot()创建第二个图。传递数据, 然后还要确保调整一些参数, 例如类型, 轴, bty, xlab和ylab:

  • 类型:你可以传入l以确保使用线进行绘制;
  • 将轴设置为FALSE, 以便不绘制轴;
  • bty禁止在图周围绘制方框;
  • xlab设置为空字符串, 这使得x轴上没有标签, 并且
  • ylab也设置为空字符串, 因此y轴也没有标签。

在以下srcmini Light块中全部检查完。请注意, 上面的代码已经被加载到你的工作环境中。你可以使用srcmini Light框右侧的R控制台再次检查:

接下来, 是时候添加一个轴, 并分别使用axis()和mtext()将文本写入绘图的空白处了。

你可以在右侧添加一个新轴, 方法是在参数侧添加参数并将其值4分配给axis()函数。接下来, 指定at参数以指示需要绘制刻度线的点。在这种情况下, 你可以使用pretty()函数计算n + 1个等距”取整”值的序列, 这些值覆盖z中的值范围。这样可以确保你实际上拥有第二个绘图中命名为z的y轴上的数字。

请尝试以下所有方法:

请注意, side参数可以分配三个值:1用于将文本放置在底部, 2用于左侧放置, 3用于顶部放置, 以及4用于将文本放置在右侧。 line参数指示文本从哪条边距开始。

你的代码的总最终结果将如下所示:

set.seed(101)
x <- 1:10
y <- rnorm(10)
z <- runif(10, min=1000, max=10000)
plot(x, y) 
par(new = TRUE)
plot(x, z, type = "l", axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(z)))
mtext("z", side=4, line=3)

作为附加练习, 请尝试使用两个不同的x轴构造R图!在下面的此srcmini Light块中执行此操作:

请注意, 即使你可以使用基本的plot(), axis()和mtext()函数手动完成所有这些操作, 也有一些软件包可以自动完成所有操作:plotrix软件包的twoord.plot()函数和doubleYScale( )的功能非常方便, 如果你想做同样的事情, 可能会更快一些:

请注意, 上面的示例是使用此数据集进行的。如果你对数据的导入或read.table()函数有任何疑问, 请查阅srcmini的有关在R中导入数据的教程。

5.如何添加或更改R图的图例?

使用Basic R添加和更改R图的图例

你可以使用legend()函数轻松地将图例添加到R图中:

请注意, legend()文档中描述的参数pt.cex和title.cex并没有真正起作用。有一些解决方法:

  1. 通过向legend()添加text.font参数, 以不同的字体放置图例的标题或标签:
  1. 用不同的cex参数值绘制图例两次

提示:如果你想了解有关R中可以使用的颜色的更多信息, 请查看此非常有用的PDF文档。

如何在ggplot2中添加和更改R图的图例和标签

向你的ggplot2图中添加图例非常简单。你可以执行以下命令:

它为你提供了默认图例。但是, 在大多数情况下, 你将需要更多调整图例的外观。

更改ggplot2中图例标题和标签的方法有两种:

  1. 告诉体重秤使用不同的标题和标签

如果指定了颜色或形状或其他美感等参数, 则需要分别通过scale_color_discrete()和scale_shape_discrete()函数更改名称和标签:

请注意, 在srcmini Light块的”绘图”选项卡中, 该绘图看起来有些变形, 但是, 如果你在RStudio中执行代码, 则不会有问题。

请注意, 如果将参数形状添加到geom_point()函数和标签参数中, 则可以创建两个图例!

如果要将图例移动到图的底部, 可以将legend.position指定为”底部”。另一方面, legend.justification参数允许你将图例放置在绘图中。

提示:检查各种可能用于使ggplot知道的标度, 然后在此处使用其他名称和标签。

  1. 更改数据框, 以使因子具有所需的形式

例如:

然后, 你可以使用新的因子名称在ggplot2中进行绘制, 从而避免了在绘制过程中用多余的代码行更改名称和标签的麻烦。

提示:有关ggplot2的完整备忘单, 请转到此处。

6.如何在R图中绘制网格?

使用基本R在R绘图中绘制网格

出于某些目的, 你可能会发现有必要在绘图中包括网格。你可以使用grid()函数轻松地将网格添加到绘图中:

用ggplot2在R图中绘制网格

下面的代码块向你展示如何确保绘图具有ggplot2软件包的网格。注意, chol数据已经被加载, 并且上面已经执行了数据操作步骤。

如果不确定数据的外观, 请在srcmini Light块的R控制台中打印出数据框的第一行:

提示:如果你不想使用次要的网格线, 只需将element_blank()传递给panel.grid.minor。

如果要用颜色填充背景, 请在代码中添加panel.background = element_rect(fill =” navy”)。你可以在下面的srcmini Light块中查看如何完成此操作。像以前一样, 已加载并轻松地操作了chol数据。自己试试吧!

7.如何以PNG为背景绘制图?

你可以借助png包快速绘制以.png为背景的图。如果需要, 你可以安装该软件包, 然后通过库函数library()激活它以便在工作区中使用, 然后就可以开始绘图了!

首先, 你要加载图像。使用readPNG()函数指定图片的路径!

提示:你可以检查工作目录的位置并通过执行以下命令对其进行更改。

如果你的图片保存在工作目录中, 则只需指定readPNG(” picture.png”)即可, 而不用传递整个路径。

接下来, 你要设置绘图区域, 并要调用par()函数以在rasterImage()中设置图形参数。你可以使用参数usr来定义绘图区域的用户坐标的极限值。在这种情况下, 你放入1、3、2和4。

接下来, 绘制一个网格并添加一些线:

install.packages("png")
library(png)
image <- readPNG("<path to your picture>")

getwd()
setwd("<path to a folder>")

plot(1:2, type='n', main="Plotting Over an Image", xlab="x", ylab="y")

lim <- par()

rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])

grid()
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")

如果使用srcmini徽标, 则可以得到以下结果:

library(png)
image <- readPNG("srcmini.png")
plot(1:2, type="n", main="Plotting Over an Image", xlab="x", ylab="y", asp=1)
lim <- par()
rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1.5, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")
Rplot21

请注意, 你需要将.png文件作为readPNG()的输入, 并且, 如果愿意, 还可以按照相同的步骤处理jpg图像。当然, 然后你需要加载jpeg库!

请注意, 在此示例中, 你首先从Web下载图像以用于绘图中, 但是你也可以只保存图像并将文件路径传递给readJPEG()以便在绘图期间使用它。

另外, 请注意, 该示例取自R Graph Gallery, 它为R数据可视化提供了大量灵感, 因为你可以在一个空间中找到代码和渲染图!如果你正在寻找灵感或快速找到图表所需代码的理想选择!

8.如何调整R图中点的大小?

使用基本R调整R图中点的大小

要使用基本R调整点的大小, 你可以仅使用cex参数:

但是请记住, R使你可以通过函数symbol()对符号进行更多控制:

该图的圆接受df $ x3的值作为半径, 而自变量inch则控制符号的大小。当此参数接收到正数作为输入时, 将缩放符号以使最大尺寸变为该尺寸(以英寸为单位)。

使用ggplot2调整R图中点的大小

在这种情况下, 你将需要调整散点图中的点的大小。你可以使用size参数执行此操作。请注意, 已为你加载了chol数据:

请注意, 你还可以将size参数传递给geom_point()函数:

ggplot(chol, aes(x=chol$WEIGHT, y=chol$HEIGHT)) + 
  geom_point(size = 2)

你会得到相同的结果, 但是请不要相信我!尝试用该块替换srcmini Light块中的最后一段代码。

9.如何将平滑曲线拟合到R数据

loess()函数可能是每个R程序员最喜欢的此类问题解决方案。它实际上是”使用局部拟合来拟合由一个或多个数值预测器确定的多项式曲面”。

简而言之, 你拥有了数据, 并使用了loess()函数, 在其中将y和x相关联。通过此操作, 你可以指定数值响应和一到四个数值预测变量。

接下来, 绘制x和y并在原始绘图中绘制线, 在这些原始线中预测lo的值:

10.如何在R图中添加误差线

使用Basic R绘制误差线

坏消息:R无法像这样绘制误差线。好消息:你仍然可以绘制错误栏, 而无需安装其他程序包!

首先, 你需要定义以下函数来计算数据框的一些摘要统计信息:

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE, conf.interval=.95, .drop=TRUE) {
    library(plyr)

    # New version of length which can handle NA's: if na.rm==T, don't count them
    length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
    }

    # This does the summary. For each group's data frame, return a vector with
    # N, mean, and sd
    datac <- ddply(data, groupvars, .drop=.drop, .fun = function(xx, col) {
        c(N    = length2(xx[[col]], na.rm=na.rm), mean = mean   (xx[[col]], na.rm=na.rm), sd   = sd     (xx[[col]], na.rm=na.rm)
        )
      }, measurevar
    )

    # Rename the "mean" column    
    datac <- rename(datac, c("mean" = measurevar))

    datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean

    # Confidence interval multiplier for standard error
    # Calculate t-statistic for confidence interval: 
    # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
    ciMult <- qt(conf.interval/2 + .5, datac$N-1)
    datac$ci <- datac$se * ciMult

    return(datac)
}

请注意, 函数定义来自此来源, 并且它也可以通过Rmisc库获得。

接下来, 你可以使用它来计算一些已为你加载的chol数据统计信息。之后, 你可以使用这些所得的数字进行绘图。

在开始本练习之前, 请确保检查数据!

如果要阅读arrow()可以接受的所有参数, 请转到此处。

用ggplot2绘制误差线

误差棒代表平均值的标准误差

首先, 使用Rmisc软件包中的summarySE()函数汇总数据, 或使用上面定义的函数。然后, 你可以使用结果数据框来绘制一些变量, 同时为它们绘制误差线, 例如使用均值的标准误差。

为了方便起见, 已为你加载了数据和功能:

如果要更改误差线的位置, 例如当误差线重叠时, 可以考虑使用position_dodge()函数:

提示:如果出现类似” geom_path”的错误, 则每个组仅包含一个观测值。你是否需要调整团队审美?”, 通常需要你调整团队审美。

代表置信区间的误差线

继续使用Rmisc库或上一节的summarySE()函数所做的数据摘要, 你还可以绘制表示置信区间的误差线。在这种情况下, 将绘制出误差条为95%置信度的图。

请注意, 现在如何使用color参数将误差线的颜色设置为黑色。

误差棒代表标准偏差

最后, 你还可以使用Rmisc程序包的summarySE()函数的结果或从最后一部分之一复制的函数定义中得出的结果, 以绘制表示标准偏差的误差线。

具体来说, 你只需要调整传递给geom_errorbar()的ymin和ymax参数即可:

大提示*:也请查看此内容, 以获取有关如何绘制均值和误差线的更多详细示例。

11.如何将绘图另存为光盘上的图像

你可以使用dev.copy()将在当前图形设备中生成的图形复制到你自己指定的设备或文件夹中。

x <- seq(0, 2*pi, 0.1)
y <- sin(x)
plot(x, y)
dev.copy(jpeg, filename="<path to your file/name.jpg>");
dev.off();
(x)
(y)

12.如何绘制两个相邻的R图?

使用Basic R并排绘制两个图

你可以使用基本的R命令执行此操作:

通过使用带有mfrow参数的par()函数, 你可以指定一个向量, 在这种情况下, 该向量包含1和2:然后, 所有图形将按行(mfrow)绘制在设备上的1-by-2数组中。

换句话说, 从上方开始的箱线图将打印在两列内的一行中。

使用ggplot2绘制两个彼此相邻的图

如果你想并排放置图, 并且不想指定限制, 则可以考虑使用ggplot2包并排绘制图。

你的数据chol和summarySE()函数已加载。如果不确定它们的外观, 请在R控制台中检查它们:

请注意, 如何仅添加facet_grid()函数来指示你希望两个图彼此相邻。正如你可以在上面看到的那样, 用于确定绘图绘制方式的元素是MORT!

使用gridExtra并排绘制更多图

要并排打印图, 可以使用gridExtra包;确保已在工作空间中安装并激活了软件包, 然后执行以下操作:

请注意, 由于ncol参数, 你将如何再次确定如何显示两个图。

使用晶格并排绘制更多图

就像ggplot2程序包的解决方案一样, 网格程序包也不需要你指定限制或希望你的图表彼此相邻打印的方式。

而是使用bwplot()制作箱形图的图形类型的网格图。格子图显示一个变量或变量之间的关系, 并以一个或多个其他变量为条件。

在这种情况下, 如果你使用的是chol数据集(可在此处找到或使用read.table()函数加载该数据集), 则将针对因子SMOKE和MORT水平的每种组合分别显示变量CHOL。

请注意, 数据已在下面的srcmini Light块中为你加载!

使用gridBase绘制彼此相邻的图

甚至将两个图并排放置的另一种方法是使用gridBase程序包, 该程序包负责”基础图形和网格图形的集成”。当你想将基本的R图和ggplot彼此相邻放置时, 这可能会很方便。

你的工作方式如下:首先, 在工作区中激活必要的程序包。在这种情况下, 你要准备好gridBase以便将两个图并排放置, 并使用grid和ggplot2实际绘制图:

library(grid)
library(gridBase)
library(ggplot2)

plot.new()

gl <- grid.layout(nrow=1, ncol=2)
vp.1 <- viewport(layout.pos.col=1, layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, layout.pos.row=1)
                 
pushViewport(viewport(layout=gl))
pushViewport(vp.1)

par(new=TRUE, fig=gridFIG())
plot(x = 1:10, y = 10:1)
     
popViewport()

pushViewport(vp.2)

ggplotted <- qplot(x=1:10, y=10:1, 'point')
print(ggplotted, newpage = FALSE)

popViewport(1)

如果需要, 可以启动一个空白图, 然后设置布局。请注意, 由于要使两个图彼此相邻生成, 因此这要求你制作一个由一行和两列组成的网格布局。

现在, 你要用视口填充网格的单元格。它们借助这些区域内的坐标在图形设备上定义矩形区域。在这种情况下, 使用上面刚刚描述的网格规格而不是实际的x或y坐标要方便得多。这就是为什么你应该使用layout.pos.col和layout.pos.row参数的原因。

由于视口仅是描述或定义, 因此需要先将这些类型的对象推入视口树, 然后才能在图形上看到任何效果。你想使用pushViewport()函数来完成此操作。

现在, 你可以继续将第一个矩形区域vp.1添加到ViewPort树, 然后用gridFig()告诉R在网格视口(即vp.1)内绘制基本图。 fig参数通常采用设备显示区域中图形区域的坐标。在这种情况下, 你可以使用fig参数来启动新绘图, 并通过在par()函数中添加new = TRUE将其添加到现有绘图中。你绘制基本图形并从树中删除视口:

plot.new()

gl <- grid.layout(nrow=1, ncol=2)

vp.1 <- viewport(layout.pos.col=1, layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, layout.pos.row=1)

pushViewport(viewport(layout=gl))

pushViewport(vp.1)

par(new=TRUE, fig=gridFIG())
plot(x = 1:10, y = 10:1)
popViewport()

由于要使两个图相邻生成, 因此要在第一列中放置一个图, 在第二列中放置另一个图, 这两个图均位于第一行。

请注意, pushViewport()函数采用viewport()函数, 该函数本身包含布局参数。最后一个参数指示”将视口分为多个子区域的网格布局对象”。

还要注意, 你可以在popViewport()函数中指定一个参数, 以指示要从树中删除多少个视口。如果该值为0, 则表明你要删除直到根视口为止的视口。此参数的默认值为1。

转到将第二个矩形区域vp.2添加到ViewPort树。然后, 你可以制作ggplot并从树中删除视口。

pushViewport(vp.2)
ggplotted <- qplot(x=1:10, y=10:1, 'point')
print(ggplotted, newpage = FALSE)
popViewport(1)

请注意, 你需要打印以打印由qplot()制作的图形对象, 以便实际绘制并显示它。同时, 你还想指定newpage = FALSE, 否则, 你只会看到qplot()…

另外, 请记住, 在函数popViewport()中要删除的视口的默认值设置为1。这使得将popViewport(1)放入代码中显得有些多余。

13.如何绘制多条线或点?

使用基本R绘制同一R图中的多条线或点

要在同一绘图中绘制两个或多个图形, 你首先要在R中制作一个典型的基本绘图。然后, 开始向该绘图中添加更多的线或点。在这种情况下, 你将向绘图添加更多的线, 因此你将定义更多的y轴:

接下来, 你将看到这些线是使用lines()函数绘制的。

得到以下结果:

请注意, lines()函数接受三个参数:要绘制的x轴和y轴以及要绘制它们的颜色(用参数col表示)。你还可以包括以下功能:

特征 争论 输入
线型 整数或字符串
行宽 w 整数
地块类型 PCH 整数或单个字符
线端样式 整数或字符串
线连接样式 ljoin 整数或字符串
线斜接限制 lmitre 整数<1

这里有些例子:

lines(x, y2, col="green", lty = 2, lwd = 3)
lines(x, y2, col="green", lty = 5, lwd = 2, pch = 2)
lines(x, y3, col="black", lty = 3, lwd = 5, pch = 3, lend = 0, ljoin = 2)
lines(x, y4, col="blue", lty = 1, lwd = 2, pch = 3, lend = 2, ljoin = 1, lmitre = 2)

请注意, pch参数不能与lines()函数一起很好地工作, 最好仅将其与points()一起使用。

提示:如果要在同一图中绘制点, 则可以使用points()函数:

你可以将与上面列出的lines()函数相同的参数添加到points()函数。不过, 还有一些补充:

特征 争论 输入
Background (fill) color bg 仅当pch = 21:25时
Character (or symbol) expansion EXC 整数

这些参数的代码示例如下:

points(x, y4, col="blue", pch=21, bg = "red") 
points(x, y5, col="yellow", pch = 5, bg = "blue") 

如果将这些更改合并到上面看到的图中, 你将得到以下结果:

使用ggplot2在一个R绘图中绘制多条线或点

ggplot2包方便地允许你还创建图层, 这将使你基本上可以将两个或多个图形绘制到同一R图形中, 而没有任何困难且非常容易:

14.如何确定R图的纵横比

如果你想将R图保存为轴与尺寸成比例的图像, 则表示你要确定长宽比。

使用Basic R调整宽高比

当你使用基本的R命令生成绘图时, 可以添加plot()函数的参数asp(以整数完成)以设置纵横比。请看第一个没有定义宽高比的示例:

现在将其与使用参数asp定义纵横比的图进行比较:

使用ggplot2调整绘图的纵横比

要固定ggplot2图的宽高比, 只需添加函数coord_fixed(), 该函数提供”固定比例坐标系[可]在轴上的数据单元的物理表示之间强制指定比例”。

换句话说, 此功能允许你在y轴上指定与x轴上的一个单位等效的多个单位。默认值始终设置为1, 这意味着x轴上的一个单位的长度与y轴上的一个单位的长度相同。如果将比率设置为较高的值, 则y轴上的单位要长于x轴上的单位, 反之亦然。

比较以下示例:

使用MASS调整绘图的纵横比

你还可以考虑使用包含eqscplot()函数的MASS软件包:它会生成几何比例相等的图。它针对散点图执行此操作:

提示:在执行上面的代码之前, 你可能会很好地开始一个新的绘图框架!

请注意, 你可以为eqscplot()函数提供其他参数, 以自定义散点图的外观!

15. ggplot2中的”调整”功能是什么?

好吧, 当你要设置ggplot中文本的位置时, 基本上可以使用这些参数。 “对齐”允许你定义水平对齐, 而对齐则用于控制垂直对齐。有关更多信息, 请参见geom_text()上的文档。

为了演示到底发生了什么, 你可以使用expand.grid()函数根据所有因素组合创建一个数据框:

hjustvjust <- expand.grid(hjust=c(0, 0.5, 1), vjust=c(0, 0.5, 1), angle=c(0, 45, 90), text="Text"
                          )

请注意, hjust和vjust只能取0到1之间的值。

  • 0表示文本左对齐;换句话说, 所有文本都与左边缘对齐。这通常是在使用Microsoft Word等文本编辑器时看到的。
  • 1表示文本是右对齐的:所有文本都对齐到右边距。

然后, 你可以使用ggplot()函数绘制刚刚创建的数据框, 分别将x轴和y轴定义为hjust和vjust:

还要注意如何将hjust和vjust参数添加到geom_text()中, 该参数负责处理图的文本注释。

在上图中, 你看到(0, 0)点处的文本在水平和垂直方向都左对齐。另一方面, 在点(1, 1)上的文本在水平和垂直方向上都右对齐。点(0.5, 0.5)恰好位于中间:关于水平和垂直方向, 它并不是真正的左对齐或右对齐。

请注意, 定义这些参数以更改轴文本时, 轴文本的水平对齐方式是相对于整个绘图而不是x轴定义的!

此外, 请自己尝试定义vjust参数以更改坐标轴文本对图形表示的作用:

要进行出色的原始讨论(采用上面的代码), 请单击此处。

最后一点…

值得查阅这篇文章, 其中列出了10条使R图形看起来最好的技巧!

另外, 如果你想了解更多有关数据可视化的知识, 则可以考虑查看srcmini的ggvis数据可视化交互式课程, 该课程由R的动手编程以及R的数据科学的作者Garrett Grolemund提供。

或者, 也许我们的R Markdown报告课程会让你感兴趣!

赞(0)
未经允许不得转载:srcmini » 关于R编程绘图的15个问题

评论 抢沙发

评论前必须登录!