此手册页讨论了三个绘图函数 plot.igraph
、tkplot
和 rglplot
的共同部分。
详细信息
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.scaling
为TRUE
,则使用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.font
和label.cex
参数。如果它是基本系列(serif、sans、mono)之一,则使用 Times、Helvetica 或 Courier 字体,保证这些字体在所有系统上都存在。对于“symbol”基本系列,我们使用符号字体(如果可用),否则使用名称中带有“symbol”的第一个字体。如果该参数不是基本系列的名称,也不是命名的 Tk 字体,则我们将其传递给tcltk::tkfont.create()
,并希望用户知道她在做什么。label.font
和label.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.size
和vertex.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
函数或数值矩阵。它指定顶点在绘图上的放置方式。
如果它是数值矩阵,则矩阵必须为每个顶点有一行,指定其坐标。矩阵应至少有两列,分别用于
x
和y
坐标,并且它也可以有第三列,这将是 3D 绘图的z
坐标,对于 2D 绘图,它将被忽略。如果为 3D 绘图函数
rglplot()
给出了两列矩阵,则假定每个顶点的第三列为 1。如果
layout
是一个函数,则将使用graph
作为单个参数调用此函数以确定实际坐标。该函数应返回一个具有两列或三列的矩阵。对于 2D 绘图,第三列被忽略。默认值为layout_nicely
,这是一个基于图表选择布局的智能函数。- margin
绘图下方、上方、左侧和右侧的空白量,它是长度为 4 的数值向量。通常,0 到 0.5 之间的值是有意义的,但也可以使用负值,这将使绘图放大到图表的某个部分。如果它短于 4,则会被循环使用。
rglplot()
不支持此参数,因为它可以通过更灵活的方式放大和缩小图表。其默认值为 0。- palette
用于顶点颜色的调色板。默认值为
categorical_pal
,这是一个对色盲友好的分类调色板。有关详细信息和其他调色板,请参见其手册页。此参数仅受plot
支持,不受tkplot
和rglplot
支持。- rescale
逻辑常量,是否将坐标重新缩放到
[-1,1]x[-1,1](x[-1,1])
区间。tkplot
未实现此参数。默认为TRUE
,将重新缩放布局。- asp
一个数值常量,它给出了
plot()
的asp
参数,即纵横比。如果不想给出纵横比,请在此处提供 0。tkplot
和rglplot
忽略它。默认为 1。- frame
布尔值,是否在图表周围绘制框架。
tkplot
和rglplot
忽略它。默认为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))
} # }