跳到内容

此手册页讨论了三个绘图函数 plot.igraphtkplotrglplot 的共同部分。

详细信息

igraph 包中目前有三个不同的函数可以以各种方式绘制图表

plot.igraph 对 R 设备进行简单的非交互式 2D 绘图。实际上,它是 graphics::plot() 泛型函数的实现,因此您可以编写 plot(graph) 而不是 plot.igraph(graph)。由于它使用了标准的 R 设备,因此它支持 R 具有输出设备的每种输出格式。该列表非常令人印象深刻:PostScript、PDF 文件、XFig 文件、SVG 文件、JPG、PNG,当然您也可以使用默认设备或美观的抗锯齿 Cairo 设备绘制到屏幕。有关更多信息,请参见 plot.igraph()

tkplot() 使用 tcltk 包进行交互式 2D 绘图。它只能处理中等大小的图表,一千个顶点可能已经太多了。发出 tkplot 命令后,可以交互式更改绘制图表的某些参数:顶点的位置、颜色和大小以及边的颜色和宽度。有关详细信息,请参见 tkplot()

rglplot() 是一个实验性函数,用于使用 OpenGL 在 3D 中绘制图表。有关更多信息,请参见 rglplot()

另请查看下面的示例。

如何指定图形参数

有三种方法可以为下面“参数”部分中描述的参数赋值。我们在这里按其优先级给出这三种方法。

第一种方法是向绘图命令提供命名参数:plot.igraph()tkplot() 或 rglplot()]。顶点参数以“vertex.”为前缀,边参数以“edge.”为前缀,全局参数没有前缀。例如,可以通过参数 vertex.color 给出顶点的颜色,而 edge.color 设置边的颜色。layout 给出图表的布局。

第二种方法是将顶点、边和图属性分配给图表。这些属性没有前缀,即顶点的颜色取自 color 顶点属性,边的颜色取自 color 边属性。图表的布局由 layout 图属性给出。(始终假设相应的命令参数不存在。)如果您想为图表分配给定的“外观”,则设置顶点和边属性很方便,属性与图表一起保存,如果您使用 base::save() 保存图表或使用 write_graph() 以 GraphML 格式保存图表,那么再次加载后图表将具有相同的外观。

如果未在命令行中给出参数,并且相应的顶点/边/图属性也缺失,那么还会检查由 igraph_options() 处理的常规 igraph 参数。顶点参数以“vertex.”为前缀,边参数以“edge.”为前缀,常规参数(如 layout)以“plot”为前缀。如果您希望所有或大多数图表具有相同的外观、顶点大小、顶点颜色等,那么这些参数非常有用。然后您无需在每次绘图时都设置这些参数,也无需为每个图表分配顶点/边属性。

如果此处描述的三种方法均未指定参数的值,则使用其默认值,如源代码中给出的。

不同的参数可以具有不同的类型,例如,顶点颜色可以作为具有颜色名称的字符向量给出,也可以作为具有当前调色板中颜色编号的整数向量给出。不同的类型对不同的参数有效,这将在下一节中详细讨论。然而,始终为真的是,参数始终可以是函数对象,在这种情况下,将以图表作为其单个参数调用该函数对象以获取参数的“正确”值。(如果函数返回另一个函数对象,则不会再次调用它...)

参数列表

首先是顶点参数,请注意,如果将它们用作参数或通过 igraph_options() 设置时,需要添加“vertex.”前缀。参数的值可以是标量,对每个顶点都有效,也可以是向量,每个顶点都有一个单独的值。(较短的向量会被循环使用。)

size

顶点的大小,一个数值标量或向量,在后一种情况下,每个顶点的大小可能不同。顶点大小会被缩放,以便对于所有三个绘图命令,给定值具有大致相同的顶点大小。它不需要是整数。默认值为 15。这足以在顶点上放置短标签。如果 size.scalingTRUE,则使用 relative.size 适当地缩放大小。

size2

顶点的“另一个”大小,适用于某些顶点形状。对于各种矩形形状,这给出了顶点的高度,而 size 给出了宽度。对于可以使用单个数字指定大小的形状,则忽略它。

默认值为 15。

color

