我想将图的邻接矩阵绘制为棋盘格。该代码可以与使用诸如内置“ make_star”之类的功能创建的图形一起使用,但是当使用从csv文件中的邻接矩阵创建的图形时,该代码将失败。
此测试can be found here上使用的csv文件
require(igraph)
require(ggplot2)
require(reshape2)
require("igraph")
loadGraph <- function(dataPath)
{
loadedDF <- read.csv(dataPath,
header=FALSE,
sep=',', #separate by comma
quote="'", # quote by '
stringsAsFactors = FALSE,
check.names = FALSE)
#selects numeric values, drops the rest
loadedDF <- loadedDF[sapply(loadedDF, is.numeric)]
rownames(loadedDF) <- colnames(loadedDF)
loadedMat <- as.matrix(loadedDF)
#we use the rownames to index deletions
g <- graph_from_adjacency_matrix(loadedMat) %>%
set_vertex_attr("label", value = 1:nrow(loadedDF))
return(g)
}
plotAdjMatrix <- function(graphToPlot){
gAdjMatrix <- as.matrix(as_adj(graphToPlot))
logMatrix <- (gAdjMatrix == 1)
matData <- melt(logMatrix)
g <- ggplot(data = matData,
aes(Var2, Var1)) +
geom_tile(aes(fill = value,
color = value)) +
coord_equal() +
scale_fill_manual(values = c("TRUE" = "black", "FALSE" = "white")) +
scale_color_manual(values = c("TRUE" = "white", "FALSE" = "black")) +
theme_bw() +
theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank()) +
guides(fill = FALSE, color = FALSE) +
scale_y_reverse()
print(g)
}
## Test #1
g1 <- make_star(5)
# this works
plotAdjMatrix(g1)
## Test #2
g2 <- loadGraph("./data/starGraphAdjMatrix.csv")
# this fails
plotAdjMatrix(g2)
这就是g1的样子
g1
IGRAPH b93c150 D--- 5 4 -- In-star
+ attr: name (g/c), mode (g/c), center (g/n)
+ edges from b93c150:
[1] 2->1 3->1 4->1 5->1
这是g2:
> g2
IGRAPH e338cdb DN-- 5 8 --
+ attr: name (v/c), label (v/n)
+ edges from e338cdb (vertex names):
[1] V1->V2 V1->V3 V1->V4 V1->V5 V2->V1 V3->V1 V4->V1 V5->V1
考虑到这一点,我想到了将“ g2”中的顶点重命名为“ 1、2、3,...”,并尝试删除该行:
set_vertex_attr("label", value = 1:nrow(loadedDF)
无效。
答案 0 :(得分:1)
有趣的是,问题出在scale_y_reverse
中。从csv文件加载数据时,列名称为V1,...,V5,并且y
轴上的标签也是如此。然后,显然scale_y_reverse
失败了,因为它试图在将非数字值视为数字时将其反转。
解决此问题的一种方法是替换
gAdjMatrix <- as.matrix(as_adj(graphToPlot))
使用
gAdjMatrix <- unname(as.matrix(as_adj(graphToPlot)))