顶点的填充颜色。如果是数值,则使用当前调色板,请参见 grDevices::palette()。如果是字符向量,则它可能包含整数值、命名颜色或具有三个或四个字节的 RGB 指定颜色。所有以“#”开头的字符串都假定为 RGB 颜色规范。可以混合命名颜色和 RGB 颜色。请注意,tkplot() 忽略 RGB 颜色规范中的第四个字节(alpha 通道)。

对于 plot.igraph 和整数值,使用默认的 igraph 调色板(参见下面的“palette”参数)。请注意,这与 R 调色板不同。

如果您不希望(某些)顶点具有任何颜色,请提供 NA 作为颜色名称。

默认值为“SkyBlue2”。

frame.color

顶点框架的颜色,允许使用与填充颜色相同的格式。

如果您不希望顶点具有框架,请提供 NA 作为颜色名称。

默认情况下为“black”。

frame.width

顶点框架的宽度。默认值为 1。

shape

顶点的形状,目前支持“circle”、“square”、“csquare”、“rectangle”、“crectangle”、“vrectangle”、“pie”(参见 vertex.shape.pie())、“sphere”和“none”,并且仅由 plot.igraph() 命令支持。“none”根本不绘制顶点,尽管会绘制顶点标签(如果给定)。有关顶点形状的详细信息,请参见 shapes(),有关使用饼图作为顶点的详细信息,请参见 vertex.shape.pie()

sphere”顶点形状将顶点绘制为 3D 光线跟踪球体,具有给定的颜色和大小。这将生成栅格图像,并且仅某些图形设备支持它。在某些设备上,不支持栅格透明度,并且球体没有透明背景。请参见 dev.capabilities 和“rasterImage”功能以检查您的设备是否受支持。

默认情况下,顶点绘制为圆形。

label

顶点标签。它们将被转换为字符。指定 NA 以省略顶点标签。默认顶点标签是顶点 ID。

label.family

用于顶点标签的字体系列。由于不同的绘图命令可以使用不同的字体,因此它们以不同的方式解释此参数。但是,基本表示法被 plot.igraph()tkplot() 理解。rglplot() 目前根本不支持字体,它完全忽略此参数。

对于 plot.igraph(),此参数只需作为参数 family 传递给 graphics::text()

对于 tkplot(),执行一些转换。如果此参数是现有 Tk 字体的名称,则使用该字体,并且完全忽略 label.fontlabel.cex 参数。如果它是基本系列(serif、sans、mono)之一,则使用 Times、Helvetica 或 Courier 字体,保证这些字体在所有系统上都存在。对于“symbol”基本系列,我们使用符号字体(如果可用),否则使用名称中带有“symbol”的第一个字体。如果该参数不是基本系列的名称,也不是命名的 Tk 字体,则我们将其传递给 tcltk::tkfont.create(),并希望用户知道她在做什么。label.fontlabel.cex 参数也会在此情况下传递给 tcltk::tkfont.create()

默认值为“serif”。

label.font

要在字体系列中使用的字体,用于顶点标签。它以与 font 图形参数相同的方式解释:1 是纯文本,2 是粗体,3 是斜体,4 是粗斜体,5 指定符号字体。

对于 plot.igraph(),此参数只需传递给 graphics::text()

对于 tkplot(),如果 label.family 参数不是 Tk 字体的名称,则此参数用于设置新创建的字体是否应为斜体和/或粗体。否则,将忽略它。

对于 rglplot(),它被忽略。

默认值为 1。

label.cex

顶点标签的字体大小。它被解释为某些设备相关基本字体大小的乘法因子。

对于 plot.igraph(),它只需作为参数 cex 传递给 graphics::text()

对于 tkplot(),它乘以 12,然后用作 tcltk::tkfont.create()size 参数。因此,tkplot 的基本字体为 12。

对于 rglplot(),它被忽略。

默认值为 1。

label.dist

标签与顶点中心的距离。如果为 0,则标签位于顶点中心。如果为 1,则标签显示在顶点旁边。

默认值为 0。

label.degree

它定义顶点标签相对于顶点中心的位置。它被解释为以弧度表示的角度,零表示“向右”,而“pi”表示向左,向上是 -pi/2,向下是 pi/2

默认值为 -pi/4

label.color

标签的颜色,有关可能的值,请参见前面讨论的 color 顶点参数。

默认值为 black

label.angle

顶点标签的旋转角度,以度为单位。对应于 graphics::text()srt 参数。

label.adj

一个或两个数值,给出顶点标签的水平和垂直调整。另请参见 graphics::text() 中的 adj

size.scaling

在绝对顶点大小调整 (FALSE, 默认) 和相对顶点大小调整 (TRUE) 之间切换。如果为 FALSE,则按原样使用 vertex.sizevertex.size2。如果为 TRUE,则使用 relative.size 适当地缩放两者,缩放比例为 relative.size

relative.size

最小和最大顶点相对于绘图区域的相对大小百分比。当所有顶点的大小相同时,默认情况下,在绘图中观察到的相对大小将等于 relative.size[2]。默认值为 c(.01,.025) (1\

仅当 size.scaling 为 TRUE 时使用。

边参数需要添加“edge.”前缀,当用作参数或由 igraph_options() 设置时。边参数

color

边的颜色,有关可能的值,请参见 color 顶点参数。默认情况下,此参数为 darkgrey

width

边的宽度。默认值为 1。

arrow.size

箭头的大小。默认值为 1。

arrow.width

箭头的宽度。默认值为 1。

lty

边的线型。接受的格式几乎与标准图形 graphics::par() 相同,0 和“blank”表示没有边,1 和“solid”表示实线,其他可能的值是:2 (“dashed”)、3 (“dotted”)、4 (“dotdash”)、5 (“longdash”)、6 (“twodash”)。

tkplot() 还接受标准的 Tk 线型字符串,但是它不支持“blank”线,而是使用类型“1”而不是类型“0”,即绘制实线。

rglplot() 忽略此参数。

默认值为类型 1,实线。

label

边标签。它们将被转换为字符。指定 NA 以省略边标签。

默认情况下省略边标签。

label.family

边标签的字体系列。有关详细信息,请参见具有相同名称的顶点参数。

label.font

边标签的字体。有关详细信息,请参见前面讨论的相应顶点参数。

label.cex

边标签的字体大小,有关详细信息,请参见相应的顶点参数。

label.color

边标签的颜色,有关如何指定颜色,请参见 color 顶点参数。

label.x

水平 NA 元素将被自动计算的坐标替换。如果为 NULL,则自动计算所有边的水平坐标。此参数仅受 plot.igraph 支持。

label.y

label.x 相同,但适用于垂直坐标。

curved

指定是否绘制弯曲的边。这可以是逻辑或数值向量或标量。

首先,向量被复制为与图中边的数量相同。然后,分别针对每条边解释它。数值指定边的曲率;零曲率表示直线边,负值表示边顺时针弯曲,正值表示相反方向。TRUE 表示曲率 0.5,FALSE 表示曲率零。

默认情况下,指定曲率的向量通过调用 curve_multiple() 函数来计算。此函数确保多个边弯曲并且都可见。环边忽略此参数。

默认值为 FALSE

rglplot() 当前忽略此参数。

arrow.mode

此参数可用于指定应为哪些边绘制箭头。如果用户(以三种方式中的任何一种方式)给出了此参数,则它指定哪些边将具有正向箭头、反向箭头或两者都有,或者根本没有箭头。与往常一样,此参数可以是向量或标量值。它可以是整数或字符类型。如果它是整数,则 0 表示没有箭头,1 表示反向箭头,2 表示正向箭头,3 表示两者。如果它是字符向量,则“<”和“<-”指定反向箭头,“>”和“->”指定正向箭头,“<>”和“<->”表示两个箭头。所有其他值表示没有箭头,也许您应该使用“-”或“–”来指定没有箭头。

提示:此参数可用作绘制“混合”图的“廉价”解决方案:其中一些边是有向的,一些边不是。如果您想这样做,请创建一个有向图,因为从 0.4 版本开始,可以在无向图中交换边列表中的顶点对。

默认情况下,对于无向图,不会绘制箭头,对于有向图,将根据其方向为每条边绘制箭头。这并不令人惊讶,这是预期的行为。

loop.angle

给出绘制环边的弧度角。有关如何解释此内容,请参见 label.dist 顶点参数。

默认值为 NULL。这意味着环边将自动在最大可能的间隙中绘制。

loop.angle2

给出绘制环边的第二个弧度角。这仅在 3D 中使用,2D 中 loop.angle 就足够了。

默认值为 0。

其他参数

layout

函数或数值矩阵。它指定顶点在绘图上的放置方式。

如果它是数值矩阵,则矩阵必须为每个顶点有一行,指定其坐标。矩阵应至少有两列,分别用于 xy 坐标,并且它也可以有第三列,这将是 3D 绘图的 z 坐标,对于 2D 绘图,它将被忽略。

如果为 3D 绘图函数 rglplot() 给出了两列矩阵,则假定每个顶点的第三列为 1。

如果 layout 是一个函数,则将使用 graph 作为单个参数调用此函数以确定实际坐标。该函数应返回一个具有两列或三列的矩阵。对于 2D 绘图,第三列被忽略。默认值为 layout_nicely,这是一个基于图表选择布局的智能函数。

margin

绘图下方、上方、左侧和右侧的空白量,它是长度为 4 的数值向量。通常,0 到 0.5 之间的值是有意义的,但也可以使用负值,这将使绘图放大到图表的某个部分。如果它短于 4,则会被循环使用。rglplot() 不支持此参数,因为它可以通过更灵活的方式放大和缩小图表。其默认值为 0。

palette

用于顶点颜色的调色板。默认值为 categorical_pal,这是一个对色盲友好的分类调色板。有关详细信息和其他调色板,请参见其手册页。此参数仅受 plot 支持,不受 tkplotrglplot 支持。

rescale

逻辑常量,是否将坐标重新缩放到 [-1,1]x[-1,1](x[-1,1]) 区间。tkplot 未实现此参数。默认为 TRUE,将重新缩放布局。

asp

一个数值常量,它给出了 plot()asp 参数,即纵横比。如果不想给出纵横比,请在此处提供 0。tkplotrglplot 忽略它。默认为 1。

frame

布尔值,是否在图表周围绘制框架。tkplotrglplot 忽略它。默认为 FALSE

main

主绘图的总体标题。如果 annotate.plot igraph 选项为 FALSE,则默认值为空,否则为图表的 name 属性。请参见基本 plot 函数的相同参数。仅受 plot 支持。

sub

主绘图的副标题,默认值为空。仅受 plot 支持。

xlab

x 轴的标题,如果 annotate.plot igraph 选项为 FALSE,则默认值为空,如果为 TRUE,则为顶点和边的数量。仅受 plot 支持。

ylab

y 轴的标题,默认值为空。仅受 plot 支持。

作者

Gabor Csardi csardi.gabor@gmail.com

示例

if (FALSE) { # \dontrun{

# plotting a simple ring graph, all default parameters, except the layout
g <- make_ring(10)
g$layout <- layout_in_circle
plot(g)
tkplot(g)
rglplot(g)

# plotting a random graph, set the parameters in the command arguments
g <- barabasi.game(100)
plot(g,
  layout = layout_with_fr, vertex.size = 4,
  vertex.label.dist = 0.5, vertex.color = "red", edge.arrow.size = 0.5
)

# plot a random graph, different color for each component
g <- sample_gnp(100, 1 / 100)
comps <- components(g)$membership
colbar <- rainbow(max(comps) + 1)
V(g)$color <- colbar[comps + 1]
plot(g, layout = layout_with_fr, vertex.size = 5, vertex.label = NA)

# plot communities in a graph
g <- make_full_graph(5) %du% make_full_graph(5) %du% make_full_graph(5)
g <- add_edges(g, c(1, 6, 1, 11, 6, 11))
com <- cluster_spinglass(g, spins = 5)
V(g)$color <- com$membership + 1
g <- set_graph_attr(g, "layout", layout_with_kk(g))
plot(g, vertex.label.dist = 1.5)

# draw a bunch of trees, fix layout
igraph_options(plot.layout = layout_as_tree)
plot(make_tree(20, 2))
plot(make_tree(50, 3), vertex.size = 3, vertex.label = NA)
tkplot(make_tree(50, 2, mode = "undirected"),
  vertex.size = 10,
  vertex.color = "green"
)

# use relative scaling instead of absolute
g <- make_famous_graph("Zachary")
igraph_options(plot.layout = layout_nicely)
plot(g, vertex.size = degree(g))
plot(g, vertex.size = degree(g), size.scaling = TRUE)
plot(g, vertex.size = degree(g), size.scaling = TRUE, relative.size = c(0.05, 0.1))
} # }